一. 分类模型评估指标
1.1 混淆矩阵
1.1.1 混淆矩阵介绍
混淆矩阵(Confusion Matrix)是在机器学习中,用于对分类模型的性能进行评估的一种方法。混淆矩阵展示了模型在分类任务中的预测结果与实际标签之间的对应关系。
混淆矩阵通常是一个二维矩阵,其中每一行代表着实际标签的类别,每一列代表着预测结果的类别。在二分类问题中,混淆矩阵包括四个元素,它们分别是:
- 真正例(True Positive, TP):表示模型将正样本正确地预测为正样本的数量。
- 假负例(False Negative, FN):表示模型将正样本错误地预测为负样本的数量。
- 假正例(False Positive, FP):表示模型将负样本错误地预测为正样本的数量。
- 真负例(True Negative, TN):表示模型将负样本正确地预测为负样本的数量
1.1.2 混淆矩阵案例
假设现在有一个二元分类问题关于男生女生分类:
总共100人,有40个女生,60个男生,
目标:找出所有女生
结果:选了40个人,35个是女生,5个是男生
画出混淆矩阵:
1.1.3 混淆矩阵的延伸评价指标:
1.正确率(Accuracy):被正确分类的样本比例或数量
(TP+TN)/Total = (35+50)/100 = 85%
2.错误率(Misclassification/Error Rate):被错误分类的样本比例或数量
(FP+FN)/Total = (5+10)/100 = 15%
3.真阳率(True Positive Rate)|召回率(recall):分类器预测为正例的样本占实际正例样本数量的比例,也叫敏感度(sensitivity)或召回率(recall),描述了分类器对正例类别的敏感程度。
TP/ actual yes = 35/40 = 87%
4.假阳率(False Positive Rate):分类器预测为正例的样本占实际负例样本数量的比例。
FP/actual no = 10/60 = 17%
5.特异性(Specificity):实例是负例,分类器预测结果的类别也是负例的比例。
TN/actual no = 50/60 = 83%
6 精度率(Precision):针对预测结果的,预测为正的样本中真正的正阳本所占比例
TP/predicted yes = 35/45 = 77%
7.流行程度(Prevalence):正例在样本中所占比例。
Actual Yes/Total = 40/100 = 40%
8 通过率:模型判断为好样本的数占总样本数比例
Actual Yes/Total = 40/100 = 40%
9 坏账率: 模型判断为好样本中真正的坏样本所占比例。
FP/FP+TP = 10/10+35 = 22.2%
1.2 ROC曲线
1.2.1 ROC曲线介绍
Roc曲线:即接收者操作特征曲线(receiver operating characteristic curve),反映了真阳性率(灵敏度)和假阳性率(1-特异度)之间的变化关系。Roc曲线越趋近于左上角,预测结果越准确。
其公式为:
在ROC曲线图中,每个点以对应的 F P R FPR FPR值为横坐标,以 T P R TPR TPR值为纵坐标
1.2.2 ROC曲线的绘制步骤
- 假设已经得出一系列样本被划分为正类的概率Score值,按照大小排序。
- 从高到低,依次将“Score”值作为阈值threshold,当测试样本属于正样本的概率大于或等于这个threshold时,我们认为它为正样本,否则为负样本。举例来说,对于某个样本,其“Score”值为0.6,那么“Score”值大于等于0.6的样本都被认为是正样本,而其他样本则都认为是负样本。
- 每次选取一个不同的threshold,得到一组FPR和TPR,以FPR值为横坐标和TPR值为纵坐标,即ROC曲线上的一点。
- 根据3中的每个坐标点,画图。
1.2.3 ROC案例
上图显示了一个概率分类器对 10 个元组返回的概率值,按概率的递减排序。图中正例和负例都是 5 个,P = F = 5,我们可以确定 TP、FP、TN、FN、TPR、FPR的值。 1 号概率最高,我们假设把这个概率设为阈值,t = 0.9 。那么,分类器就会分类, 1 号为正例,其他的元组都是负例。从而获得 TP = 1,FP = 0.在其余 9 个负例中,5 个实际为负 TN = 5,4 个实际为正,FN = 4.但是我们只需要计算 TPR 和 FPR,TN 和 FN都没用。
TPR=0.2,FPR=0
从而我们获得一个点(0,0.2)
然后,设置 t 为元组 2 的概率值是 0.8 ,因而该元组现在也被视为正,而元组 3~10都被看做负。元组 2 的实际标号是正,TP = 2,像上述一样可以计算出点 (0,0.4).接下来考察元组 3 的类标号并令 t = 0.7,把他看作正的,就会出事儿了,本身是负例,这里出现了假正例,FP = 1,所以产生点(0.2,0.4)以此推下去。就会得到下面的左图。
有许多方法可以从这些点得到一条曲线,最常用的就是凸包,图中还有一条对角线,对模型的每个真正例元组,好像都遇到一个假正例元组。这条直线代表随机猜测,目的是方便比较。
右图显示了两个分类模型的 ROC 曲线,一条对角线。模型的ROC曲线离对角线越近,模型的准确率越低。如果模型真的很好,随着有序列表(第一张由元组标号的图)向下移动,开始就可能遇到真正例元组,图开始就陡峭地从 0 开始上升,后来遇到的真正例越来越少,假正例越来越多,曲线平缓变得更加水平。
为了评估模型的准确率,可以测量曲线下方的面积(AUC)。有一些软件包可以用来进行这些计算。面积越接近 0.5 ,模型的准确率越低。完全正确的模型面积为 1.0。
1.2.4 ROC代码
# 导入所需库
from sklearn.svm import SVC
from sklearn.metrics import roc_curve
from sklearn.datasets import make_blobs
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
# 创建数据集
X, y = make_blobs(n_samples=(4000, 500), cluster_std=[7, 2], random_state=7)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# 训练分类器
clf = SVC(gamma=0.05).fit(X_train, y_train)
# 计算 ROC 曲线
fpr, tpr, thresholds = roc_curve(y_test, clf.decision_function(X_test))
# 绘制 ROC 曲线
plt.plot(fpr, tpr, label='ROC')
plt.xlabel('FPR')
plt.ylabel('TPR')
plt.show()
1.3 PR曲线
1.3.1 PR曲线介绍
PR曲线中的P代表的是precision(精准率),R代表的是recall(召回率),其代表的是精准率与召回率的关系,一般情况下,将recall设置为横坐标,precision设置为纵坐标。
公式为:
说明:
一条PR曲线要对应一个阈值(统计学的概率)。通过选择合适的阈值(比如K%)对样本进行合理的划分,概率大于K%的样本为正例,小于K%的样本为负例,样本分类完成后计算相应的精准率和召回率,最后我们会得到对应关系,如下图所示。
1.3.2 PR曲线绘制步骤
PR曲线的横坐标为召回率R,纵坐标为精确率P
- 将预测结果按照预测为正类概率值排序
- 将阈值由1开始逐渐降低,按此顺序逐个把样本作为正例进行预测,每次可以计算出当前的P,R值
- 以P为纵坐标,R为横坐标绘制图像
1.3.3 PR曲线案例
编号 | 类 | 概率 | TP | FP | TN | FN | precision | recall |
1 | P | 0.9 | 1 | 0 | 3 | 1 | 1 | 0.25 |
2 | P | 0.7 | 2 | 0 | 3 | 0 | 1 | 0.4 |
3 | N | 0.6 | 2 | 1 | 2 | 0 | 2/3 | 0.5 |
4 | N | 0.5 | 2 | 2 | 1 | 0 | 0.5 | 2/3 |
5 | N | 0.3 | 2 | 3 | 0 | 0 | 0.4 | 1 |
上图显示了一个概率分类器对 5 个元组返回的概率值,按概率的递减排序。图中正例为2和负例为3,P =2, F = 3,我们可以确定 TP、FP、TN、FN、TPR、FPR的值。 1 号概率最高,我们假设把这个概率设为阈值,t = 0.9 。那么,分类器就会分类, 1 号为正例,其他的元组都是负例。从而获得 TP = 1,FP = 0.在其余 4 个负例中,3个实际为负 TN = 3,1 个实际为正,FN = 1。
precision=1,recall=0.25
从而我们获得一个点(1,0.5)
然后,设置 t 为元组 2 的概率值是 0.7 ,因而该元组现在也被视为正,而元组 3~5都被看做负。元组 2 的实际标号是正,TP = 2,像上述一样可以计算出点 (1,0.4).接下来考察元组 3 的类标号并令 t = 0.7,把他看作正的,就会出事儿了,本身是负例,这里出现了假正例,FP = 1,所以产生点(0.33,0.5)以此类推下去。
1.3.3 PR曲线代码
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
X, y = make_blobs(n_samples=200, centers=2, random_state=22)
precision = []
recall = []
# 设置阈值从X的最小值到最大值之间均匀取200个点
for threshold in np.linspace(np.min(X), np.max(X), 200):
# 根据阈值将预测结果转化为二元分类
predicted = (X[:, 0] >= threshold).astype(int)
# 计算真阳性数量
true_positive = np.sum((predicted == 1) & (y == 1))
# 计算假阳性数量
false_positive = np.sum((predicted == 1) & (y == 0))
# 计算假阴性数量
false_negative = np.sum((predicted == 0) & (y == 1))
# 计算精确度,即真阳性/(真阳性+假阳性)
precision.append(true_positive / (true_positive + false_positive))
# 计算召回率,即真阳性/(真阳性+假阴性)
recall.append(true_positive / (true_positive + false_negative))
# 绘制PR曲线
plt.plot(recall, precision)
plt.xlabel('Recall')
plt.ylabel('Precision')
plt.title('PR Curve')
plt.show()
二. 回归模型评估指标
2.1.SSE(和方差)
SSE越接近于0,说明模型选择和拟合更好,数据预测也越成功。接下来的MSE和RMSE因为和SSE是同出一宗,所以效果一样
2.2 MSE(均方差)
该统计参数是预测数据和原始数据对应点误差的平方和的均值,也就是SSE/n,和SSE没有太大的区别,计算公式如下
2.3 RMSE(均方根)
该统计参数,也叫回归系统的拟合标准差,是MSE的平方根,就算公式如下
在这之前,我们所有的误差参数都是基于预测值(y_hat)和原始值(y)之间的误差(即点对点)。从下面开始是所有的误差都是相对原始数据平均值(y_ba)而展开的(即点对全)
2.4 R-Squared(确定系数)
在讲确定系数之前,我们需要介绍另外两个参数SSR和SST,因为确定系数就是由它们两个决定的
(1)SSR:Sum of squares of the regression,即预测数据与原始数据均值之差的平方和,公式如下
(2)SST:Total sum of squares,即原始数据和均值之差的平方和,公式如下
可发现SST=SSE+SSR,我们的“确定系数”是定义为SSR和SST的比值,故
其实“确定系数”是通过数据的变化来表征一个拟合的好坏。由上面的表达式可以知道“确定系数”的正常取值范围为[0 1],越接近1,表明方程的变量对y的解释能力越强,这个模型对数据拟合的也较好
如果结果是0,就说明我们的模型跟瞎猜差不多。
如果结果是1。就说明我们模型无错误。
如果结果是0-1之间的数,就是我们模型的好坏程度。
如果结果是负数。说明我们的模型还不如瞎猜。(其实导致这种情况说明我们的数据其实没有啥线性关系)
2.5 MAE(平均绝对误差)
是绝对误差的平均值。可以更好地反映预测值误差的实际情况。
三、模型评估方法
我们经常把整个数据集分成两部分,一部分用于训练,一部分用于验证,这也就是我们经常提到的训练集(training set)和测试集(test set)。这种评估方法在数据量较小的情况下不太适用。基于这样的背景,有人就提出了Cross-Validation方法,也就是交叉验证。
3.1 交叉验证(Cross-Validation)
我们先介绍LOOCV方法,即(Leave-one-out cross-validation)。像Test set approach一样,LOOCV方法也包含将数据集分为训练集和测试集这一步骤。但是不同的是,我们现在只用一个数据作为测试集,其他的数据都作为训练集,并将此步骤重复N次(N为数据集的数据数量)。
结果就是我们最终训练了n个模型,每次都能得到一个MSE。而计算最终test MSE则就是将这n个MSE取平均。
3.2 自助法(bootstrap)
自助法直接以自助采样法为基础。给定包含m个样本的数据集D,对他进行采样产生数据集D(new),每次随机从D中挑选一个样本,将其拷贝放入D(new)里面,然后再将该样本放回原始数据集D中,使得该样本在下次采样时仍有可能被采到,这个过程重复执行m次,就得到了包含m个样本的数据集D(new)。
初始数据集D中约有36.8%的样本未出现在新的数据集里面,于是可以将新的数据集用作训练集,原始数据集剔除新数据集内元素后作为测试集。这样,实际评估的模型与期望的评估的模型都使用m个训练样本,而仍有三分之一的没在训练集出现的样本用作测试。这样的测试结果,称为保外估计(out-of-bad estimate)
自助法在数据集较小的时候有用,但是会新的数据集会改变原始的数据分布,引入估计偏差。
后续仍在完善中,有错误希望大家指出!!!