问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

如何判断一个机器学习模型的好坏?——模型评估

创作时间:
作者:
@小白创作中心

如何判断一个机器学习模型的好坏?——模型评估

引用
CSDN
1.
https://m.blog.csdn.net/bakai_manano/article/details/137756260

在机器学习领域,模型评估是确保模型性能和准确度的关键环节。本文将详细介绍模型评估的基本概念、常见问题(如过拟合和欠拟合),以及常用的评估指标。通过这些内容,读者将能够更好地理解如何判断一个机器学习模型的好坏。

一、模型评估概述

1、什么是模型评估

模型评估是指对机器学习模型进行测试和分析,以确定其在预测或分类任务中的性能和准确度。这通常涉及将模型应用于独立的测试数据集,并使用各种指标来衡量其预测结果与实际结果之间的差异。常用的评估指标包括准确率、精确率、召回率、F1 分数、ROC 曲线和 AUC(曲线下面积)。模型评估有助于确定模型的泛化能力和有效性,以及指导进一步的改进和调整。

2、过拟合、欠拟合

2.1、过拟合

什么是过拟合:过拟合指模型在训练数据上表现良好,但在未见过的测试数据上表现不佳的情况。这意味着模型过度地记住了训练数据的细节和噪声,而忽略了真实数据的整体趋势。过拟合的模型通常具有很高的方差,即对数据的微小变化非常敏感。

如何解决过拟合:增加训练数据量、使用正则化技术(如 L1 正则化、L2 正则化)、简化模型复杂度(如减少特征数量或降低多项式次数)、使用更复杂的模型(如深度学习中的神经网络)等。

2.2、欠拟合

什么是欠拟合:欠拟合指模型未能在训练数据上学习到数据的整体结构,导致在训练数据和测试数据上都表现不佳的情况。这通常发生在模型过于简单或者未能充分捕捉数据的复杂性时。欠拟合的模型通常具有较高的偏差,即对数据的整体趋势未能进行有效地拟合

如何结果欠拟合:增加特征数量、增加模型复杂度、减少正则化等。

3、模型泛化能力

模型泛化能力是指机器学习模型在未见过的新数据上的表现能力。一个具有良好泛化能力的模型能够在未知数据上取得较好的预测性能。

泛化能力是衡量模型的好坏的重要指标之一,因为我们关心的是模型如何处理新的、未见过的数据,而不仅仅是在训练数据上的表现。模型的泛化能力直接关系到模型的实用性和可靠性。

二、常见的分类模型评估指标

1、混淆矩阵

混淆矩阵(Confusion Matrix)是一种用于评估分类模型性能的表格,它对分类模型的预测结果和实际结果进行了汇总和统计。结构如下

预测为正例
预测为负例
实例为正例
真正例(TP)
假负例(FN)
实例为负例
假正例(FP)
真正例(TN)

其中 TP 和 TN 都对应着预测正确的部分,FP 和 FN 对应着预测错误的部分。所以我们期望 TP 和 TN 越大越好,而 FP 和 FN 越小越好。

2、准确率

准确率(Accuracy )是指模型正确预测的样本总数占总样本总数的比例,其计算公式为:

** Accuracy = (TP+TN)/(TP+FN+FP+TN)**

3、精确率

精确率(Precision)是衡量分类模型在预测为正例的样本中,有多少是真正正例的指标。它计算了模型在所有预测为正例的样本中,正确预测为正例的比例。其计算公式为:

** Precision = TP / (TP + FP)**

4、召回率

召回率(Recall)是衡量分类模型能够正确预测正例样本的能力指标。它计算了模型在所有真实正例样本中,成功预测为正例的比例。其计算公式为:

**Recall = TP / (TP + FN) **

5.、F1-score

F1值就是精确率和召回率的调和平均值,F1值认为精确率和召回率一样重要,尤其适合在数据不平衡(不同类别的样本数据量差异很大) 的情况时进行使用。其计算公式如下:

** F1 = 2 / (1/Precision + 1/Recall) = (2PrecisionRecall) / (Precision+Recall)**

6、ROC 曲线和 AUC

ROC 曲线以假正例率(FPR)为横轴,真正例率(TPR,即召回率)为纵轴绘制的曲线。AUC 表示 ROC 曲线下方的面积,用于评估模型的分类性能。AUC 值越大,表示模型性能越好。

FPR 的计算公式为 :

** FPR = FP / (FP+TN**)

通过ROC曲线,我们可以明确地直观地看出模型的好坏,为了模型准确率更高,我们自然而然地希望真阳性率更高而假阳性率更低,因此,当曲线越靠近左上角,我们会认定这条曲线所代表的模型判断准确率更高。

三、不同k值下的ROC曲线及分析

代码实现:

y_tes,y_pre=datingclasstest()
# 将列表转换为 NumPy 数组
y_tes = np.array(y_tes)
 
# 使用 NumPy 数组进行条件替换
y_tes[y_tes == 3] = 0
y_tes[y_tes == 2] = 0
 
# 将列表转换为 NumPy 数组
y_pre = np.array(y_pre)
 
# 使用 NumPy 数组进行条件替换
y_pre[y_pre == 3] = 0
y_pre[y_pre == 2] = 0
 
 
 
fpr, tpr, thresholds = roc_curve(y_tes, y_pre)  # 计算ROC曲线的各项指标:假正率(fpr)、真正率(tpr)和阈值(thresholds)
print(roc_auc_score(y_tes, y_pre))
# 绘制ROC曲线和Precision-Recall曲线
plt.figure(figsize=(8, 4))  # 创建一个画布
plt.subplot(121)  # 创建第一个子图用于绘制ROC曲线
plt.plot([0, 1], [0, 1], 'k--')  # 绘制对角线
plt.plot(fpr, tpr, label='ROC curve')  # 绘制ROC曲线
plt.xlim([0.0, 1.0])  # 设置x轴范围
plt.ylim([0.0, 1.05])  # 设置y轴范围
plt.xlabel('False Positive Rate')  # 设置x轴标签
plt.ylabel('True Positive Rate')  # 设置y轴标签
plt.title('Receiver operating characteristic')  # 设置标题
plt.legend(loc="lower right")  # 显示图例
plt.show()  # 显示图形  

当k=3时:

当k=6时:

当k=99时:

显然,k=6时的曲线更靠近左上角,即k=6时在这三种情况中效果最好,所以k并不是越大越好或者越小越好,而是有一个最适合的值。可以通过多次实现来寻找最适合的值的近似值来达到最好的模型效果。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号