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

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成正比。 

be5be9227d7925963acd4c5780fd66d2.png

上图是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=[0, 1, 2])
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.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

33fa65ee896d2de1a83d2a5e11df0cf4.png

- EOF -

推荐阅读  点击标题可跳转

 
 

12e5a6e99981ada13798aed0c2251470.jpeg

 
 
 
 
 
 
 
 
往期精彩回顾




适合初学者入门人工智能的路线及资料下载(图文+视频)机器学习入门系列下载中国大学慕课《机器学习》(黄海广主讲)机器学习及深度学习笔记等资料打印《统计学习方法》的代码复现专辑机器学习交流qq群955171419,加入微信群请扫码

a70c7f8c18bc3a6b9aa6a6360473e20d.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值