机器学习笔记之——模型评估与改进之评估指标与评分

评估指标与评分

到目前为止,我们使用精度(正确分类的样本所占的比例)来评估分类性能使用 R2 来评估回归性能。但是,总结监督模型在给定数据集上的表现有多种方法,这两个指标只是其中两种。在实践中,这些评估指标可能不适用于你的应用。在选择模型与调参时,选择正确的指标是很重要的。

1、牢记最终目标

在选择指标时,你应该始终牢记机器学习应用的最终目标。在实践中,我们通常不仅对精确的预测感兴趣,还希望将这些预测结果用于更大的决策过程。在选择机器学习指标之前,你应该考虑应用的高级目标,这通常被称为商业指标business metric)。对于一个机器学习应用,选择特定算法的结果被称为商业影响business impact)。高级目标可能是避免交通事故或者减少入院人数,也可能是吸引更多的网站用户或者让用户在你的商店中花 更多的钱。在选择模型或调参时,你应该选择对商业指标具有最大正面影响的模型或参数值。这通常是很难的,因为要想评估某个模型的商业影响,可能需要将它放在真实的生产环境中。

在开发的初期阶段调参,仅为了测试就将模型投入生产环境往往是不可行的,因为可能涉及很高的商业风险或个人风险。想象一下,为了测试无人驾驶汽车的行人避让能力,没有 事先验证就让它直接上路。如果模型很糟糕的话,行人就会遇到麻烦!因此,我们通常需要找到某种替代的评估程序,使用一种更容易计算的评估指标。例如,我们可以测试对行人和非行人的图片进行分类并测量精度。请记住,这只是一种替代方法,找到与原始商业目标最接近的可评估的指标也很有用。应尽可能使用这个最接近的指标来进行模型评估与选择。评估的结果可能不是一个数字——算法的结果可能是顾客多了 10%,但每位顾客的花费减少了 15%——但它应该给出选择一个模型而不选另一个所造成的预期商业影响。

本节我们将首先讨论二分类这一重要特例的指标,然后转向多分类问题,最后讨论回归问题。


2、二分类指标

二分类可能是实践中最常见的机器学习应用,也是概念最简单的应用。但是,即使是评估这个简单任务也仍有一些注意事项。在深入研究替代指标之前,我们先看一下测量精度可能会如何误导我们。请记住,对于二分类问题,我们通常会说正类positive class)和反类negative class),而正类是我们要寻找的类

2.1、错误类型

通常来说,精度并不能很好地度量预测性能,因为我们所犯错误的数量并不包含我们感兴趣的所有信息。想象一个应用,利用自动化测试来筛查癌症的早期发现。如果测试结果为阴性,那么认为患者是健康的,而如果测试结果为阳性,患者则需要接受额外的筛查。这里我们将阳性测试结果(表示患有癌症)称为正类将阴性测试结果称为反类。我们不能假设模型永远是完美的,它也会犯错。对于任何应用而言,我们都需要问问自己,这些错误在现实世界中可能有什么后果。

一种可能的错误是健康的患者被诊断为阳性,导致需要进行额外的测试。这给患者带来 了一些费用支出和不便(可能还有精神上的痛苦)。错误的阳性预测叫作假正例false positive)。另一种可能的错误是患病的人被诊断为阴性,因而不会接受进一步的检查和治疗。未诊断出的癌症可能导致严重的健康问题,甚至可能致命。这种类型的错误(错误的阴性预测)叫作假反例false negative)。在统计学中,假正例也叫作第一类错误type I error),假反例也叫作第二类错误type II error)。我们将坚持使用 “假正例” 和 “假反例” 的说法,因为它们的含义更加明确,也更好记。在癌症诊断的例子中,显然,我们希望尽 量避免假反例,而假正例可以被看作是小麻烦。

虽然这是一个特别极端的例子,但假正例和假反例造成的结果很少相同。在商业应用中, 可以为两种类型的错误分配美元值,即用美元而不是精度来度量某个预测结果的错误。对于选择使用哪种模型的商业决策而言,这种方法可能更有意义。

2.2、不平衡数据集

如果在两个类别中,一个类别的出现次数比另一个多很多,那么错误类型将发挥重要作用。这在实践中十分常见,一个很好的例子是点击(click-through)预测,其中每个数据点表示一个 “印象”(impression),即向用户展示的一个物项。这个物项可能是广告、相关的故事,或者是在社交媒体网站上关注的相关人员。目标是预测用户是否会点击看到的某个特定物项(表示他们感兴趣)。用户对互联网上显示的大多数内容(尤其是广告)都不会点击。你可能需要向用户展示 100 个广告或文章,他们才会找到足够有趣的内容来点击查看。这样就会得到一个数据集,其中每 99 个 “未点击” 的数据点才有 1 个 “已点击” 的数据点。换句话说,99% 的样本属于 “未点击” 类别。这种一个类别比另一个类别出现次数多很多的数据集,通常叫作不平衡数据集imbalanced dataset)或者具有不平衡类别的数据集dataset with imbalanced classes)。在实际当中,不平衡数据才是常态,而数据中感兴趣事件的出现次数相同或相似的情况十分罕见。

现在假设你在构建了一个在点击预测任务中精度达到 99% 的分类器。这告诉了你什么? 99% 的精度听起来令人印象深刻,但是它并没有考虑类别不平衡。你不必构建机器学习模型,始终预测 “未点击” 就可以得到 99% 的精度。另一方面,即使是不平衡数据,精度达到 99% 的模型实际上也是相当不错的。但是,精度无法帮助我们区分不变的 “未点击” 模型与潜在的优秀模型。

为了便于说明,我们将 digits 数据集中的数字 9 与其他九个类别加以区分,从而创建一个 9:1 的不平衡数据集:

from sklearn.datasets import load_digits

digits = load_digits()
y = digits.target == 9

X_train, X_test, y_train, y_test = train_test_split(
    digits.data, y, random_state=0)

我们可以使用 DummyClassifier 来始终预测多数类(这里是 “非 9”),以查看精度提供的信息量有多么少:

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)))
# Unique predicted labels: [False]
print("Test score: {:.2f}".format(dummy_majority.score(X_test, y_test)))
# Test score: 0.90

我们得到了接近 90% 的精度,却没有学到任何内容。这个结果可能看起来相当好,但请思考一会儿。想象一下,有人告诉你他们的模型精度达到 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

从精度来看,DecisionTreeClassifier 仅比常数预测稍好一点。这可能表示我们使用 DecisionTreeClassifier 的方法有误,也可能是因为精度实际上在这里不是一个很好的度量。

为了便于对比,我们再评估两个分类器,LogisticRegression 与默认的 DummyClassifier, 其中后者进行随机预测,但预测类别的比例与训练集中的比例相同:

from sklearn.linear_model import LogisticRegression

dummy = DummyClassifier().fit(X_train, y_train)
pred_dummy = dummy.predict(X_test)
print("dummy score: {:.2f}".format(dummy.score(X_test, y_test)))
# dummy score: 0.79

logreg = LogisticRegression(max_iter=1000, 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)))
# logreg score: 0.98

显而易见,产生随机输出的虚拟分类器是所有分类器中最差的(精度最低),而 LogisticRegression 则给出了非常好的结果。但是,即使是随机分类器也得到了超过 80% 的精度。这样很难判断哪些结果是真正有帮助的。这里的问题在于,要想对这种不平衡数据的预测性能进行量化,精度并不是一种合适的度量。在本章接下来的内容中,我们将探索在选择模型方面能够提供更好指导的其他指标。我们特别希望有一个指标可以告诉我们,一个模型比 “最常见” 预测(由 pred_most_frequent 给出)或随机预测(由 pred_dummy 给出)要好多少。如果我们用一个指标来评估模型,那么这个指标应该能够淘汰这些无意义的预测。

2.3、混淆矩阵

对于二分类问题的评估结果,一种最全面的表示方法是使用混淆矩阵confusion matrix)。 我们利用 confusion_matrix 函数来检查上一节中 LogisticRegression 的预测结果。我们已经将测试集上的预测结果保存在 pred_logreg 中:

from sklearn.metrics import confusion_matrix

confusion = confusion_matrix(y_test, pred_logreg)
print("Confusion matrix:\n{}".format(confusion))
'''
Confusion matrix:
[[402   1]
 [  6  41]]
'''

confusion_matrix 的输出是一个 2×2 数组,其中行对应于真实的类别,列对应于预测的类别。数组中每个元素给出属于该行对应类别(这里是 “非 9” 和 “9”)的样本被分类到该列对应类别中的数量。下图对这一含义进行了说明。

mglearn.plots.plot_confusion_matrix_illustration()

如果我们将 “9” 作为正类,那么就可以将混淆矩阵的元素与前面介绍过的假正例(false positive)和假反例(false negative)两个术语联系起来。为了使图像更加完整,我们将正类中正确分类的样本称为真正例(true positive),将反类中正确分类的样本称为真反例 (true negative)。这些术语通常缩写为 FP、FN、TP 和 TN,这样就可以得到下图对混淆矩 阵的解释:

mglearn.plots.plot_binary_confusion_matrix()

下面我们用混淆矩阵来比较前面拟合过的模型(两个虚拟模型、决策树和 Logistic 回归):

print("Most frequent class:")
print(confusion_matrix(y_test, pred_most_frequent))
'''
Most frequent class:
[[403   0]
 [ 47   0]]
'''
print("\nDummy model:")
print(confusion_matrix(y_test, pred_dummy))
'''
Dummy model:
[[363  40]
 [ 41   6]]
'''
print("\nDecision tree:")
print(confusion_matrix(y_test, pred_tree))
'''
Decision tree:
[[390  13]
 [ 24  23]]
'''
print("\nLogistic Regression")
print(confusion_matrix(y_test, pred_logreg))
'''
Logistic Regression
[[402   1]
 [  6  41]]
'''

观察混淆矩阵,很明显可以看出 pred_most_frequent 有问题,因为它总是预测同一个类 别。另一方面,pred_dummy 的真正例数量很少(4 个),特别是与假反例和假正例的数量相比——假正例的数量竟然比真正例还多!决策树的预测比虚拟预测更有意义,即使二者精度几乎相同。最后,我们可以看到,Logistic 回归在各方面都比 pred_tree 要好:它的真正例和真反例的数量更多,而假正例和假反例的数量更少。从这个对比中可以明确看出,只 有决策树和 Logistic 回归给出了合理的结果,并且 Logistic 回归的效果全面好于决策树。 但是,检查整个混淆矩阵有点麻烦,虽然我们通过观察矩阵的各个方面得到了很多深入见解,但是这个过程是人工完成的,也是非常定性的。有几种方法可以总结混淆矩阵中包含的信息,我们将在后面进行讨论。

与精度的关系。我们已经讲过一种总结混淆矩阵结果的方法——计算精度,其公式表达如下所示:
A c c u r a c y = T P + T N

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值