机器学习 --- 模型评估
你需要得到更好的模型,怎么判断模型更好呢?
在机器学习任务中,通常将训练集上的误差叫做训练误差或经验误差,在新样本上的误差叫做泛化误差,我们肯定是希望模型或者得到的学习器的训练误差越小越好,但是一般情况下,我们并不知道新的样本,所以我们只能关注于经验误差,但是经验误差就算是0,也不能保证泛化误差很小,相反,如果泛化误差很小,一般说明对样本中不重要的特征也记录下来了,一般就会导致过拟合。那么我们应该怎么根据训练集来判断模型之间的好坏呢?就需要一套评价标准。
你需要先得到训练集和测试集,怎么划分它们呢?
一帮情况下,我们会将得到的数据划分为训练集和测试集,通过测试集上的性能来近似评估训练出的模型的泛化性能,因为最终训练出的模型的参数和训练集有关,所以不同的划分方式,可能就会导致得到的模型参数不同,从而导致泛化性能也不同,下面是几种常用的划分训练集和测试集的方法。
- 留出法:直接将数据集划分为互斥的两个集合,一般70%-80%作为训练集,剩余的作为测试集,并且要注意的是,为了让训练的模型在整个数据集上的偏差较小,一般训练集和测试集中正负样本的数目是相同的,也就是正样本占50%,负样本占50%。
- 交叉验证法:这种方法将整个数据集划分为互斥的大小相似的k个子集,然后去其中一个作为验证集,一般k取10。若另k=m(样本数量),则每一个子集包含一个样本。这种划分的好处是,使得在训练集上训练的模型和数据集上想要训练出的模型较为相似,但是会导致需要训练的模型很多,计算量很大(因为在k次划分的时候,需要重复p次取不同的训练集训不同的模型)。
- 自助法 :每一次从数据集D中随机抽一个,假设数据集D有m个样本,那么该样本被抽到的概率为 1 m \frac{1}{m} m1,不被抽到的概率为 ( 1 − 1 m ) (1-\frac{1}{m}) (1−m1),抽取m次,则一个样本不被抽到的概率为 ( 1 − 1 m ) m (1-\frac{1}{m})^m (1−m1)m,当m趋于无穷的时候,一个样本不被抽到的概率近似为 1 e \frac{1}{e} e1(因为m是整数,所以先换元,再洛必达,便得到极限值),即一个样本不被抽到的概率近似为0.368,自助法在数据集较小,难以有效划分训练集和测试集时比较有效,但是自助法产生的数据集改变了初始数据集的分布,会引入估计偏差。
训练完模型之后,在验证集上测试的时候,用什么指标衡量好坏呢?
在衡量一个模型的好坏的时候,需要借助多种性能度量方法,一般有以下几种:
错误率与精度 ,这个完全就是按照你从测试集中的样本总数中,预测的错误的数量除以总数,从而得到错误率。
查准率、查全率与F1。
查准率,就是在自己预测的所有的正样本中,预测正确的正样本的比率。
查全率,就是在所有的正样本中,预测的正样本的数量与所有正样本的数量的比率。
F1 ,就是跟这两有关的一个函数
P-R曲线 通过将查准率作为纵轴,查全率作为横轴画的图。
ROC的纵轴为真正利率,横轴为假正利率。AUC为ROC下的面积。
云里雾里,考察的重点来哩!
ROC曲线的含义与作用
ROC曲线(Receiver Operating Characteristic Curve) 是一种常用于二分类模型的评价工具,用于可视化模型在不同分类阈值下的表现。ROC曲线描绘了 假正例率(FPR) 和 真正例率(TPR) 之间的关系,帮助我们评估模型在各种分类阈值下的分类能力。
这里提到的真正例率表示所有真样本中,预测出的正的比例,假正例率为所有假的样本中,预测出的正的比例。你看,ROC就是不一样,它既考虑正样本的分类能力,又考虑负样本下的预测分类能力,不像其他,只考虑一个。
AUC的定义
AUC(Area Under the Curve)是ROC(Receiver Operating Characteristic)曲线下的面积,衡量的是模型在不同分类阈值下的表现。AUC值越大,表示模型对正负类样本的区分能力越强。具体来说,AUC的值介于0和1之间,越接近1表示模型越好;AUC为0.5时表示模型表现与随机猜测相似。
AUC实际上刻画的是模型对正负类样本的整体区分能力,不受具体分类阈值的影响 。因此,AUC越高,表示模型在 几乎所有的分类阈值下 都能更好地区分正类和负类。
- AUC = 1:完美分类器,所有正类样本的分数都大于负类样本的分数。
- AUC = 0.5:随机分类器,模型无法有效地区分正负类,等同于随机猜测。
- AUC < 0.5 :模型性能很差,比随机猜测还要差。
AUC通过对ROC曲线下的面积计算得出,而ROC曲线是由不同的分类阈值下的 假正例率(FPR) 和 真正例率(TPR) 组成的。
计算AUC的过程
AUC的计算可以通过以下步骤来实现:
- 计算模型的输出概率
模型通常会输出每个样本属于正类的概率,而不是直接给出分类标签。AUC基于这些概率来评估模型的区分能力。 - 将样本按预测的概率排序
将所有测试样本按模型预测的概率从高到低排序,较高的概率表示模型更倾向于该样本是正类。 - 计算真正例率和假正例率
对于每个可能的阈值(即每个预测概率),计算TPR和FPR:
TPR(召回率) = True Positives True Positives + False Negatives \frac{\text{True Positives}}{\text{True Positives} + \text{False Negatives}} True Positives+False NegativesTrue Positives
FPR = False Positives False Positives + True Negatives \frac{\text{False Positives}}{\text{False Positives} + \text{True Negatives}} False Positives+True NegativesFalse Positives
然后,绘制ROC曲线,横轴是FPR,纵轴是TPR。 - 计算ROC曲线下的面积(AUC)
AUC值即为ROC曲线下的面积。常用的计算方法包括 梯形法则(Trapezoidal Rule) 来近似计算AUC。
AUC的实现
python
import numpy as np
from sklearn.metrics import roc_curve, auc
import matplotlib.pyplot as plt
# 假设y_true是真实标签,y_scores是模型预测的概率值
y_true = np.array([0, 0, 1, 1]) # 真实标签(0表示负类,1表示正类)
y_scores = np.array([0.1, 0.4, 0.35, 0.8]) # 模型预测的概率值
# 计算ROC曲线的FPR和TPR
fpr, tpr, thresholds = roc_curve(y_true, y_scores)
# 计算AUC
roc_auc = auc(fpr, tpr)
# 输出AUC
print(f'AUC: {roc_auc}')
# 绘制ROC曲线
plt.figure()
plt.plot(fpr, tpr, color='darkorange', lw=2, label='ROC curve (area = %0.2f)' % roc_auc)
plt.plot([0, 1], [0, 1], color='navy', lw=2, 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 (ROC)')
plt.legend(loc="lower right")
plt.show()
基础面试题
- 有哪些评价指标?
错误率、精度、查准率、查全率(Recall、查全率)、F1分数、ROC、AUC、PR曲线
AUC是ROC曲线的面积,衡量的是模型的分类能力,值越大表示模型越好,AOC等于0.5,相当于随机判断模型。 - AOC的计算方式?
ROC曲线下的面积,即梯度的面积公式