由於我们需要有指标来衡量一个模型的好坏,而问题可以粗略分成「分类」和「回归」问题。而根据不同的问题,我们所选用的衡量指标也会不同。
关於分类问题,我们先介绍什麽是混肴矩阵,会在很多机器学习的应用场景看到这个名词哦!
如果分类问题假设只有分真和假,请看下图,左边栏位是代表实际的情况,上面栏位是代表预测的情况(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 (Receiver operator characteristic): 接收者操作特徵曲线,该曲线是由混淆矩阵算出
AUC (Area Under Curve): ROC 曲线下的面积
ROC 曲线是以 FPR 为 X 轴;以 TPR 为 Y 轴
FPR:
TPR:
假设我们现在有4个测试样本,label代表 ground truth(1表示真,0表示假),score则是为真的机率值
针对第一笔,只要是 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 是 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?可以自动驾驶吗?
有时候我们希望使用者输入的资料符合我们想要的格式,因此我们可以做一些设定,当使用者输入的资料不符合格...
我们首先先从UIkit开始,我们在Xcode 新建专案,并选择Storyboard 作为Interf...
何谓表单? 维基百科是这样说的: 表单是一种带有空格可用於书写以及能选择和勾选相似内容的文件。 表...
在进入Tkinter之前,先来讲讲GUI到底是甚麽。 GUI GUI其实就是图形使用者介面(Grap...
昨天我们了解到最简单的流程以及结构, 今天我们稍微将现有的结构做一点变化, 为什麽要做变化呢? 主要...