Day 16 : 模型衡量指标

由於我们需要有指标来衡量一个模型的好坏,而问题可以粗略分成「分类」和「回归」问题。而根据不同的问题,我们所选用的衡量指标也会不同。

分类

关於分类问题,我们先介绍什麽是混肴矩阵,会在很多机器学习的应用场景看到这个名词哦!

混肴矩阵(Confusion Matrix)

如果分类问题假设只有分真和假,请看下图,左边栏位是代表实际的情况,上面栏位是代表预测的情况(2x2情况)

(如果分类有3种,那混肴矩阵就会变成3x3情况,依此类推)

  • False Positive 是 Type Ⅰ Error

  • False Negative 是 Type Ⅱ Error,通常型二错误是比较严重的错误

  • Accuracy: 准确率,计算正确预测的占比

  • Precision: 精准率,计算在预测情况为真,实际情况为真的占比

  • Recall: 召回率,计算在实际情况为真,预测情况为真的占比

  • F1-Score: 是 percision 和 recall 的调和平均,会考虑两个指标

    或是

为什麽我们要有不同的指标,难道不能只看准确率(Accuracy)吗?

假设有一个模型预测癌症,一万人之中真实只有10人获得癌症,因此该模型都只要回覆健康,准确率高达 99.90%

但这并不是我们所想要的,我们就是想要找出谁有得癌症!准确率再高也解决不了医生的需求,根本只是盲猜

在此,癌症病患是我们想要预测的事情,很显然地,由於没有判断出任何一个有癌症的病患,使用其他指标均会 0

因此通常会看问题的种类而决定要使用的评估指标:

  • Recall: 由於型二错误(FN)代价很高(实际是癌症但却检验不是)

  • Precision: 由於型一错误(FP)代价很高(例如把正常邮件辨识为垃圾邮件)

  • F1 score: 综合考量以上两个指标

ROC曲线与AUC

  • ROC (Receiver operator characteristic): 接收者操作特徵曲线,该曲线是由混淆矩阵算出

  • AUC (Area Under Curve): ROC 曲线下的面积

ROC 曲线是以 FPR 为 X 轴;以 TPR 为 Y 轴

  • FPR:

  • TPR:

假设我们现在有4个测试样本,label代表 ground truth(1表示真,0表示假),score则是为真的机率值

    1. 对 score 做降幂排序,可以得到右表
    1. 针对每一个依序计算 TPR、FPR

实际计算

针对第一笔,只要是 score 超过 0.9 都视为真

precistion:预测为真,真实是真的机率是 1

TPR: 真实为真,预测是真的机率是 0.5

FPR: 真实为假,预测是真的机率是 0

针对第二笔,只要是 score 超过 0.6 都视为真

precistion:预测为真,真实是真的机率是 0.5

TPR: 真实为真,预测是真的机率是 0.5

FPR: 真实为假,预测是真的机率是 0.5

最後完成此表可以得到

由上表我们可以得到 (FPR, TPR)

(0, 0.5)

(0.5,0.5)

(0.5,1)

(1,1)

得到这些点并连线就是 ROC 曲线

程序绘制

import numpy as np
from sklearn.metrics import roc_curve, auc
y = np.array([0, 0, 1, 1])
scores = np.array([0.1, 0.6, 0.4, 0.9])
fpr, tpr, _ = roc_curve(y, scores)
roc_auc = auc(fpr, tpr)

import matplotlib.pyplot as plt

plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
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()

AUC

最好的模型是绘制到左上角,反之则差
而 AUC 是 ROC 的曲线下的面积,因此介於 0~1 之间,而蓝色的线代表是随机猜测的模型

AUC 可以表示一个模型的好坏,一般的标准是:

AUC 说明
1 最好的模型
> 0.85 效果很好
0.7 ~ 0.85 效果一般
0.5 ~ 0.7 效果低
0.5 随机猜测的模型(丢铜板)
<0.5 比随机猜测还要差的模型
# 复杂一点的交给程序来画吧!

import numpy as np
from sklearn.metrics import roc_curve, auc
y = np.array([1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0])
scores = np.array([0.99, 0.44, 0.19, 0.33, 0.7, 0.32, 0.64, 0.54, 0.28, 0.16, 0.83, 0.67, 0.51, 0.60, 0.55, 0.49, 0.69, 0.65, 0.19, 0.47])
fpr, tpr, _ = roc_curve(y, scores)
roc_auc = auc(fpr, tpr)

import matplotlib.pyplot as plt

plt.figure()
lw = 2
plt.plot(fpr, tpr, color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
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()

回归

预测值要与真实值越近越好,因此下面两个指标如果越大代表模型越不好

指标 中文 数学式
Mean Squared Error, MSE 均方误差
Mean Absolute Error, MAE 平均绝对误差
Root Mean Absolute Error, RMAE 均方根误差

<<:  {DAY 16} Pandas 学习笔记 part.2

>>:  [Day 27] 甚麽是ChromeDriver?可以自动驾驶吗?

Day16_HTML语法13

有时候我们希望使用者输入的资料符合我们想要的格式,因此我们可以做一些设定,当使用者输入的资料不符合格...

Day02 UIKit 01 - 新建专案

我们首先先从UIkit开始,我们在Xcode 新建专案,并选择Storyboard 作为Interf...

Angular 深入浅出三十天:表单与测试 Day01 - 前言

何谓表单? 维基百科是这样说的: 表单是一种带有空格可用於书写以及能选择和勾选相似内容的文件。 表...

Day 23 : Tkinter-利用Python建立GUI(基本操作及布局篇)

在进入Tkinter之前,先来讲讲GUI到底是甚麽。 GUI GUI其实就是图形使用者介面(Grap...

Day21 订单金流 -- 独立资料

昨天我们了解到最简单的流程以及结构, 今天我们稍微将现有的结构做一点变化, 为什麽要做变化呢? 主要...