1 概述
1.1 定义
人工智能(AI)模型评估是一个关键的过程,用于确定模型在特定任务上的性能和有效性。这个过程涉及使用各种技术和指标来衡量模型的准确度、可靠性、泛化能力以及其他重要特性。在不同的应用场景中,模型评估的具体细节和重点可能会有所不同,但总体目标是确保模型能够满足预定的标准和实际需求。
1.2 重要性
模型评估在机器学习和人工智能领域扮演着至关重要的角色。模型评估是确保机器学习模型在实际应用中有效、可靠且符合预期的关键步骤。它不仅帮助开发者理解和改进模型,还为最终用户提供了信心和保证。在模型开发的整个生命周期中,持续和全面的评估对于实现高质量的AI解决方案至关重要。主要表现在以下几个方面:
1.2.1 确保准确性和可靠性
-
性能验证: 模型评估是验证模型在给定任务上表现如何的关键过程。通过评估,可以确定模型是否能够准确地做出预测或分类。
-
错误和偏差识别: 通过评估,可以发现模型在特定类型的数据或情境中的弱点,如过拟合或欠拟合,以及偏差的存在。
1.2.2 促进模型优化
-
改进指导: 模型评估提供了关于如何改进模型的具体见解,例如调整模型参数或数据处理方法。
-
迭代开发: 评估结果是迭代开发过程中不可或缺的部分,帮助开发者在每个迭代阶段优化模型。
1.2.3 确保实际应用的有效性
-
现实世界适用性: 评估帮助确定模型是否能够在实际应用中有效工作,特别是在面对现实世界复杂和不可预测的数据时。
-
风险管理: 在关键领域(如医疗、金融)部署模型前,评估可以帮助识别和缓解潜在的风险。
1.2.4 优化资源分配
-
性能与资源的平衡: 评估可以揭示模型性能与所需计算资源之间的平衡点,有助于更高效地分配资源。
-
部署决策: 模型评估结果对于决定是否部署模型、何时部署以及如何部署至关重要。
1.3 评估步骤
模型评估是一个系统且多阶段的过程,旨在全面理解模型的性能并指导未来的改进。这个过程不仅包括定量的性能评估,还包括对模型错误模式的定性分析。通过这些步骤,可以确保模型的准确性、鲁棒性和泛化能力。有效的模型评估通常包括以下步骤:
1.3.1 数据准备
-
分割数据集: 将数据分为训练集、验证集和测试集。训练集用于模型学习,验证集用于调整模型参数,测试集用于最终评估。
-
确保数据代表性: 确保所有数据子集都能代表整个数据的分布,以避免评估偏差。
1.3.2 选择评估指标
-
准确性指标: 如准确率、召回率、精确率、F1分数等,这些指标用于衡量分类模型的性能。
-
误差指标: 如均方误差(MSE)、平均绝对误差(MAE)等,用于回归模型。
-
其他指标: 如AUC-ROC曲线、混淆矩阵等,根据具体应用选择适合的评估指标。
1.2.3 进行基线测试
-
建立基线模型: 在更复杂的模型训练之前,先用一个简单的模型(如线性模型)建立性能基线。
-
比较性能: 将后续模型的性能与基线模型进行比较,以评估改进的程度。
1.2.4 训练模型与交叉验证
-
交叉验证: 使用交叉验证方法(如k折交叉验证)来评估模型在不同数据子集上的稳定性和泛化能力。
-
记录性能: 在每次验证过程中记录模型的性能指标。
1.2.5 调整模型参数
-
参数调优: 根据验证集上的表现调整模型参数,如学习率、正则化系数等。
-
使用网格搜索或随机搜索: 自动化参数选择过程以找到最佳参数组合。
1.2.6 最终评估
-
使用测试集: 在最终的测试集上评估模型性能,以得到模型在未见数据上的表现。
-
避免数据泄露: 确保在此过程中不会用到任何训练或验证数据。
1.2.7 误差分析
-
分析错误: 检查模型在哪些类型的数据上出错,以及错误的可能原因。
-
调整模型或数据: 根据误差分析结果进行模型调整或数据预处理的改进。
1.2.8 模型迭代
- 持续改进: 根据评估结果持续优化模型。
2 评估指标
对机器学习的泛化性能进行评估,不仅需要有效可行的实验估计方法还需要有衡量模型泛化能力的评价标准,这就是性能度量(performance measure),性能度量反映了任务需求,在对比不同的模型时,使用不同的性能度量往往会导致不同的评判结果;这意味着模型的好坏是相对的,不仅取决于算法和数据,还取决于任务需求。
在评估学习器的性能通常是把预测结果和数据的真实标签进行比较。(下文中把预测值记为 ),下面介绍几种常见的评估指标。
2.1 回归问题的评估指标
2.1.1 平均绝对误差(MAE)
MAE = np.average(np.abs(y_true-y_pre))
2.1.2 均方误差(MSE)
MSE = np.average((y_true-y_pre)**2)
2.1.3 均方根误差(RMSE)
np.sqrt(np.average((y_true-y_pre)**2))
-
MAE,MSE,RMSE的取值范围都是从 0 0 0到 ∞ \infin ∞
-
MAE 和 RMSE的单位与预测目标的单位一致,但MSE的单位不同
-
MAE,MSE,RMSE的值越小,预测的效果越好
-
RMSE对离群点更加敏感
-
MAE对离群点更鲁棒(「Robust」,即一个系统或组织有抵御或克服不利条件的能力)
2.1.4 R方系数
-
系数反映了预测值和实际值之间的符合程度,其值为1时,说明完美拟合,其值为0时,说明拟合的为目标的平均值
-
可能为负数,此时说明预测结果较真值而言过大
2.2 分类问题的评估指标
2.2.1 错误率和精度
-
错误率:分错样本占样本总数的比例
-
精度:分对样本占样本总数的比例
2.2.2 混淆矩阵(二分类度量指标)
- TN: True Negative
- TP: True positive
- FP: False positive
- FN: False negative
Precision 和Recall的侧重点不同,Precison侧重于降低FP的比例,所以注重精度,宁可漏掉,不可错杀,而Recall中与降低FN的比例,所以注重查全率,宁可错杀,不可漏掉。
2.2.3 F1-score
F1-score是Precison和Recall的谐波均值,可以综合考量查准率和查全率
2.2.4 PR曲线
在很多情况下,我们可根据学习器的预测结果对样例进行排序,排在最前面的是学习器最可能认为是正例的样本,排在最后面的则是认为最不可能是正例的样本。按此顺序逐个把样本作为正例进行预测,则每次可计算出当前的查全率和查准率。以查全率为x轴,查准率为y轴,就得到了查准率-查全率曲线,简称’‘P-R曲线’‘,P-R图能直观的显示出学习器在样本总体上的查全率和查准率,在进行比较时,如果一个学习器的P-R曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能由于前者。例如图中学习器A的性能优于C,若曲线出现交叉,则无法轻易断言孰优孰劣,只能在具体的查准率和查全率下进行比较。于是人们想出了“平衡点”(BEP)这一个度量,它是查准率等于查全率时的取值,例如图中学习器C的BEP是0.64,而基于BEP的比较,可认为学习器A优于B。
2.2.5 ROC和AUC
类似于P-R曲线根据学习器预测结果对样例排序,并逐个作为正例进行预测,以“假正例率”(FPR)为横轴,“真正例率”(TPR)为纵轴可得到ROC曲线,全称“受试者工作特征”(Receiver Operating Characteristic)曲线。相比于PR曲线,ROC曲线对样本类别的比例不敏感,更能反映模型预测性能
若某个学习器的ROC曲线被另一个学习器的曲线“包住”,则后者性能优于前者;否者如果曲线交叉,可以根据ROC曲线下面积大小进行比较,也即AUC值。AUC 衡量了样本预测的排序质量,
示例代码:
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import roc_auc_score,roc_curve
from sklearn.metrics import precision_recall_curve
# 导入数据
y_true = [1, 0, 0, 1, 0, 0, 1, 1, 0, 1]
y_pre = [0.9, 0.4, 0.2, 0.6, 0.5, 0.4, 0.7, 0.4, 0.65, 0.35]
# 调用这些函数时要注意,y_pre必须是预测为正例的概率
fpr,tpr,th = roc_curve(y_true, y_pre)
precision,recall,th = precision_recall_curve(y_true, y_pre)
auc_socre = roc_auc_score(y_true, y_pre)
print("auc=:{}".format(auc_socre))
# 设置画图参数
fig,ax = plt.subplots(1,2,figsize = (10,5))
ax[0].plot(precision,recall)
ax[0].set_xlabel("recall")
ax[0].set_ylabel("precision")
# 设置X,Y轴名称
ax[1].plot(fpr,tpr)
ax[1].set_xlabel("fpr")
ax[1].set_ylabel("tpr")
ax[0].set_title("PR")
ax[1].set_title("ROC")
plt.show()
代码运行结果:
auc=:0.6799999999999999
2.3 多分类问题的评估指标
上述中分类问题的性能度量都是针对二分类问题,那么在多分类问题中,我们应该怎样去进行性能度量呢?下面介绍几种常见的方法
我们在进行多分类问题的性能度量的时候,是对每一类单独求解,当对某一类进行计算时,是把这一类当成正类,其他所有类当成负类进行计算。举个例子:
在计算cat的时候,我们把cat当成正例,把所有不是cat的当成负例,所以就可以转化为
Label = [1,1,1,1,0,0,0,0,0]
Predicted = [1,1,1,1,0,0,1,0,0]
因此,图中cat的TP为4,FP为1,FN为0
依次类推,就可以得到如下混淆矩阵:
2.3.1 微(micro)查准率,查全率,F1-score
在计算micro-Precision,micro-Recall,micro-F1-score时,我们根据上述方法计算出每个类别的TP,FP,FN之后,把所有的TP,FP,FN加起来,再根据公式就可以计算得到结果。
2.3.2 宏(macro)查准率,查全率,F1-score
在计算macro-Precision,macro-Recall,macro-F1-score时,我们是将每一个类别的P或者R分别计算得到结果之后,再取一个平均值的到最终的结果。上面例子中三个类别的Precision分别为1, 0.8, 0.667,所以micro-p就是1/3(1+0.8+0.667)=0.82, Recall也是这样的算法。
其中n是类别数目,为第类的precision,为第类的Recall
2.3.3 Weighted-averaged 查准率,查全率,F1-score
前面我们在计算micro和macro的时候,都是假设所有类别对最终的结果的贡献都是一样。而在Weighted-averaged中,我们认为每个类别对最终目标的贡献比由其样本数目的多少决定,即计算出每个类别的P或者R之后,乘以每个类别所占的比重就得到了Weighted-averaged P或者R。计算公式如下:
示例代码:
import numpy as np
from sklearn.metrics import confusion_matrix,roc_auc_score,roc_curve
from sklearn.metrics import precision_score,recall_score
y_true = np.array([-1]*30+[0]*240+[1]*30)
y_pre = np.array([-1]*10+[0]*10+[1]*10+
[-1]*40+[0]*160+[1]*40+
[-1]*5+[0]*5+[1]*20 )
print(confusion_matrix(y_true,y_pre))
precision_micro = precision_score(y_true,y_pre,average='micro')
precision_macro = precision_score(y_true,y_pre,average='micro')
precision_weighted = precision_score(y_true,y_pre,average='weighted')
recall_micro = recall_score(y_true,y_pre,average='micro')
recall_macro = recall_score(y_true,y_pre,average='macro')
recall_weighted = recall_score(y_true,y_pre,average='weighted')
print("precision_micro is{},precision_macro is{},precision_weightedis{}".format(precision_micro,precision_macro,precision_weighted))
print("recall_micro is{},recall_macro is{},recall_weightedis{}".format(recall_micro,recall_macro,recall_weighted))
运行结果显示:
[[ 10 10 10]
[ 40 160 40]
[ 5 5 20]]
precision_micro is0.6333333333333333,precision_macro is0.6333333333333333,precision_weightedis0.7781818181818182
recall_micro is0.6333333333333333,recall_macro is0.5555555555555555,recall_weightedis0.6333333333333333
3 总结
人工智能模型评估是一个多维度、综合性的过程,涉及从性能测试到误差分析、可解释性和部署后监控等多个方面。有效的模型评估不仅帮助验证和改进模型,还确保了模型在实际应用中的可靠性和合理性。随着AI技术的发展,模型评估的方法和工具也在不断进步,以满足日益增长的应用需求。