admin管理员组

文章数量:1037775

认真聊AI

原创内容

No.731

认真聊AI | 机器学习

好久没更新这个系列了,没忘,这就来了~

图片由海艺AI绘制

“机器学习”这个词,想必能读到这篇文章的朋友们都不陌生。

然而,到底什么是机器学习,时至今日也很难给出一个确切的、公认的定义。不过好在这个词本身的字面意思就是一个还算不错的概念:让机器能够像人一样具有学习能力。

机器学习致力于研究如何通过计算的手段,利用经验改善系统自身的性能。其根本任务是数据的智能分析与建模,进而从数据里面挖掘出有用的价值。

机器学习就和教育小朋友是一样的,一开始的时候,不断重复一些很简单的字词,后来小朋友就学会了说话。再后来小朋友学会了认字就可以自己去学习更多的知识了。

与我而言,机器学习是各种和AI相关的技术中最熟悉的。机器学习本身就是介于统计学和计算机之间的,这两者都是我们做数分每天都要接触的东西。比如KNN,在很多数分场景中还是有用到的。

因为相对熟悉,就不废话那么多了,直接来讲干货。机器学习分为这么几种:

所谓的监督不监督,说得俗一点就是人工干预得程度有多大。

有监督就是就像是有一个老师在监督学习过程。我们给计算机提供一些带有标签的数据,也就是告诉它每个数据的正确答案是什么。计算机通过这些带标签的数据学习规律,然后用这些规律来预测新的数据。

有几个平时数分的工作还是经常用到的,就稍微多讲一些,其他的就简单略过了。

KNN算法(K近邻算法)

KNN算法是最简单的机器学习分类算法之一,简单来说,其核心就是排队:

给定训练集,对于待分类的样本点,计算待预测样本和训练集中所有数据点的距离,将距离从小到大取K个,哪个类别中在前K个数据点的数量最多,就认为带预测的样本属于该类别。

KNN的缺点也非常明显,那就是对K非常敏感,在实操的过程中如何设置K才是合理的堪称玄学。此外,这种算法的计算量非常大,因为每次分类都要计算未知数据和所有训练样本的距离,尤其在遇到训练集很大的时候很不好用,实战中使用也比较少。

核心原理

对于一个待预测的新样本,KNN通过以下步骤进行预测:

1. 计算该样本与训练集中所有样本的距离(如欧氏距离、曼哈顿距离)。

2. 找出距离最近的K个邻居(K为超参数)。

3. 根据这K个邻居的标签进行投票(分类任务)或取平均值(回归任务)。

关键参数与细节

K值选择

- K较小(如K=1):模型更敏感,容易过拟合(对噪声敏感)。

- K较大:模型更平滑,可能欠拟合(忽略局部特征)。

- 通常通过交叉验证选择最优K值。

距离度量

- 欧氏距离(Euclidean Distance):最常用,适用于连续特征。

- 曼哈顿距离(Manhattan Distance):适用于高维稀疏数据。

- 余弦相似度(Cosine Similarity):适用于文本、图像等高维数据。

特征标准化:

- KNN对特征尺度敏感,需对数据做归一化(如Min-Max)或标准化(Z-Score)。

因为日常还比较常用,这里给出一个Python的代码示例(反正就是sklearn解决一切问题):

代码语言:javascript代码运行次数:0运行复制
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 数据预处理
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 训练模型
knn = KNeighborsClassifier(n_neighbors=5, metric='euclidean')
knn.fit(X_train, y_train)

# 预测与评估
accuracy = knn.score(X_test, y_test)
print(f"准确率: {accuracy:.2f}")

决策树

决策树是一种常用的机器学习算法,属于监督学习,广泛应用于分类和回归任务。它通过树状结构对数据进行建模,模拟人类在决策时的“分步判断”过程,具有直观、可解释性强的特点,所以平时用得也比较多。

当然,虽然便于理解,但缺点是容易过拟合,实际使用的过程中决策树的变体如随机森林、梯度提升树等使用的场景还是很广泛的。

核心思想

1. 树形结构:

决策树由节点(Node)和(Edge)组成,包括:

- 根节点:初始判断条件(第一个特征)。

- 内部节点(分支节点):中间决策步骤(基于特征的判断)。

- 叶节点:最终的分类或回归结果。

2. 递归分裂:

通过不断选择最优特征对数据集进行划分,生成子节点,直到满足停止条件(如样本纯净或达到最大深度)。

构建过程

1. 特征选择

选择对分类/回归最有区分度的特征作为当前节点的分裂标准。常用指标:

-信息增益(ID3算法):基于信息熵减少的程度。

-信息增益率(C4.5算法):解决信息增益对多值特征的偏好。

- 基尼不纯度(CART算法):衡量数据集的不纯度,值越小样本越纯。

2. 节点分裂

根据特征的取值(离散值)或阈值(连续值)将数据集划分为子集。

3. 停止条件

- 当前节点样本全属于同一类别(纯度100%)。

- 特征已用完,或达到预设的树深度、最小样本数等。

- 进一步分裂无法显著提升模型性能。

4. 剪枝(Pruning)

为防止过拟合,对生成的树进行简化:

- 预剪枝:在树生长过程中提前终止。

- 后剪枝:生成完整树后,自底向上剪枝。

这里继续给到Python的示例代码,还是遇事不决Sklearn解决问题系列:

代码语言:javascript代码运行次数:0运行复制
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2)

# 训练模型
clf = DecisionTreeClassifier(max_depth=3)
clf.fit(X_train, y_train)

# 评估
print("准确率:", clf.score(X_test, y_test))

# 可视化(需安装graphviz)
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plt.figure(figsize=(12,8))
plot_tree(clf, feature_names=data.feature_names, class_names=data.target_names, filled=True)
plt.show()

支持向量机SVM

支持向量机(Support Vector Machine,SVM)是一种强大的监督学习模型,广泛应用于分类和回归任务,尤其在分类问题中表现突出。

SVM的核心目标是找到一个超平面,将不同类别的数据分开,并最大化两类数据到超平面的最小距离(即间隔)。最优超平面由距离最近的样本点(称为支持向量)决定,这些点直接影响到最终的分类决策。

数学原理相对来说比较复杂:

反正我自己是没把数学原理这一部分搞得太清楚,但是基本还是能理解超平面这么个东西的,所以就不瞎说了,主打一个Python能跑就行。

总之,SVM在处理高维数据表现优异,适合特征数多于样本数的情况。但是大规模数据训练速度慢,内存消耗大。

线性SVM也算是Python数据分析入门必知必会的内容之一了,鸢尾花模型的代码我也放出来:

代码语言:javascript代码运行次数:0运行复制
# 导入必要库
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集(仅取前两个特征和两个类别简化问题)
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只使用萼片长度和宽度
y = iris.target
X = X[y != 2]  # 仅保留类别0和1(二分类问题)
y = y[y != 2]

# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建线性SVM模型
model = SVC(kernel='linear', C=1.0)
model.fit(X_train, y_train)

# 预测并评估准确率
y_pred = model.predict(X_test)
print(f"测试集准确率: {accuracy_score(y_test, y_pred):.2f}")

# 可视化决策边界和支持向量
def plot_decision_boundary(model, X, y):
    # 生成网格点
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                         np.arange(y_min, y_max, 0.02))
    
    # 预测网格点类别
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    
    # 绘制决策边界和数据点
    plt.contourf(xx, yy, Z, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o', s=50)
    plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1],
                s=100, facecolors='none', edgecolors='r', linewidths=1.5)
    plt.xlabel('萼片长度(标准化)')
    plt.ylabel('萼片宽度(标准化)')
    plt.title('SVM决策边界与支持向量')

plot_decision_boundary(model, X_train, y_train)
plt.show()

K-meas算法

聚类是无监督学习里最重要的一种算法了,主要用于将数据划分为 K 个互不相交的簇(cluster),使得同一簇内的数据点尽可能相似,不同簇之间的数据点尽可能不同。

算法步骤

1.初始化

随机选择 K 个数据点作为初始簇中心(质心)。

2.分配数据点

对每个数据点,计算其到所有质心的距离(通常用欧氏距离),将其分配到距离最近的质心对应的簇。

3.更新质心

重新计算每个簇的质心(即簇内所有数据点的均值)。

4.迭代

重复步骤 2 和 3,直到满足停止条件(质心变化小于阈值或达到最大迭代次数)。

关键细节

距离度量:

通常使用欧氏距离,但对高维数据或非球形簇可能效果不佳。

K 值选择:

需预先指定 K,常用方法包括肘部法则(Elbow Method)、轮廓系数(Silhouette Score)等。

初始质心敏感:

不同初始质心可能导致不同结果,可通过多次运行取最优解,或使用改进算法(如 K-Means++)。

优点是简单高效,缺点是需要预先指定K值,指定得K值不对有可能对最终的问题有较大的影响。

代码示例也是直接放出来:

代码语言:javascript代码运行次数:0运行复制
from sklearn.cluster import KMeans
import numpy as np

# 生成示例数据
X = np.random.rand(100, 2)

# 训练模型
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)

# 获取结果
labels = kmeans.labels_  # 每个数据点的簇标签
centroids = kmeans.cluster_centers_  # 最终质心

虽然这个系列是原本是要对这些和AI相关的技术和算法做一个概览式的介绍,但是机器学习相关的内容和数分的日常工作还是比较贴近的,就稍微多讲一些细节了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-12,如有侵权请联系 cloudcommunity@tencent 删除决策树模型数据算法机器学习

认真聊AI

原创内容

No.731

认真聊AI | 机器学习

好久没更新这个系列了,没忘,这就来了~

图片由海艺AI绘制

“机器学习”这个词,想必能读到这篇文章的朋友们都不陌生。

然而,到底什么是机器学习,时至今日也很难给出一个确切的、公认的定义。不过好在这个词本身的字面意思就是一个还算不错的概念:让机器能够像人一样具有学习能力。

机器学习致力于研究如何通过计算的手段,利用经验改善系统自身的性能。其根本任务是数据的智能分析与建模,进而从数据里面挖掘出有用的价值。

机器学习就和教育小朋友是一样的,一开始的时候,不断重复一些很简单的字词,后来小朋友就学会了说话。再后来小朋友学会了认字就可以自己去学习更多的知识了。

与我而言,机器学习是各种和AI相关的技术中最熟悉的。机器学习本身就是介于统计学和计算机之间的,这两者都是我们做数分每天都要接触的东西。比如KNN,在很多数分场景中还是有用到的。

因为相对熟悉,就不废话那么多了,直接来讲干货。机器学习分为这么几种:

所谓的监督不监督,说得俗一点就是人工干预得程度有多大。

有监督就是就像是有一个老师在监督学习过程。我们给计算机提供一些带有标签的数据,也就是告诉它每个数据的正确答案是什么。计算机通过这些带标签的数据学习规律,然后用这些规律来预测新的数据。

有几个平时数分的工作还是经常用到的,就稍微多讲一些,其他的就简单略过了。

KNN算法(K近邻算法)

KNN算法是最简单的机器学习分类算法之一,简单来说,其核心就是排队:

给定训练集,对于待分类的样本点,计算待预测样本和训练集中所有数据点的距离,将距离从小到大取K个,哪个类别中在前K个数据点的数量最多,就认为带预测的样本属于该类别。

KNN的缺点也非常明显,那就是对K非常敏感,在实操的过程中如何设置K才是合理的堪称玄学。此外,这种算法的计算量非常大,因为每次分类都要计算未知数据和所有训练样本的距离,尤其在遇到训练集很大的时候很不好用,实战中使用也比较少。

核心原理

对于一个待预测的新样本,KNN通过以下步骤进行预测:

1. 计算该样本与训练集中所有样本的距离(如欧氏距离、曼哈顿距离)。

2. 找出距离最近的K个邻居(K为超参数)。

3. 根据这K个邻居的标签进行投票(分类任务)或取平均值(回归任务)。

关键参数与细节

K值选择

- K较小(如K=1):模型更敏感,容易过拟合(对噪声敏感)。

- K较大:模型更平滑,可能欠拟合(忽略局部特征)。

- 通常通过交叉验证选择最优K值。

距离度量

- 欧氏距离(Euclidean Distance):最常用,适用于连续特征。

- 曼哈顿距离(Manhattan Distance):适用于高维稀疏数据。

- 余弦相似度(Cosine Similarity):适用于文本、图像等高维数据。

特征标准化:

- KNN对特征尺度敏感,需对数据做归一化(如Min-Max)或标准化(Z-Score)。

因为日常还比较常用,这里给出一个Python的代码示例(反正就是sklearn解决一切问题):

代码语言:javascript代码运行次数:0运行复制
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split

# 数据预处理
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 训练模型
knn = KNeighborsClassifier(n_neighbors=5, metric='euclidean')
knn.fit(X_train, y_train)

# 预测与评估
accuracy = knn.score(X_test, y_test)
print(f"准确率: {accuracy:.2f}")

决策树

决策树是一种常用的机器学习算法,属于监督学习,广泛应用于分类和回归任务。它通过树状结构对数据进行建模,模拟人类在决策时的“分步判断”过程,具有直观、可解释性强的特点,所以平时用得也比较多。

当然,虽然便于理解,但缺点是容易过拟合,实际使用的过程中决策树的变体如随机森林、梯度提升树等使用的场景还是很广泛的。

核心思想

1. 树形结构:

决策树由节点(Node)和(Edge)组成,包括:

- 根节点:初始判断条件(第一个特征)。

- 内部节点(分支节点):中间决策步骤(基于特征的判断)。

- 叶节点:最终的分类或回归结果。

2. 递归分裂:

通过不断选择最优特征对数据集进行划分,生成子节点,直到满足停止条件(如样本纯净或达到最大深度)。

构建过程

1. 特征选择

选择对分类/回归最有区分度的特征作为当前节点的分裂标准。常用指标:

-信息增益(ID3算法):基于信息熵减少的程度。

-信息增益率(C4.5算法):解决信息增益对多值特征的偏好。

- 基尼不纯度(CART算法):衡量数据集的不纯度,值越小样本越纯。

2. 节点分裂

根据特征的取值(离散值)或阈值(连续值)将数据集划分为子集。

3. 停止条件

- 当前节点样本全属于同一类别(纯度100%)。

- 特征已用完,或达到预设的树深度、最小样本数等。

- 进一步分裂无法显著提升模型性能。

4. 剪枝(Pruning)

为防止过拟合,对生成的树进行简化:

- 预剪枝:在树生长过程中提前终止。

- 后剪枝:生成完整树后,自底向上剪枝。

这里继续给到Python的示例代码,还是遇事不决Sklearn解决问题系列:

代码语言:javascript代码运行次数:0运行复制
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载数据
data = load_iris()
X_train, X_test, y_train, y_test = train_test_split(data.data, data.target, test_size=0.2)

# 训练模型
clf = DecisionTreeClassifier(max_depth=3)
clf.fit(X_train, y_train)

# 评估
print("准确率:", clf.score(X_test, y_test))

# 可视化(需安装graphviz)
from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plt.figure(figsize=(12,8))
plot_tree(clf, feature_names=data.feature_names, class_names=data.target_names, filled=True)
plt.show()

支持向量机SVM

支持向量机(Support Vector Machine,SVM)是一种强大的监督学习模型,广泛应用于分类和回归任务,尤其在分类问题中表现突出。

SVM的核心目标是找到一个超平面,将不同类别的数据分开,并最大化两类数据到超平面的最小距离(即间隔)。最优超平面由距离最近的样本点(称为支持向量)决定,这些点直接影响到最终的分类决策。

数学原理相对来说比较复杂:

反正我自己是没把数学原理这一部分搞得太清楚,但是基本还是能理解超平面这么个东西的,所以就不瞎说了,主打一个Python能跑就行。

总之,SVM在处理高维数据表现优异,适合特征数多于样本数的情况。但是大规模数据训练速度慢,内存消耗大。

线性SVM也算是Python数据分析入门必知必会的内容之一了,鸢尾花模型的代码我也放出来:

代码语言:javascript代码运行次数:0运行复制
# 导入必要库
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集(仅取前两个特征和两个类别简化问题)
iris = datasets.load_iris()
X = iris.data[:, :2]  # 只使用萼片长度和宽度
y = iris.target
X = X[y != 2]  # 仅保留类别0和1(二分类问题)
y = y[y != 2]

# 数据标准化
scaler = StandardScaler()
X = scaler.fit_transform(X)

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建线性SVM模型
model = SVC(kernel='linear', C=1.0)
model.fit(X_train, y_train)

# 预测并评估准确率
y_pred = model.predict(X_test)
print(f"测试集准确率: {accuracy_score(y_test, y_pred):.2f}")

# 可视化决策边界和支持向量
def plot_decision_boundary(model, X, y):
    # 生成网格点
    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
                         np.arange(y_min, y_max, 0.02))
    
    # 预测网格点类别
    Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    
    # 绘制决策边界和数据点
    plt.contourf(xx, yy, Z, alpha=0.8)
    plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', marker='o', s=50)
    plt.scatter(model.support_vectors_[:, 0], model.support_vectors_[:, 1],
                s=100, facecolors='none', edgecolors='r', linewidths=1.5)
    plt.xlabel('萼片长度(标准化)')
    plt.ylabel('萼片宽度(标准化)')
    plt.title('SVM决策边界与支持向量')

plot_decision_boundary(model, X_train, y_train)
plt.show()

K-meas算法

聚类是无监督学习里最重要的一种算法了,主要用于将数据划分为 K 个互不相交的簇(cluster),使得同一簇内的数据点尽可能相似,不同簇之间的数据点尽可能不同。

算法步骤

1.初始化

随机选择 K 个数据点作为初始簇中心(质心)。

2.分配数据点

对每个数据点,计算其到所有质心的距离(通常用欧氏距离),将其分配到距离最近的质心对应的簇。

3.更新质心

重新计算每个簇的质心(即簇内所有数据点的均值)。

4.迭代

重复步骤 2 和 3,直到满足停止条件(质心变化小于阈值或达到最大迭代次数)。

关键细节

距离度量:

通常使用欧氏距离,但对高维数据或非球形簇可能效果不佳。

K 值选择:

需预先指定 K,常用方法包括肘部法则(Elbow Method)、轮廓系数(Silhouette Score)等。

初始质心敏感:

不同初始质心可能导致不同结果,可通过多次运行取最优解,或使用改进算法(如 K-Means++)。

优点是简单高效,缺点是需要预先指定K值,指定得K值不对有可能对最终的问题有较大的影响。

代码示例也是直接放出来:

代码语言:javascript代码运行次数:0运行复制
from sklearn.cluster import KMeans
import numpy as np

# 生成示例数据
X = np.random.rand(100, 2)

# 训练模型
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)

# 获取结果
labels = kmeans.labels_  # 每个数据点的簇标签
centroids = kmeans.cluster_centers_  # 最终质心

虽然这个系列是原本是要对这些和AI相关的技术和算法做一个概览式的介绍,但是机器学习相关的内容和数分的日常工作还是比较贴近的,就稍微多讲一些细节了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。原始发表:2025-03-12,如有侵权请联系 cloudcommunity@tencent 删除决策树模型数据算法机器学习

本文标签: 认真聊AI