机器学习之旅---如何评价一个模型的好坏
2019/11/13 Caesar
前言
上一篇文章我们初探了机器学习领域的第一个算法-kNN算法,今天我们就kNN算法来讨论,如何来评价一个模型是好是坏。
分类准确度
在上一篇文章中,我们最终将 kNN算法实现出来,看似非常顺利,但是,我们有没有想过,这个结果一定是准确的吗?想到这个,我们必须来亲身验证下。现在我们已经训练好一个模型,但绝对不是立马可以拿到真实环境中跑,我们需要自己测试下。这里介绍一种方法,我们可以这样来操作,将原始数据中的一部分作为训练数据、另一部分作为测试数据。使用训练数据训练模型,再用测试数据看好坏。即通过测试数据判断模型好坏,然后再不断对模型进行修改。
当我们将原始数据划分为训练数据、测试数据后,就可以进行下一步,计算分类准确度(accuracy),我们使用sklearn自带的手写识别的数据集进行计算准确度,进而巩固之前学的kNN算法,代码如下:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
digits = datasets.load_digits()
x = digits.data #获取特征值
y = digits.target #获取标记
#将数据分为两部分,训练数据和测试数据
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.2)
#指定key值
knn = KNeighborsClassifier(n_neighbors=3)
#进行拟合
knn.fit(x_train,y_train)
y_predict = knn.predict(x_test)
ratio = sum(y_predict==y_test)/len(y_test)
print(ratio)
#当我们不想要预测值的时候,我们可以直接使用knn对象的score函数进行得出准确度
ratio_bak = knn.score(x_test,y_test)
print(ratio_bak)
模型评价指标
下面我将对几类机器学习模型评价指标做个总结,主要有混淆矩阵、精准率、召回率、F1 Score、ROC曲线等。
1.混淆矩阵
所谓混淆矩阵,并没有名字那么唬人,其实就是一张表,如实记录统计样本被分类的结果,我们通过计算样本被正确归类的数量,就可以得到分类器的准确率。
对于k分类问题,混淆矩阵为k✖k的矩阵,它的元素cij表示第i类样本被分类器判定为第j类的数量:
c11 | ... | c1k |
---|---|---|
... | ... | ... |
ck1 | ... | ckk |
以分类模型中最简单的二分类为例,对于这种问题,我们的模型最终需要判断样本的结果是0还是1,或者说是positive还是negative。我们通过样本的采集,能够直接知道真实情况下,哪些数据结果是positive,哪些结果是negative。同时,我们通过用样本数据跑出分类型模型的结果,也可以知道模型认为这些数据哪些是positive,哪些是negative。
因此,我们就能得到这样四个基础指标,我称他们是一级指标(最底层的):
真实值是positive,模型认为是positive的数量(True Positive=TP)
真实值是positive,模型认为是negative的数量(False Negative=FN):这就是统计学上的第一类错误(Type I Error)
真实值是negative,模型认为是positive的数量(False Positive=FP):这就是统计学上的第二类错误(Type II Error)
真实值是negative,模型认为是negative的数量(True Negative=TN)
将这四个指标一起呈现在表格中,就能得到如下这样一个矩阵,我们称它为混淆矩阵(Confusion Matrix):
![](https://img.haomeiwen.com/i17022525/6338f7520eb016d7.png)
2.精度与召回率
精准率(查准率)与召回率(查全率)是分类问题的评价指标。对于二分类问题,它的样本只有正样本和负样本。举个栗子,在垃圾邮件分类中,正样本是垃圾邮件,负样本是正常邮件。
测试样本中正样本被分类器判定为正样本的数量记为TP(True Positive),正样本被判定为负样本的数量记为FN(False Negative);负样本被判定为负样本的数量记为TN(True Negative),负样本被判定为正样本的数量记为FP(False Positive)。
精度定义为 TP/(TP+FP),精度是被分类器判定为正样本的样本中真正的正样本所占的比例,反映的是正样本分类的准确率。我们关注的那个事件,预测的有多准。
召回率定义为TP/(TP+FN),召回率是所有正样本中被分类器判定为正样本的比例。我们关注的那个事件真实的发生情况下,我们成功预测的比例是多少。
那么这两个指标我们在实际工业环境下,如何取舍,毕竟当精准率(查准率)上去了,召回率(查全率)可能就下降了。关键是视场景而定
比如我们做了一个股票预测系统,未来股票是📈还是📉这样一个二分类问题。很显然“涨”才是我们关注的焦点,那么我们肯定希望:系统预测上涨的股票中,真正上涨的比例越大越好,这就是希望查准率高。那么我们是否关注查全率呢?在大盘中有太多的真实上涨股票,虽然我们漏掉了一些上升周期,但是我们没有买进,也就没有损失。但是如果查准率不高,预测上涨的结果下跌了,那就是实实在在的亏钱了。所以在这个场景中,查准率更重要。
当然也有追求召回率的场景,在医疗领域做疾病诊断,如果召回率低,意味着本来有一个病人得病了,但是没有正确预测出来,病情就恶化了。我们希望尽可能地将所有有病的患者都预测出来,而不是在看在预测有病的样例中有多准。
但是,在实际业务场景中,也有很多没有这么明显的选择。那么在同时需要关注精准率和召回率,如何在两个指标中取得平衡呢?在这种情况下,我们使用一种新的指标:F1 Score。
3.F1 Score
F1 分数(F1 Score),是统计学中用来衡量二分类模型精确度的一种指标。它同时兼顾了分类模型的精确率和召回率。F1 分数可以看作是模型精确率和召回率的一种加权平均,它的最大值是1,最小值是0。(出自百度百科)
F1 分数:我认为精确率和召回率同等重要,一视同仁,权重相同。
![](https://img.haomeiwen.com/i17022525/78097c5be85ba663.png)
Fβ 分数:更一般的式子,有 F2 分数和 F0.5 分数。 F1 分数认为召回率和精确率同等重要,F2分数认为召回率的重要程度是精确率的2倍,而 F0.5 分数认为召回率的重要程度是精确率的一半。
![](https://img.haomeiwen.com/i17022525/1b066c7ad49a64a5.png)
4. ROC曲线
在学习 ROC 曲线前,先了解三个相关概念:分类阈值、 TPR 和 FPR 。
4.1相关概念
4.1.1分类阈值
分类阈值,即设置判断样本为正例的阈值thr。举个栗子,在垃圾邮件检测中,预测模型对一封邮件的预测分数为0.8,那它应该是属于垃圾邮件还是正常邮件。因此我们必须设定一个分类阈值 thr,假设阈值为0.6,那么这封邮件将会被归类为垃圾邮件。
4.1.2真阳率(召回率、 TPR)
真阳率是所有正样本被分类器判定为正样本的比例。 TPR = TP/(TP+FN)
4.1.3假阳率(FPR)
假阳率是所有负样本被分类器判定为正样本的比例。 FPR = FP/(FP+TN)
4.2 ROC概念
ROC曲线用来描述TPR和FPR之间的关系。x轴是FPR,y轴是TPR。TPR越大越好,FPR越小越好,但这两个指标通常是矛盾的。为了增大TPR,可以预测更多的样本为正例,与此同时也增加了更多负例被误判为正例的情况。
![](https://img.haomeiwen.com/i17022525/e8473d0b4ff49457.png)
我们可以关注图中ROC曲线以下的面积,也就是AUC面积,来评价一个模型的好坏。
4.3 AUC面积
ROC曲线下方由梯形组成,矩形可以看成特征的梯形。因此,AUC的面积可以这样算:(上底+下底)* 高 / 2,曲线下面的面积可以由多个梯形面积叠加得到。AUC越大,分类器分类效果越好。
AUC = 1,是完美分类器,采用这个预测模型时,不管设定什么阈值都能得出完美预测。绝大多数预测的场合,不存在完美分类器。
0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
AUC = 0.5,跟随机猜测一样,模型没有预测价值。
AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。