机器学习入门(八)模型评价与优化

欠拟合和过拟合

对于训练好的模型,我们希望它在训练数据集 有很好的拟合,同时也希望它在测试集有很好的拟合结果。度量模型的这种泛化能力最直观的表示就是模型的欠拟合和过拟合。

欠拟合

欠拟合是指模型在训练集上就表现很差,没法学习到数据背后的规律。如下图所示,对于二项式结构的数据采用了线性模拟。

欠拟合可以通过观察训练数据及时发现,最后可以通过优化模型结果来解决。

过拟合

过拟合是指模型复杂度高于实际问题,模型在训练集上表现很好,但在测试集上却表现很差。模型对训练集"死记硬背"(记住了不适用于测试集的训练集性质或特点),没有理解数据背后的规律,泛化能力差。如下图所示,对于训练集(蓝色点)拟合得很好,但是对于测试集(黄色点)拟合效果就很差

过拟合产生的原因:

  1. 模型结构过于复杂(维度过高)
  2. 使用了过多属性,模型训练时包含了干扰项信息

解决方法:

  1. 简化模型结构(使用低阶模型,比如线性模型)
  2. 数据预处理,保留主成分信息(数据PCA处理
  3. 在模型训练时,增加正则化项(regularization)

小结

训练数据 预测数据
欠拟合 不准确 不准确
过拟合 准确 不准确
好模型 准确 准确

数据分离

在模型训练中,我们一般需要准备训练数据集和测试数据集。由于种种条件得限制,我们一般会把所有得数据分成训练集和测试集,而不是单独创建一个训练集合和测试集。数据分离是指对全数据进行数据分离,部分用于训练,部分用于新数据的结果预测。

在 sklearn 库中,可以直接使用 train_test_split 来实现这个效果。代码示例如下:

python 复制代码
from sklearn.model_selection import train_test_split
import numpy as np

# 生成示例数据
# 特征矩阵 X,这里生成 100 个样本,每个样本有 5 个特征
X = np.random.rand(100, 5)
# 目标向量 y,生成 100 个随机的 0 或 1 作为标签
y = np.random.randint(0, 2, 100)

# 分离数据集,test_size=0.2 表示将 20% 的数据作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 输出分离后数据集的形状
print("训练集特征形状:", X_train.shape)
print("测试集特征形状:", X_test.shape)
print("训练集标签形状:", y_train.shape)
print("测试集标签形状:", y_test.shape)

模型评估

训练完模型后,我们需要了解该模型的性能,这时就需要对模型进行评估。不同的问题评估方法不同,比如分类问题常用准确率、精确率、召回率和F1分数等指标;回归问题则使用均方误差、平均绝对误差等指标。

分类问题指标

如上图所示,分类问题指标主要有五个,分别是准确率(Accuracy)、精确率(Precision)、召回率(Recall)、均衡准确率(balanced accuracy)和F1分数(F1 Score)

指标名称 定义 计算公式 特点
准确率(Accuracy) 分类模型正确预测的样本数占总样本数的比例 正确预测的样本数 / 总样本数 直观反映模型整体性能,在类别不平衡数据集上可能有误导性
精确率(Precision) 预测为正类的样本中,真正正类的样本数占预测为正类样本数的比例 真正正类的样本数 / 预测为正类的样本数 衡量模型识别正类时的准确性,误判较少
召回率(Recall) 实际正类的样本中,被正确预测为正类的样本数占实际正类样本数的比例 真正正类的样本数 / 实际正类的样本数 衡量模型找到所有正类样本的能力,漏判较少
均衡准确率(Balanced Accuracy) 先分别计算每个类别的召回率,然后取平均值 各类别召回率平均值,(n)为类别数 更公平评估类别不平衡数据上模型性能,反映模型对各分类别的分类能力
F1 分数(F1 Score) 精确率和召回率的调和平均数 2× 精确率 × 召回率 / (精确率 + 召回率) 综合考虑精确率和召回率,在两者间取得平衡,取值 0 到 1,越接近 1 性能越好

使用示例如下图所示:

示例

sklearn库中,有现成的函数可以方便地计算准确率、精确率、召回率、均衡准确率和 F1 分数。代码示例如下:

ini 复制代码
from sklearn.metrics import accuracy_score, precision_score, recall_score, balanced_accuracy_score, f1_score
import numpy as np

# 示例的真实标签和预测标签
y_true = np.array([0, 1, 1, 0, 1, 0])
y_pred = np.array([0, 1, 0, 0, 1, 1])

# 计算准确率
accuracy = accuracy_score(y_true, y_pred)
print(f"准确率: {accuracy}")

# 计算精确率
precision = precision_score(y_true, y_pred)
print(f"精确率: {precision}")

# 计算召回率
recall = recall_score(y_true, y_pred)
print(f"召回率: {recall}")

# 计算均衡准确率
balanced_accuracy = balanced_accuracy_score(y_true, y_pred)
print(f"均衡准确率: {balanced_accuracy}")

# 计算 F1 分数
f1 = f1_score(y_true, y_pred)
print(f"F1 分数: {f1}")

回归问题指标

回归问题中,常见的评估指标有均方误差(MSE)、平均绝对误差(MAE)、均方根误差(RMSE)、R²(决定系数)

评估指标 公式 特点
均方误差(MSE) <math xmlns="http://www.w3.org/1998/Math/MathML"> MSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{MSE}=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^{2} </math>MSE=n1∑i=1n(yi−y^i)2 对差异敏感,能反映拟合程度,值越小模型越好,但会放大较大误差
均方根误差(RMSE) <math xmlns="http://www.w3.org/1998/Math/MathML"> RMSE = 1 n ∑ i = 1 n ( y i − y ^ i ) 2 \text{RMSE}=\sqrt{\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^{2}} </math>RMSE=n1∑i=1n(yi−y^i)2 与数据量纲相同,便于理解误差大小,值越小模型越好
平均绝对误差(MAE) <math xmlns="http://www.w3.org/1998/Math/MathML"> MAE = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ \text{MAE}=\frac{1}{n}\sum_{i = 1}^{n}\vert y_{i}-\hat{y}_{i}\vert </math>MAE=n1∑i=1n∣yi−y^i∣ 直观反映预测值偏离真实值的平均程度,对异常值敏感度低于MSE和RMSE
平均绝对百分比误差(MAPE) <math xmlns="http://www.w3.org/1998/Math/MathML"> MAPE = 1 n ∑ i = 1 n ∣ y i − y ^ i ∣ y i × 100 % \text{MAPE}=\frac{1}{n}\sum_{i = 1}^{n}\frac{\vert y_{i}-\hat{y}{i}\vert}{y{i}}\times100\% </math>MAPE=n1∑i=1nyi∣yi−y^i∣×100% 以百分比表示误差,便于不同量级数据比较,但真实值接近0时可能出现较大误差
R²(决定系数) <math xmlns="http://www.w3.org/1998/Math/MathML"> R 2 = 1 − ∑ i = 1 n ( y i − y ^ i ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 \text{R}^2 = 1 - \frac{\sum_{i = 1}^{n}(y_{i}-\hat{y}{i})^{2}}{\sum{i = 1}^{n}(y_{i}-\bar{y})^{2}} </math>R2=1−∑i=1n(yi−yˉ)2∑i=1n(yi−y^i)2 越接近1拟合程度越好,越接近0拟合效果越差,但可能随自变量增加而高估拟合优度

示例

在sklearn中可以使用相应的函数来计算均方误差(MSE)、平均绝对误差(MAE)、均方根误差(RMSE)、R²(决定系数),代码示例如下

python 复制代码
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
import numpy as np

# 示例的真实值和预测值
y_true = np.array([3, -0.5, 2, 7])
y_pred = np.array([2.5, 0.0, 2, 8])

# 计算均方误差(MSE)
mse = mean_squared_error(y_true, y_pred)
print(f"均方误差(MSE): {mse}")

# 计算平均绝对误差(MAE)
mae = mean_absolute_error(y_true, y_pred)
print(f"平均绝对误差(MAE): {mae}")

# 计算均方根误差(RMSE)
rmse = np.sqrt(mse)
print(f"均方根误差(RMSE): {rmse}")

# 计算 R²(决定系数)
r2 = r2_score(y_true, y_pred)
print(f"R²(决定系数): {r2}")
    

模型优化

在机器学习中,数据质量决定模型表现得上限。因此模型得优化主要在处理数据上面。常见得模型优化方法有:

  1. 查找异常数据
  2. 对比各特征数据范围
  3. 确认数据维度是否可以减少
  4. 尝试不同的模型

参考

相关推荐
信息快讯3 小时前
【机器学习驱动的智能化电池管理技术与应用】
人工智能·机器学习
硅谷秋水6 小时前
π0.5:带开放世界泛化的视觉-语言-动作模型
人工智能·机器学习·计算机视觉·语言模型
搏博6 小时前
机器学习之三:归纳学习
人工智能·深度学习·学习·机器学习
小墙程序员9 小时前
机器学习入门(七)PCA
机器学习
伊织code9 小时前
SKLearn - Biclustering
机器学习·支持向量机·聚类·sklearn·biclustering
搏博10 小时前
专家系统的基本概念解析——基于《人工智能原理与方法》的深度拓展
人工智能·python·深度学习·算法·机器学习·概率论
yzx99101310 小时前
决策树随机深林
人工智能·python·算法·决策树·机器学习
winner888110 小时前
论文解读:迁移学习(A Survey on Transfer Learning)
人工智能·机器学习·迁移学习