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
版权声明:本文标题:认真聊AI 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://it.en369.cn/jiaocheng/1748301792a2282349.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论