【机器学习】模型选择(性能度量)原理及实战

机器学习初学者

共 3057字,需浏览 7分钟

 ·

2022-07-26 09:08


0.概述


模型的好坏是相对的。什么样的模型是好的,即取决于算法和数据,也取决于任务需求。


1. 回归任务的性能度量


均方误差

均方误差是回归任务最常用的性能度量,表示预测值和实际值之间的误差。

 

2. 分类任务的性能度量


真实情况预测结果

正例反例
正例TP(真正例)FN(假反例)
反例FP(假正例)TN(真反例)


精度:分类正确的样本占总样本的比例 TP+FN/总例数
查准率:预测正确的样本中实际为正确的比例 TP/(TP+FP)
查全率:正例中预测正确的比例 TP/(TP+FN)
F1:查准率和查全率的平均
ROC与AUC
许多机器学习方法分类的方式是为测试样本产生一个实值(或概率预测),并将其与设定好的阈值相比较,大于阈值的分为正类,小于阈值的分为负类。我们可以根据实值的大小,即按是正例的可能性将样本进行排序。分类过程就是在这个排序中找到某个“截断点”将前面一部分判做正例,后面一部分判做反例。


ROC曲线是以每一个实值作为阈值,并衡量模型性能的方法。它以真正例率TPR=TP/(TP+FN)为横坐标,假正例率FPR=FP/(TN+FP)为横坐标。每次按顺序尝试一个实值作为阈值进行测试。
真正例率和反正例率的分母是实际的正例和反例数量,是一个固定的数,因此他们与TP和FP成正比。 



上图是ROC的一个示例。点(0,1)对应将所有正例划分在反例前面的理想模型。橙色线对应一条实际情况下的ROC曲线。开始时,阈值的取值较高,只有前几个数作为正例,假正例数量为0,假正例率为0。随着阈值的降低,更多的样本被划分为正例,真假正例的数量都在增多,真假正例率也均有提升。阈值增高到一定程度时,排序靠后的样本全部为实际反例。于是真正例率不再增加,反正例率逐渐增加至1。得到一个数列fpr,tpr可以使用sklearn.metrics中的
roc_curve([实际结果],[分数])


AUC是ROC曲线的线下面积,衡量了预测的排序质量,是一种综合性指标。AUC=1时,ROC曲线是(0, 0), (0, 1), (1, 1)连接起来的折线,代表所有正例在反例之前的完美排序。AUC=接近1/2时,ROC接近(0, 0)和(1, 1)连接起来的直线,代表排序的方式接近于完全随机。计算auc的方法是应用sklearn.metrics中的roc_auc([fpr],[tpr])


代价敏感错误率
适用于错误类型造成的后果不同,如患者诊断为健康人(错过治疗)和健康人诊断为患者(检查费用)
根据错误类型的不同给FP和FN按一定比例相加除以样例数即为代价敏感错误率。


3. 代码示例

画出ROC曲线,计算AUC值


import matplotlib.pyplot as plt
from sklearn import svm, datasets
from sklearn.metrics import roc_curve, auc
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier
# 导入鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 二进制化输出
y = label_binarize(y, classes=[012])
n_classes = y.shape[1]
# 切分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=.5, random_state=0)
# 应用SVM进行评分
classifier = OneVsRestClassifier(svm.SVC(kernel='linear', probability=True,))
y_score = classifier.fit(X_train, y_train).decision_function(X_test)
# 为每个类别计算ROC曲线和AUC
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    # 这里用roc_curve得到了每个点的fpr,tpr值,参数是测试样本实际结果和评分的的第i列
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    # 这里用auc函数得到每个点的auc
    roc_auc[i] = auc(fpr[i], tpr[i])
plt.figure()
lw = 2


# 画出ROC曲线,标出AUC值
plt.plot(fpr[1], tpr[1], color='darkorange', lw=lw, label='ROC curve (area = %0.4f)' % roc_auc[1])
plt.xlim([0.01.0])
plt.ylim([0.01.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()




- EOF -

推荐阅读  点击标题可跳转
往期精彩回顾




浏览 54
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报