模型评估:
概念:
在机器学习模型搭建好之后,需要对模型进行评估,针对不同的算法模型有不同的评估方法,比如:分类算法、回归算法、聚类算法,同时在在生活中也有许多常用评价标准,主要包括:准确率,精确率,召回率,F1值,ROC曲线,AUC,P-R,KS曲线等。
常见评价标准介绍:
准确率:
预测正确的占比
F1值:
统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的准确率和召回率。F1分数可以看作是模型准确率和召回率的一种加权平均,它的最大值是1,最小值是0。
Roc曲线:
预测结果对样例进行排序,按此顺序逐个把样本作为正例进行预测,每次计算出两个重要量的值,分别以它们为横、纵坐标作图,就得到了“ROC曲线”。ROC曲线的纵轴是“真正例率”(True Positive Rate,简称TPR),横轴是“假正例率”(False Positive Rate,简称FPR)。
真正率为实际为正的样本中,被判断为正的比例,
假正率为实际为负,被错误判断为正的比例时
AUC曲线:
用于二分类模型评价的模型评价指标。当AUC=1.0时表示模型最好,随机猜测的为0.5,其值越高,模型性能越好。
PR曲线:
以查准率为纵轴、查全率为横轴作图,就得到了查准率-查全率曲线,简称“P-R曲线”
对于二分类问题,可将样例根据其真实类别与学习器预测类别的组合划分为真正例(true positive)、假正例(false positive)、真反例(true negative)、假反例(false negative)四种情形,令TP、FP、TN、FN分别表示其对应的样例数,所以TP+FP+TN+FN=样例总数。
P-查准率,R-查全率(召回率)
(precision)
(recall)
查准率高时,查全率往往偏低;而查全率高时,查准率往往偏低。就是说如果希望选出我们想要的数据,那么我们就要尽可能多选,当所有数据都被选中,那么所有好数据也就被选出来了,可想而知查准率十分的低。查全率也是一样的。
KS曲线:
把真正率(TPR)和假正率(FPR)当作横纵轴,而K-S曲线是把真正率(TPR)和假正率(FPR)都当作是纵轴,横轴则由选定的阈值来充当。从K-S曲线可以衍生出KS值,KS=max(TPR-FPR),(两条曲线之间的最大间隔距离)KS值越大,模型的区分能力越强。
我们这里主要用pr曲线和roc曲线对knn算法进行模型评估分析。
样本参考:
PR曲线
我随机上次的实验数据集(个人成绩)中随机选取了10个数据作为样本数据,对真实标签判别分类0或1,(1检索返回,0检索未返回)。
代码如下:
import numpy as np
import matplotlib.pyplot as plt
# 构造样本数据,scores表示预测得分,labels表示真实标签
scores = np.array([59 ,59 ,80, 70, 60 ,80,70,60,100 ,88 ,67])
labels = np.array([1,0,0,1,0,1,1,1,0,1,1])
# 计算PR曲线上每个点的P值和R值
sorted_indices = np.argsort(-scores) # 按得分从高到低排序
tp_count = 5 # 正确预测的正例数
fp_count = 5 # 错误预测的正例数
p_values = [] # 保存每个点的P值
r_values = [] # 保存每个点的R值
for i in sorted_indices:
if labels[i] == 1: # 预测为正例且真实为正例
tp_count += 1
else: # 预测为正例但真实为负例
fp_count += 1
precision = tp_count / (tp_count + fp_count)
recall = tp_count / np.sum(labels)
p_values.append(precision)
r_values.append(recall)
# 绘制PR曲线
plt.plot(r_values, p_values, marker='o')
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR')
plt.show()
结果对比: (左现实右课本图)
由此可知,现实生活中的PR曲线与课本上PR曲线的不完全相同。且这不是一个性能良好的模型。
调整参数:
1、labels = np.array([1,0,0,1,0,1,1,1,0,1,1])->labels = np.array([1,1,1,1,1,1,1,1,1,1,1])(全部正确)
labels = np.array([0,0,0,0,0,0,0,0,0,0,0])全部错误)
这两种情况基本为极端情况,现实生活中很少出现,这两个完全无参考意义
2、scores = np.array([59 ,59 ,80, 70, 60 ,80,70,60,100 ,88 ,67])
labels = np.array([1,0,0,1,0,1,1,1,0,1,1])
——》
scores = np.array([90,77,66,90,59,59,80,70,60,80,
70,60,100,88,67,90,90,17,56,60,
67,86,78,76,90,80,80,90,70,77,
81,89,73,99,89,78,90,87,92,83,
74,83,92,74,63,82,82,74,72,94,
90,78,69,61,100,100,99,100,71,85 ])
labels = np.array([0,1,1,0,1,1,1,0,0,1,
0,1,1,1,0,1,1,1,1,0,
0,0,1,0,1,0,1,1,0,0,
1,1,1,0,1,1,0,0,1,1,
1,0,0,0,0,1,0,1,1,0,
1,0,1,1,0,0,1,0,1,0])
。
由此曲线亦可以印证上述现实生活中的PR曲线与课本上PR曲线的不完全相同观点,由于模型的精确度和召回率互相制约,P-R曲线越向右上凸,表示模型性能越好,所以我们可以明显看出60个样本模型虽多但性能低于11个样本模型。
ROC曲线
代码如下:
import numpy as np
import matplotlib.pyplot as plt
# 构造样本数据,scores表示预测得分,labels表示真实标签(0或1)
scores = np.array([59 ,59 ,80, 70, 60 ,80,70,60,100 ,88 ,67,90])
labels = np.array([1,0,1,0,1,0,1,1,0,1,0,0])
# 计算ROC曲线上每个点的FPR值和TPR值
sorted_indices = np.argsort(-scores) # 按得分从高到低排序
tp_count = 0 # 正确预测的正例数
fp_count = 0 # 错误预测的正例数
fpr_values = [] # 保存每个点的FPR值
tpr_values = [] # 保存每个点的TPR值
for i in sorted_indices:
if labels[i] == 1: # 预测为正例且真实为正例
tp_count += 1
else: # 预测为正例但真实为负例
fp_count += 1
fpr = fp_count / np.sum(1-labels)
tpr = tp_count / np.sum(labels)
fpr_values.append(fpr)
tpr_values.append(tpr)
# 绘制ROC曲线
plt.plot(fpr_values, tpr_values, marker='o')
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('ROC Curve')
plt.show()
结果对比
现实任务中通常是利用有限个测试样例来绘制ROC图,此时仅能获得有限个(真正例率,假正例率)坐标对,无法产生下图中的光滑ROC曲线,且与理想曲线图大相径庭 。原因是11个样本太过于稀少,因此,我又随机从个人成绩数据集中抽出了60个数据样本进行验证,如下:
scores = np.array([90,77,66,90,59,59,80,70,60,80,
70,60,100,88,67,90,90,17,56,60,
67,86,78,76,90,80,80,90,70,77,
81,89,73,99,89,78,90,87,92,83,
74,83,92,74,63,82,82,74,72,94,
90,78,69,61,100,100,99,100,71,85 ])
labels = np.array([0,1,1,0,1,1,1,0,0,1,
0,1,1,1,0,1,1,1,1,0,
0,0,1,0,1,0,1,1,0,0,
1,1,1,0,1,1,0,0,1,1,
1,0,0,0,0,1,0,1,1,0,
1,0,1,1,0,0,1,0,1,0])
由图我们可以看出虽然样本数增多了但这也不是一个性能良好的模型它与理想型还存在一定差距。反观样本数较少模型由于返回值比例较多,模型性能较为良好。
实验遇到的问题
vscode无法从源Pylance解析导入“matplotlib”_kapaja的博客-CSDN博客
我重装matplotlib包没有起到任何作用,后上网查到我可能存在 matplotlib包不在当前运行环境,我将此
改变为
就成功了!
总结
- 错误率是分类错误的样本数占总样本数的比例;错误率越小,模型性能越好。
- 精度是分类正确的样本数占总样本数的比例;精度越高,模型性能越好。
- 查准率是所有被预测为正例的样本中,真正是正例的样本所占的比例;查准率越高,模型对于预测为正例的结果越可信。
- 查全率是所有真实正例中,被正确预测为正例的样本所占的比例;查全率越高,模型对于真实为正例的情况预测的准确程度越高。
- ROC曲线展示的是不同阈值下的TPR和FPR之间的关系;ROC曲线越靠近左上角,说明模型性能越好,当ROC曲线沿着左上角移动时,既能保证查准率越来越高,也能保证查全率越来越高
- 模型的精确度和召回率互相制约,P-R曲线越向右上凸,表示模型性能越好。
在正负样本数量均衡的情况下,P-R曲线和ROC曲线的趋势差不多,但由于精确率和召回率更关注正样本的情况,当负样本比较多时P-R曲线的反映效果一般,此时使用ROC曲线更合适。
在使用机器学习算法进行分类任务时,我们需要综合考虑以上多种性能度量方式,以全面评价算法的性能表现和优劣。同时,在分析结果时,需要综合考虑各种度量方式的优缺点,选择最适合的性能度量方式,以充分发挥机器学习算法的性能。
参考文献:
vscode无法从源Pylance解析导入“matplotlib”_kapaja的博客-CSDN博客