模型评估:评估矩阵和打分

本文探讨了模型评估的重要性,强调了目标优先原则,特别是在二分类问题中。介绍了第一类错误和第二类错误的概念,并讨论了非均匀数据集对正确率的影响。文章还详细阐述了混淆矩阵、精确率、召回率、F-score及其应用场景,以及如何通过调整阈值优化模型性能。此外,提到了精度-召回曲线和ROC曲线,以及AUC作为评价指标的价值。
摘要由CSDN通过智能技术生成

截至目前为止, 我们都一直都是用accuracy正确率来评价分类模型的表现,用 R 2 R^2 R2. 但是,这只是评价给定数据集合上监督学习模型性能的众多指标中的两个,在实际应用时,选择合适的评价矩阵来挑选合适的模型和参数非常重要。

目标优先

首先需要谨记的是:应用机器学习的最终目标是什么。实际场景中,我们通常不仅仅关注于预测的正确率,很多时候这些预测值还是后续更重要决策过程的一部分。

在挑选机器学习评价矩阵之前,应该想一想应用上更高层次的目标,这个目标常被称为“商业矩阵”。 选择特定机器学习算法的结果被称为商业影响(business impact)。 这个更高级别的目标可能是避免交通事故,或者减少医疗事故,或者使得很多网民受益,等等。在选择模型或者调试参数的时候,应该选择那些在商业矩阵上最有正向影响力的。这往往比较难,因为评估特定模型的商业影响力需要将其放到实际生产环境中应用才能知道,或者说,需要对商业目标有更加深入的理解。

二分类问题的评价指标

第一类错误和第二类错误

二分类问题很常见,在二分类问题中,通常有两类:positive VS negative.

以病人诊断为例,对于任何一个诊断环节,阳性代表有病,阴性代表没病,在这个二分类问题中,我们首先关心的是,如何把所有阳性的病例筛出来,这是一个positive test问题,反之,如果我们关注的是阴性结果,就称为negative test。

有一种可能的错误就是误把健康人诊断为阳性,一个错误的阳性结果,就被称为假阳性FP,反之,错误的阴性结果称为假阴性FN。假阳性通常有被称为第一类错误(type I error), 假阴性称为第二类错误(type II error)。

非均匀数据集

错误类型的概念适用于那种一类数据非常常见,但是另一类数据非常罕见的情况。以疾病诊断为例,大多数检查的结果都是健康的,少数可能是患病的。或者网页广告推荐(或头条推送),通过记录用户的浏览情况给用户推荐内容,期待的结果是用户的点击行为,每个数据点展示的广告,标签/目标是用户是否发生了点击这个行为。 大多数广告都被“视而不见”了,只有少数广告会被点击,也就是说,点击这个标签的数据是非常少的,大多数,甚至可能是99%的标签都是不点击。在这种情况下,如果模型的预测全部都是“不点击”, 也可以得到99%的正确率,但这显然是由于数据本身的偏侧化造成的,这时候用正确率(accuracy)评价模型的性能也是不科学的。

我们来人为地模拟一个偏侧化的数据集,假设我们仅仅关心手写数字识别问题中对数字9的识别率(对应表现1),其他数字是否识别不关心(对应标签0)

import numpy as np
from sklearn.datasets import load_digits 
from sklearn.model_selection import train_test_split
digits = load_digits()
y = digits.target == 9
X_train, X_test, y_train, y_test = train_test_split(
digits.data, y, random_state=0)
from sklearn.dummy import DummyClassifier
dummy_majority = DummyClassifier(strategy='most_frequent').fit(X_train, y_train) 
pred_most_frequent = dummy_majority.predict(X_test)
print("Unique predicted labels: {}".format(np.unique(pred_most_frequent))) 
print("Test score: {:.2f}".format(dummy_majority.score(X_test, y_test)))
Unique predicted labels: [False]
Test score: 0.90

正如预料的那样,由于数据集本身的不均衡性,即便是DummyClassifier也可以得到90%的正确率。如果用一个真实的机器学习模型,以决策树为例:

from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier(max_depth=2).fit(X_train, y_train)
pred_tree = tree.predict(X_test)
print('Test score: {:.2f}'.format(tree.score(X_test, y_test)))

Test score: 0.92

这里决策树给出的正确率并不比DummyClassifer高多少。换成LogisitcRegression模型,可以看到如果将DummyClassifier的strategy设置为默认,表现明显下降,同时LogisticRegression给出了非常好的结果。

from sklearn.linear_model import LogisticRegression
dummy = DummyClassifier().fit(X_train, y_train)
#pred_dumy = dummy.predict(X_test)
print('dummy score: {:.2f}'.format(dummy.score(X_test,y_test)))
logreg = LogisticRegression(C=0.1).fit(X_train, y_train)
pred_logreg = logreg.predict(X_test)
print('logreg score: {:.2f}'.format(logreg.score(X_test, y_test)))

dummy score: 0.83
logreg score: 0.98

事实上,在非常不均衡的数据集上正确率却是不是一个很好的指标。

混淆矩阵、正确率、精确率、召回率和f-score

二分类问题中,混淆矩阵是一个非常好的模型评估工具。

from sklearn.metrics import confusion_matrix
confusion = confusion_matrix(y_test, pred_logreg)
print(
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值