掘金 人工智能 04月28日 16:32
机器学习入门(八)模型评价与优化
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

本文探讨了机器学习模型中的欠拟合与过拟合现象,以及如何通过数据分离、模型评估和优化来提升模型性能。文章详细介绍了评估分类和回归模型的方法,包括准确率、精确率、召回率、F1分数、MSE、MAE、RMSE和R²等指标,并提供了代码示例。通过这些方法,可以更好地理解模型在训练集和测试集上的表现,从而进行针对性的优化。

🧐 欠拟合是指模型在训练集上表现不佳,无法捕捉数据中的规律。例如,使用线性模型拟合非线性数据。

🤯 过拟合是指模型在训练集上表现很好,但在测试集上表现差,这是因为模型过于复杂,学习了训练集的噪声。过拟合的原因包括模型结构复杂和使用了过多属性。

✅ 数据分离是将数据划分为训练集和测试集,用于模型的训练和评估。使用`train_test_split`函数可以方便地实现数据分离。

📊 模型评估是衡量模型性能的关键。分类问题常用准确率、精确率、召回率、均衡准确率和F1分数等指标;回归问题使用均方误差、平均绝对误差、均方根误差和R²等指标。

💡 模型优化主要依赖于数据处理,包括查找异常数据、对比特征数据范围、确认数据维度是否可以减少以及尝试不同的模型。

欠拟合和过拟合

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

欠拟合

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

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

过拟合

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

过拟合产生的原因:

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

解决方法:

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

小结

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

数据分离

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

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

from sklearn.model_selection import train_test_splitimport 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 分数。代码示例如下:

from sklearn.metrics import accuracy_score, precision_score, recall_score, balanced_accuracy_score, f1_scoreimport 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)MSE=1ni=1n(yiy^i)2\text{MSE}=\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^{2}对差异敏感,能反映拟合程度,值越小模型越好,但会放大较大误差
均方根误差(RMSE)RMSE=1ni=1n(yiy^i)2\text{RMSE}=\sqrt{\frac{1}{n}\sum_{i = 1}^{n}(y_{i}-\hat{y}_{i})^{2}}与数据量纲相同,便于理解误差大小,值越小模型越好
平均绝对误差(MAE)MAE=1ni=1nyiy^i\text{MAE}=\frac{1}{n}\sum_{i = 1}^{n}\vert y_{i}-\hat{y}_{i}\vert直观反映预测值偏离真实值的平均程度,对异常值敏感度低于MSE和RMSE
平均绝对百分比误差(MAPE)MAPE=1ni=1nyiy^iyi×100%\text{MAPE}=\frac{1}{n}\sum_{i = 1}^{n}\frac{\vert y_{i}-\hat{y}_{i}\vert}{y_{i}}\times100\%以百分比表示误差,便于不同量级数据比较,但真实值接近0时可能出现较大误差
R²(决定系数)R2=1i=1n(yiy^i)2i=1n(yiyˉ)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}}越接近1拟合程度越好,越接近0拟合效果越差,但可能随自变量增加而高估拟合优度

示例

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

from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_scoreimport 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}")    

模型优化

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

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

参考

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

欠拟合 过拟合 模型评估 机器学习 数据分离
相关文章