1 机器学习三要素

机器学习方法 = 模型 + 策略 + 算法

  • 模型(model):总结数据的内在规律,用数学语言描述的参数系统
  • 策略(strategy):选取最优模型的评价准则
  • 算法(algorithm):选取最优模型的具体方法

2 机器学习方法分类

在这里插入图片描述

3 建模流程

  1. 收集数据:收集用于训练和测试的数据集,确保数据代表实际问题的不同方面
  2. 数据清洗:对数据进行清洗,去除掉脏数据和不可用的数据
  3. 特征工程:对数据进行转换和格式化,确保适合用于机器学习模型训练
  4. 选择算法:选择适合任务类型(分类、回归、聚类等)和数据特征的机器学习算法
  5. 模型训练:使用训练集数据训练模型,让模型从数据中学习规律
  6. 模型评估:使用测试集评估模型性能,确认是否达到预期效果
  7. 模型优化:确保模型有较好性能的基础上进一步提高模型效果
  8. 模型部署:将训练好的模型部署到生产环境,实时监控其表现

4 特征工程

4.1 特征工程概述

特征工程 (Feature Engineering)是机器学习过程中非常重要的一步,通过对原始数据的处理、转换和构造,生成新的特征或选择有效的特征,从而提高模型的性能。优秀的特征工程可以显著提高模型的表现,忽视特征工程可能导致模型性能欠佳。

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。

4.2 特征工程内容

4.2.1 特征选择

从原始特征中挑选出与目标变量关系最密切的特征,剔除冗余、无关或噪声特征。减少模型的复杂度、加速训练过程、并减少过拟合的风险。

特征选择不会创建新特征,也不会改变数据结构。

  • 过滤法(Filter Method):基于统计测试(如卡方检验、相关系数、信息增益等)来评估特征与目标变量之间的关系,选择最相关的特征。
  • 包裹法(Wrapper Method):使用模型(如递归特征消除 RFE)来评估特征的重要性,并根据模型的表现进行特征选择。
  • 嵌入法(Embedded Method):使用模型本身的特征选择机制(如决策树的特征重要性,L1 正则化的特征选择)来选择最重要的特征。

4.2.2 特征转换

对数据进行数学或统计处理,使其变得更加适合模型的输入要求。

  • 归一化(Normalization):将特征缩放到特定的范围(通常是 0 到 1 之间)。适用于对尺度敏感的模型(如 KNN、SVM)。
  • 标准化(Standardization):通过减去均值并除以标准差,使特征的分布具有均值 0,标准差 1。
  • 对数变换:对于有偏态的分布(如收入、价格等),对数变换可以将其转化为更接近正态分布的形式。
  • 类别(category)变量的编码
    • 独热编码 (One-Hot Encoding) :将类别型变量转换为二进制列,常用于无序类别特征,如红色、绿色、蓝色。
    • 标签编码(Label Encoding):将类别型变量映射为整数,常用于有序类别特征,如高、中、低。
    • 目标编码(Target Encoding):将类别变量的每个类别替换为其对应目标变量的平均值或其他统计量。
    • 频率编码(Frequency Encoding):将类别变量的每个类别替换为该类别在数据集中的出现频率。

4.2.3 特征构造

特征构造是基于现有的特征创造出新的、更有代表性的特征。通过组合、转换、或者聚合现有的特征,形成能够更好反映数据规律的特征。

  • 交互特征:将两个特征组合起来,形成新的特征。例如,两个特征的乘积、和或差等。
    例如,将年龄与收入结合创建新的特征,可能能更好地反映某些模式。
  • 统计特征:从原始特征中提取统计值,例如求某个时间窗口的平均值、最大值、最小值、标准差等。
    例如,在时间序列数据中,从原始数据中提取每个小时、每日的平均值。
  • 日期和时间特征:从日期时间数据中提取如星期几、月份、年份、季度等特征。
    例如,将“2000-01-01”转换为“星期几”、“是否节假日”、“月初或月末”等特征。

4.2.4 特征降维

当数据集的特征数量非常大时,特征降维可以帮助减少计算复杂度并避免过拟合。通过降维方法,可以在保持数据本质的情况下减少特征的数量。

  • 主成分分析(PCA):通过线性变换将原始特征映射到一个新的空间,使得新的特征(主成分)尽可能地保留数据的方差。
  • 线性判别分析(LDA):一种监督学习的降维方法,通过最大化类间距离与类内距离的比率来降维。
  • t 分布随机近邻嵌入(t-Distributed Stochastic Neighbor Embedding,t-SNE):一种非线性的降维技术,特别适合可视化高维数据。
  • 自编码器(Auto Encoder):一种神经网络模型,通过压缩编码器来实现数据的降维。

4.3 常用方法

对于一个模型来说,有些特征可能很关键,而有些特征可能用处不大。因此特征选择是最基本的操作。有时也会遇到维度灾难,即特征数量过多,在确保不丢失重要特征的前提下减少维度的数量,经常会用到特征降维

4.3.1 低方差过滤法

低方差意味着该特征的样本值几乎都一样,对预测影响很小,可以直接去掉。

from sklearn.feature_selection import VarianceThreshold

# 过滤掉方差低于 0.1 的特征
var_thresh = VarianceThreshold(threshold=0.1)
X_filtered = var_thresh.fit_transform(X)

4.3.2 相关系数法

通过计算特征与目标变量或特征之间的相关性,筛选出高相关性特征(与目标相关)或剔除冗余特征(特征间高度相关)。

  1. 皮尔逊相关系数 (Pearson Correlation):用于衡量两个变量的线性相关性,考察的是变量之间沿着一条直线的相似程度。

r = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 r=\frac{\sum_{i=1}^n(x_i-\bar{x})(y_i-\bar{y})}{\sqrt{\sum_{i=1}^n(x_i-\bar{x})^2}\sqrt{\sum_{i=1}^n(y_i-\bar{y})^2}} r=i=1n(xixˉ)2 i=1n(yiyˉ)2 i=1n(xixˉ)(yiyˉ)

适用于连续变量,且这些变量近似服从正态分布。如果数据不符合正态分布,或者关系不是线性的,皮尔逊相关系数可能无法准确反映变量间的关系。

取值范围[-1, 1]:

  • +1 表示完全正相关(一个变量增加,另一个也增加)
  • -1 表示完全负相关(一个变量增加,另一个减少)
  • 0 表示没有线性相关性

使用pandas.DataFrame.corrwith(method="pearson")可以计算各个特征与标签间的皮尔逊相关系数。

X.corrwith(y, method='pearson')
# sepal length (cm) 0.798078 
# sepal width (cm) -0.440290 
# petal length (cm) 0.935431 
# petal width (cm) 0.938179 
# dtype: float64

使用 pandas.DataFrame.corr(method="pearson") 计算皮尔逊相关系数矩阵。

corr_matrix = X.corr(method='pearson')
sepal length (cm)sepal width (cm)petal length (cm)petal width (cm)label
sepal length (cm)1.000000-0.1175700.8717540.8179410.782561
sepal width (cm)-0.1175701.000000-0.428440-0.366126-0.426658
petal length (cm)0.871754-0.4284401.0000000.9628650.949035
petal width (cm)0.817941-0.3661260.9628651.0000000.956547
label0.782561-0.4266580.9490350.9565471.000000

使用热力图将皮尔逊矩阵可视化。

sns.heatmap(corr_matrix, annot=True, fmt='.2f')

在这里插入图片描述

  1. 斯皮尔曼相关系数(Spearman’s Rank Correlation Coefficient):用于衡量两个变量之间的单调关系,考察的是一个变量增加时,另一个变量也倾向于增加或减少的程度,不一定是线性关系。其中 d i d_i di 是两个变量在排名时的差异, n n n 是样本大小。
    ρ = 1 − 6 ∑ i = 1 n ​ d i 2 ​ n ( n 2 − 1 ) ​ ρ=1−\frac{6\sum_{i=1}^n​d_i^2​}{n(n^2−1)}​ ρ=1n(n21)6i=1ndi2

取值范围 [-1, 1]:

  • +1 表示完全单调递增关系
  • -1 表示完全单调递减关系
  • 0 表示没有单调关系

适用于连续变量或离散变量。对数据的分布没有严格要求,即使数据不服从正态分布也可以使用。 特别适合于处理顺序数据(例如,排名)。

使用 pandas.DataFrame.corrwith(method="spearman") 计算斯皮尔曼相关系数。

X.corrwith(y, method='spearman')
# sepal length (cm)    0.798078
# sepal width (cm)    -0.440290
# petal length (cm)    0.935431
# petal width (cm)     0.938179
# dtype: float64

同样可以使用 pandas.DataFrame.corr(method="spearman") 来计算斯皮尔曼相关系数矩阵。

4.3.3 主成分分析(PCA)

主成分分析(Principal Component Analysis, PCA)是一种常用的降维技术,通过线性变换将高维数据投影到低维空间,同时保留数据的主要变化模式。

使用 sklearn.decomposition.PCA(n_components=2) 进行主成分分析。
参数n_components

  • 小数:表示保留多少比例的信息
  • 整数:表示保留多少个维度
from sklearn.decomposition import PCA

# 保留两个维度的特征
pca = PCA(n_components=2)
X_pca = pca.fit_transform(X)

可视化:

fig = plt.figure(figsize=(12, 4))

# 转换前的三维可视化
ax1 = fig.add_subplot(121, projection='3d')
ax1.scatter(X[:, 0], X[:, 1], X[:, 2])
ax1.set_title('Before PCA(3D)')
ax1.set_xlabel("Feature 1")
ax1.set_ylabel("Feature 2")
ax1.set_zlabel("Feature 3")

# 转换后的二维可视化
ax2 = fig.add_subplot(122)
ax2.scatter(X_pca[:, 0], X_pca[:, 1])
ax2.set_title('After PCA(2D)')
ax2.set_xlabel("Principal Component 1")
ax2.set_ylabel("Principal Component 2")

在这里插入图片描述

5 模型评估和选择

5.1 损失函数

预测结果 f ( X ) f(X) f(X) 和真实值 y y y 之间的存在偏差,我们使用损失函数(loss function)来度量预测偏差的程度,记作 L ( y , f ( X ) ) L(y,f(X)) L(y,f(X)),损失函数是非负实值函数,损失函数值越小,模型越好。

常见损失函数:

  • 0-1损失函数
    L ( y , f ( X ) ) = { 1 , y ≠ f ( X ) 0 , y = f ( X ) ) L(y,f(X))=\begin{cases} 1,\quad y≠f(X) \\ 0,\quad y=f(X) )\end{cases} L(y,f(X))={1,y=f(X)0,y=f(X))

  • 平方损失函数
    L ( y , f ( X ) ) = ( y − f ( X ) ) 2 L(y,f(X))=(y-f(X))^2 L(y,f(X))=(yf(X))2

  • 绝对损失函数
    L ( y , f ( X ) ) = ∣ y − f ( X ) ∣ L(y,f(X))=|y-f(X)| L(y,f(X))=yf(X)

  • 对数似然损失函数
    L ( y , F ( X ) ) = − [ y   log ⁡   p x + ( 1 − y )   log ⁡   ( 1 − p x ) ] L(y, F(X)) = -[y\,\log\,p_x + (1 - y)\,\log\,(1 - p_x)] L(y,F(X))=[ylogpx+(1y)log(1px)]
    y {y} y 是实际标签( y ∈ { 0 , 1 } {y \in \lbrace 0, 1 \rbrace} y{0,1} ,表示类别 0 或 1), p x {p_x} px 是模型预测的样本 x {x} x 属于类别 1 的概率。

5.2 经验误差

根据选取的损失函数,就可以计算出模型 f ( X ) f(X) f(X) 在训练集上的平均误差,称为训练误差,也被称作 经验误差(empirical error) 或 经验风险(empirical risk)。
R e m p = 1 n ∑ i = 1 n L ( y i , f ( x i ) ) R_{emp}= \frac{1}{n}\sum _{i=1}^nL(y_i, f(x_i)) Remp=n1i=1nL(yi,f(xi))
类似地,在测试集上的平均误差,被称为测试误差或者 泛化误差 (generalization error)

一般情况下对模型评估的策略,就是考察经验误差;当经验风险最小时,就认为取到了最优的模型。这种策略被称为 经验风险最小化(empirical risk minimization,ERM)

5.3 欠拟合和过拟合

拟合(Fitting)是指机器学习模型在训练数据上学习到规律并生成预测结果的过程。

在这里插入图片描述

过拟合(overfitting):模型在训练集上学得太好,甚至记住了噪声或偶然特征,导致在训练集表现好、测试集表现差。
欠拟合(underfitting):模型对训练数据学习不足,连训练集都拟合不好,模型太简单、能力不够,无法捕捉数据中的真实规律。

欠拟合通过增加模型复杂度、增加特征或改进特征工程、增加训练时间、减少正则化强度即可,一般来说更容易遇到、并且不易解决的问题是过拟合。

  • 过拟合产生原因:
    • 模型复杂度过高:模型过于复杂,参数过多
    • 训练数据不足:数据集太小,模型学到的细节无法泛化到新数据
    • 特征过多:模型记住了数据的噪声,而不是规律
    • 训练时间过长:模型学会了数据中的噪声,而不是规律
  • 过拟合解决方案:
    • 减少模型复杂度:降低模型参数数量,使用简化的模型或降维
    • 增加训练数据:收集更多数据增强数据多样性
    • 使用正则化:引入 L1 、L2 正则化
    • 早停:模型验证损失不再下降时,提前停止训练

5.4 正则化

正则化(Regularization)通过在损失函数中添加额外项,惩罚过大的参数,进而限制模型复杂度、避免过拟合,提高模型泛化能力。

如在平方损失函数中加入正则化:
L o s s = 1 n ( ∑ i = 1 n ( f ( x i ) − y i ) 2 + λ ∑ i = 1 k w i 2 ) Loss=\frac{1}{n}{\left(\sum_{i=1}^n(f(x_i)-y_i)^2+\lambda\sum_{i=1}^k{w_i}^2\right)} Loss=n1(i=1n(f(xi)yi)2+λi=1kwi2)
𝜆 是正则化系数,用来表示惩罚项的权重。正则化系数需在模型训练开始之前手动设置,是“超参数”。

  • 𝜆 过大:可能使模型太简单,导致欠拟合
  • 𝜆 过小:可能使模型太复杂,导致过拟合

原损失函数和正则化项相互平衡,在模型的拟合能力和复杂度之间找到最佳折中。

  • 原损失函数的目的:更好的拟合数据集
  • 正则化项的目的:减小参数的大小,从而降低模型复杂度

常见的正则化技术有 L1 正则化和 L2 正则化。

5.4.1 L1 正则化(Lasso回归)

L1 正则化在损失函数中加入参数的绝对值之和:
L o s s L 1 = 原 L o s s + λ ∑ i = 1 k ∣ w i ∣ Loss_{L1}=\text{原}Loss+\lambda\sum_{i=1}^k|w_i| LossL1=Loss+λi=1kwi
L1 正则化通过惩罚模型参数的绝对值,使得部分权重趋近 0 甚至变为 0。这会导致
征选择,即模型会自动“丢弃”一些不重要的特征。

在解决回归问题时,使用 L1 正则化也被称为“Lasso 回归”。

5.4.2 L2 正则化(Ridge回归)

L2 正则化在损失函数中加入参数的平方之和:
L o s s L 2 = 原 L o s s + λ ∑ i = 1 k w i 2 Loss_{L2}=\text{原}Loss+\lambda\sum_{i=1}^kw_i{}^2 LossL2=Loss+λi=1kwi2
L2 正则化通过惩罚模型参数的平方,使得所有参数都变得更小,但不会将参数强行压
缩为 0。它会使得模型尽量平滑,从而防止过拟合。

由于 L2 正则化平方的存在,虽然在 w i w_i wi 绝对值大于 1 时,惩罚力度更大,但是当 w i w_i wi 绝对值小于 1 时,惩罚力度变小,所以即使某个特征对模型影响很小,也不会将其权重压缩为 0。

在这里插入图片描述

在解决回归问题时,使用 L2 正则化也被称为“岭回归”。

5.4.3 ElasticNet 正则化(弹性网格回归)

ElasticNet 正则化结合了 L1 和 L2 正则化,通过调整两个正则化项的比例来取得平衡,从而同时具备稀疏性和稳定性的优点。
L o s s E l a s t i c N e t = 原 L o s s + λ ( α ∑ i = 1 n ∣ ω i ∣ + ( 1 − α ) ∑ i = 1 n ω i 2 ) Loss_{ElasticNet}=\text{原}Loss+\lambda\left(\alpha\sum_{i=1}^n|\omega_i|+(1-\alpha)\sum_{i=1}^n\omega_i^2\right) LossElasticNet=Loss+λ(αi=1nωi+(1α)i=1nωi2)
其中 α \alpha α 是控制 L1 和 L2 正则化的比例。

5.5 评估方法

5.5.1 留出法(Hold-Out)

留出法(Hold-Out Validation)将数据划分为训练集、验证集和测试集(如 70%训练,30%测试)。结果受单次划分影响较大,可能高估或低估模型性能。

5.5.2 k 折交叉验证(k-Fold CV)

交叉验证(Cross-Validation)是一种评估模型泛化能力的方法,通过将数据集划分为多个子集,反复进行训练和验证,以减少因单次数据划分带来的随机性误差。

k 折交叉验证(k-Fold Cross-Validation)将数据均匀分为 k 个子集(称为“折”),每次用 k−1 折训练,剩余 1 折验证,重复 k 次后取平均性能。充分利用数据,结果更稳定。k 一般取 10、5。

在这里插入图片描述

5.5.3 留一法(Leave-One-Out)

留一法(Leave-One-Out, LOO) 是 k-Fold 的特殊形式,每次仅留一个样本作为验证集,其余全部用于训练,重复直到所有样本都被验证一次。适用于小数据集,计算成本极高。

6 模型求解算法

模型求解其实就是寻找最优参数,让增加了正则化之后的损失函数最小化,称为结构风险最小化(Structural Risk Minimization,SRM)。
min ⁡ 1 n ( ∑ i = 1 n L ( y i , f ( x i ) ) + λ J ( θ ) ) \min\frac{1}{n}(\sum_{i=1}^nL(y_i,f(x_i))+\lambda J(\theta)) minn1(i=1nL(yi,f(xi))+λJ(θ))
这其实就是求解一个 最优化问题。代入训练集所有数据 (𝑥𝑖,𝑦𝑖),要求最小值的目标函数就是模型中参数 𝜃 的函数。

具体求解的算法,可以利用数学公式直接计算解析解,也可以使用迭代算法

6.1 解析解

通过数学公式进行严格推导得到解析解,那么就直接得到了最优模型的全部参数,这种方法称作解析法。

  • 优点:直接通过计算得到最优值,精确迅速
  • 缺点:适用条件苛刻,目标函数必须可导,且导数方程有解析解;特征维度较大时,计算复杂度极高

例如线性回归问题:通过最小二乘法得到解析解
L o s s M S E = 1 n ( X β − y ) T ( X β − y ) ∇ L o s s M S E = 2 n X T ( X β − y ) = 0 β = ( X T X ) − 1 X T y \begin{gathered} Loss_{MSE}=\frac{1}{n}(X\beta-y)^T(X\beta-y) \\ \nabla Loss_{MSE}=\frac{2}{n}X^T(X\beta-y)=0 \\ \boldsymbol{\beta}=(\boldsymbol{X}^T\boldsymbol{X})^{-1}\boldsymbol{X}^T\boldsymbol{y} \end{gathered} LossMSE=n1(y)T(y)LossMSE=n2XT(y)=0β=(XTX)1XTy

6.2 梯度下降法

6.2.1 梯度下降思想

梯度下降法(gradient descent)是迭代算法,基本思路就是先选取一个适当的初始值 Font metrics not found for font: .,然后沿着负梯度方向,不停地更新参数,最终取到极小值。

(1)初始化参数:随机选择初始参数
(2)计算梯度:在当前参数下,计算损失函数的梯度
(3)更新参数:沿负梯度方向调整参数
(4)重复迭代:直到满足停止条件(如梯度接近零、达到最大迭代次数等)

  • 梯度方向:函数变化增长最快的方向(变量沿此方向变化时函数增长最快)
  • 负梯度方向:函数变化减少最快的方向(变量沿此方向变化时函数减少最快)

沿着损失函数的负梯度方向变化,此时损失函数减少最快,能够以最快速度下降到极小值。
θ k + 1 = θ k − α ⋅ ∇ L ( θ k ) \theta_{k+1}=\theta_k-\alpha\cdot\nabla L(\theta_k) θk+1=θkαL(θk)
Font metrics not found for font: .是参数取值为 Font metrics not found for font: . 时损失函数 𝐿 的梯度; 𝛼 是每次迭代的步长,被称为学习率(learning rate),是一个常见的超参数,设置过小训练迭代过慢,设置过大不易收敛。

注意每次更新的是“x”,而不是“y”,每次“x”沿着负梯度方向移动一段距离。

梯度下降不一定能够找到全局的最优解,有可能是一个局部最优解。

  • 优点:适用性广,计算简单
  • 缺点:收敛速度慢,可能陷入局部最优解

6.2.2 梯度下降分类

  1. 批量梯度下降(Batch Gradient Descent,BGD):每次迭代使用全部训练数据计算梯度。

    • 优点:梯度方向稳定,更新平滑,收敛过程较稳定。
    • 缺点:每次都计算整个训练集,计算量大,对大数据集效率低。
  2. 随机梯度下降(Stochastic Gradient Descent,SGD):每次迭代随机选取一个样本计算梯度。

    • 优点:快速迭代,每次只用一个样本计算梯度;由于引入了随机性,有助于跳出局部最优解。
    • 缺点:每次更新方向不确定,收敛过程波动很大,甚至难以收敛,在最小值附近震荡。
  3. 小批量梯度下降(Mini-batch Gradient Descent,MBGD):每次迭代使用一小批样本(如32、64个)计算梯度。

    • 优点:计算成本相对 BGD 较低,又比 SGD 稳定,兼具 BGD 的稳定和 SGD 的速度。
    • 缺点:合适的 batch size 需要实验。

梯度下降优化扩展内容

6.3 牛顿法和拟牛顿法

牛顿法也是求解无约束最优化问题的常用方法,核心思想是利用目标函数的二阶导数信息(不需要手动指定学习率了),通过迭代逐渐逼近极值点。
θ k + 1 = θ k − H − 1 ( θ k ) ⋅ ∇ L ( θ k ) \theta_{k+1}=\theta_k-H^{-1}(\theta_k)\cdot\nabla L(\theta_k) θk+1=θkH1(θk)L(θk)
Font metrics not found for font: . 表示损失函数 L L L 黑塞矩阵的逆在点 Font metrics not found for font: . 的取值。

  • 优点:收敛速度快,精度高。
  • 缺点:计算非常复杂,可能发散。

由于牛顿法中需要计算黑塞矩阵的逆 Font metrics not found for font: .,这一步比较复杂, 所以可以考虑用一个 n n n 阶正定矩阵来近似代替它,这种方法称为“拟牛顿法”。

牛顿法和拟牛顿法一般用于解决中小规模的凸优化问题。

7 模型评估指标

模型的评估指标用于衡量模型在训练集或测试集上的性能,评估结果反映了模型预测的准确性和泛化能力。

7.1 回归模型

7.1.1 均方误差(MSE)

均方误差(Mean Squared Error, MSE):每个样本的预测值与真实值之差的平方的平均值。
M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 {MSE} = \frac{1}{n} \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 MSE=n1i=1n(yiy^i)2

MSE 对误差进行平方,因此对异常值非常敏感。MSE的值越小,说明模型的预测越精准,性能越好。

from sklearn.metrics import mean_squared_error

mean_squared_error(y_true, y_test)

7.1.2 均方根误差(RMSE)

均方根误差(Root Mean Squared Error, RMSE):均方根误差是均方误差的平方根。
R M S E = M S E = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 RMSE=\sqrt{MSE}=\sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i−\hat{y}_i)^2} RMSE=MSE =n1i=1n(yiy^i)2

RMSE 同样对大误差敏感,因为它是在 MSE 的基础上计算得到的,优势在于与目标的量纲一致。如果一味地降低 RMSE,可能会导致模型对异常值也拟合度很高,容易过拟合。

from sklearn.metrics import root_mean_squared_error

root_mean_squared_error(y_true, y_test)

7.1.3 平均绝对误差(MAE)

平均绝对误差(Mean Absolute Error, MAE):预测值与真实值差的绝对值的平均值。
M A E = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ MAE=\frac{1}{n}\sum_{i=1}^{n}|y_i-\hat{y}_i| MAE=n1i=1nyiy^i

MAE 对所有误差都给予相同的权重,因此对异常值不敏感,并且和目标量纲一致。

如果希望模型对异常值更加敏感,可以选择 MSE 或 RMSE。RMSE 比 MSE 更易于解释。
如果希望模型对异常值不敏感,可以选择 MAE。
在实际应用中,通常会同时考虑这三个指标,以便更全面地评估模型的性能。

from sklearn.metrics import mean_absolute_error

mean_absolute_error(y_true, y_test)

7.1.4 R 2 R^2 R2 决定系数

R 2 R^2 R2 决定系数:衡量模型对目标变量的解释能力,越接近 1 越好。由于分母是均方误差,所以对异常值也敏感。
R 2 = 1 − M S E V a r = 1 − ∑ i = 1 n ( f ( x i ) − y i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 R^2=1-\frac{MSE}{Var}=1-\frac{\sum_{i=1}^n(f(x_i)-y_i)^2}{\sum_{i=1}^n(y_i-\bar{y})^2} R2=1VarMSE=1i=1n(yiyˉ)2i=1n(f(xi)yi)2
决定系数右侧的所减项实际为均方误差与方差的比值。

  • 均方误差越接近 0,整体越接近 1。
  • 方差越大,说明真实数据本身规律越弱,允许的误差范围越大,整体也会越接近 1。
from sklearn.metrics import r2_score

r2_score(y_true, y_test)

7.2 分类模型

7.2.1 混淆矩阵(Confusion Matrix)

正类为 Positive §,负类为 Negative (N),总样本数 n = T P + T N + F P + F N n=TP+TN+FP+FN n=TP+TN+FP+FN。展示了模型预测结果与实际标签的对比情况,n 分类问题的混淆矩阵为 n × n n×n n×n

真实类别预测为正例预测为反例
正例 (P)真正例(True Positive, TP)假反例(False Negative, FN)
反例 (N)假正例(False Positive, FP)真反例(True Negative, TN)
from sklearn.metrics import confusion_matrix
import seaborn as sns

# 查看混淆矩阵
cm = confusion_matrix(y_ture, y_pred)

# 热力图可视化
sns.heatmap(cm, annot=True, fmt='.2f', cmap='warmcool')

7.2.2 精度(Accuracy)

预测正确的比例。
A c c u r a c y = T P + T N n ​ Accuracy=\frac{TP+TN}{n}​ Accuracy=nTP+TN

真实类别预测为正例预测为反例
正例 (P)真正例(True Positive, TP)假反例(False Negative, FN)
反例 (N)假正例(False Positive, FP)真反例(True Negative, TN)
from sklearn.metrics import accuracy_score

# 方式一
accuracy_score(y_true, y_pred)

# 方式二
model.score(X_test, y_test)

错误率(Error):预测错误的比例。
E r r o r = F P + F N n = 1 − A c c u r a c y Error=\frac{FP+FN}{n}=1−Accuracy Error=nFP+FN=1Accuracy

7.2.3 查准率(Precision)

预测为正例的样本中,真正为正的比例,衡量模型预测的准不准。
P r e c i s i o n = T P T P + F P ​ Precision=\frac{TP}{TP+FP}​ Precision=TP+FPTP

真实类别预测为正例预测为反例
正例 (P)真正例(True Positive, TP)假反例(False Negative, FN)
反例 (N)假正例(False Positive, FP)真反例(True Negative, TN)

核心特点:宁缺毋滥。
查准率高,意味着模型在说一个样本是正例时,有很高的可信度。误报代价高时更关心,比如垃圾邮件检测。

from sklearn.metrics import precision_score

precision_score(y_true, y_pred)

7.2.4 查全率/召回率(Recall)

真正的正例中,被模型判正的比例,衡量模型找得全不全。
R e c a l l = T P T P + F N Recall=\frac{TP}{TP+FN} Recall=TP+FNTP

真实类别预测为正例预测为反例
正例 (P)真正例(True Positive, TP)假反例(False Negative, FN)
反例 (N)假正例(False Positive, FP)真反例(True Negative, TN)

核心特点:宁多报不漏报。
查全率高,意味着模型能够把绝大多数的正例都找出来,很少漏掉。漏报代价高时更关心,比如病毒检测。

from sklearn.metrics import recall_score

recall_score(y_true, y_pred)

7.2.5 F1度量(F1-score)

查准率和查全率是相互制约的,需要一个综合性的指标来平衡它们,F1度量就是它们的调和平均数,同时兼顾了查准率和查全率。
1 F 1 = 1 2 ⋅ ( 1 P r e c i s i o n + 1 R e c a l l ) \frac{1}{F_1}=\frac{1}{2}·(\frac{1}{Precision}+\frac{1}{Recall}) F11=21(Precision1+Recall1)
得=>
F 1 ​ = 2 ⋅ P r e c i s i o n ⋅ R e c a l l P r e c i s i o n + R e c a l l ​ F_1​=2\cdot\frac{Precision\cdot Recall}{Precision+Recall}​ F1=2Precision+RecallPrecisionRecall

  • F-beta度量:不平衡场景可用加权的 F β F_β Fβ​ 强调召回或查准。
    F β = ( 1 + β 2 ) ⋅ P R β 2 P + R ​ F_β=(1+β^2)⋅\frac{PR}{β^2P+R}​ Fβ=(1+β2)β2P+RPR

  • β > 1 β>1 β>1 时,更看重Recall(如 F 2 ​ F_2​ F2 度量)

  • β < 1 β<1 β<1 时,更看重Precision(如 F 0.5 F_{0.5} F0.5 度量)

from sklearn.metrics import f1_score

f1_score(y_true, y_pred)

使用 sklearn 中的 classification_report 可以生成分类任务的评估报告, 可以很方便地查看精确率、召回率、F1 分数等。

classification_report(y_true, y_pred)
"""
             precision    recall    f1-score    support 
        0.0     1.00       1.00       1.00         8 
        1.0     0.92       1.00       0.96        11 
        2.0     1.00       0.91       0.95        11 
          
accuracy                              0.97        30 
macro avg       0.97       0.97       0.97        30 
weighted avg    0.97       0.97       0.97        30
"""

7.2.6 ROC曲线

  • 真正例率(TPR):实际为正例,被预测为正例的比例,即召回率。(第一行)
  • 假正例率(FPR):实际为负例,被预测为正例的比例。(第二行)
  • 阈值(Threshold):根据阈值将概率(一般是正例概率)转换为类别标签。

T P R = T P 实际正例数 = T P T P + F N F P R = F P 实际负例数 = F P F P + T N TPR=\frac{TP}{\textit{实际正例数}}=\frac{TP}{TP+FN}\qquad FPR=\frac{FP}{\textit{实际负例数}}=\frac{FP}{FP+TN} TPR=实际正例数TP=TP+FNTPFPR=实际负例数FP=FP+TNFP

真实类别预测为正例预测为反例
正例 (P)真正例(True Positive, TP)假反例(False Negative, FN)
反例 (N)假正例(False Positive, FP)真反例(True Negative, TN)

ROC 曲线(Receiver Operating Characteristic Curve,受试者工作特征)是评估二分类模型性能的工具,以假正例率(FPR)为横轴,以真正例率(TPR)为纵轴,展示不同阈值下模型的表现。绘制 ROC 曲线时,从高到低调整阈值,计算每个阈值的 TPR 和 FPR 并绘制所有阈值的点,形成 ROC 曲线。

在这里插入图片描述

中间的红色虚线是随机猜测概率,只要 ROC 曲线在虚线上方就有预测价值,当然如果在虚线下方说明能够反向预测正确,反转输出也有预测价值。

在左下角时,阈值被设定的很高(比如 0.999才预测为正例),那么模型将所有样本都预测为负例,不预测为正例就不会出错,所以 TPR 和 FPR 都很低。
阈值稍微降低,由于此时正例概率很大,TPR 提升很快,有预测就有失误,FPR 随之提升,但没有 TPR 提升快,曲线向上凸起。
当阈值继续降低,正例概率变低,将会导致更多的预测失误,FPR 增长速度超越 TPR,曲线开始向下弯曲。
右上角是另一种极端,阈值设定很低,所有样本都预测为正例,TPR 和 FPR 都很高。

7.2.7 AUC值

AUC 值代表 ROC 曲线下的面积,用于量化模型性能。AUC 值越大,模型区分正负类的能力越强,模型性能越好。AUC 值=0.5 表示模型接近随机猜测,AUC 值=1 代表完美模型。

from sklearn.metrics import roc_auc_score

# 获取正类预测概率值
y_proba = model.predict_proba(X_test)[:, 1]

# 计算 auc 值
roc_auc_score(y_test, y_proba)

绘制 ROC 曲线:

from sklearn.metrics import roc_curve, roc_auc_score
import matplotplib.pyplot as plt

# 获取正类预测概率值
y_proba = model.predict_proba(X_test)[:, 1]

# 返回 FPR, TPR, 阈值 数组
fpr, tpr, threshold = roc_curve(y_test, y_proba)

# 计算 AUC 值
roc_auc = roc_auc_score(y_test, y_proba)

# 绘制 ROC 曲线
plt.plot(fpr, tpr, label=f'ROC curve(roc_auc={roc_auc:.2f})')
plt.plot([0, 1], [0, 1], linestyle='--')
plt.xlim(0, 1)
plt.ylim(0, 1.05)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.legend(loc='lower right')

在这里插入图片描述

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐