模型评估与选择

本文讨论了过拟合和欠拟合的概念,强调了模型复杂度和训练数据集大小对泛化性能的影响。介绍了模型选择的方法,如留出法、交叉验证和自助法,并重点讲解了PR曲线和ROC曲线在评估学习器性能中的应用,以及AUC作为性能度量的重要性。
摘要由CSDN通过智能技术生成

误差

过拟合

学习器把训练样本学习的“太好” ,将训练样本本身的特点,当做所有样本的一般性质,导致泛化性能下降。

欠拟合

训练样本的一般性质/特征尚未被学习器学到。

一般重点关注两个因素:模型复杂度和训练数据集大小。1.给定训练数据集,如果模型的复杂度太低,很容易出现欠拟合;如果模型复杂度过高,很容易出现过拟合;2.如果训练数据集中样本数过少,特别是比模型参数数量(按元素计)更少时,过拟合更容易发生。此外,泛化误差不会随训练数据集里样本数量增加而增大。

模型选择


在现实任务中,我们通常需要评估若干候选模型的表现并从中选择模型,这一过程称之为“模型选择(model selection)”。

通常我们通过实验来对模型的泛化误差进行评估并且选择较优的模型,为此需要“测试数据集”来测试模型对新样本的判别能力,以此估计模型的泛化性能。值得注意的是,在划分数据集时,应该使测试集和训练集尽可能互斥,即测试样本不出现在训练样本中。

评估方法

实际任务中往往会对学习器的泛化性能、时间开销、存储开销、 可解释性等方面的因素进行评估并做出选择。

留出法

 直接将数据集划分为两个互斥集合 ,训练/测试集划分要尽可能保持数据分布的一致性 (一般若干次随机划分、重复实验取平均值)。

交叉验证法

将数据集 D 划分为k个子集同样存在多种划 分方式,为了减小因样本划分不同而引入的差别,k 折交叉验 证通常随机使用不同的划分重复 p 次,最终的评估结果是这p次 k折交叉验证结果的均值。

留一法

假设数据集中包含m个样本,我们令k = m,则得到了交叉验证法的特例---留一法。留一法不受随机样本划分方式的影响,结果往往比较准确 ,但当数据集比较大时,计算开销难以忍受。

自助法

给定数据集D,我们使用如下方式获得数据集D'︰每次随机从D中挑选一个样本放入D'中,然后将此样本放回D中,使得该样本在下次采样中仍有可能被采到。如此重复m次后,得到一个大小为m的数据集D'。我们将D'用作训练果,将D―D'作为测试集。自助法对于数据集较小、难以有效划分训练/测试集时 很有用;由于改变了数据集分布可能引入估计偏差, 在数据量足够时,留出法和交叉验证法更常用。

性能度量

PR曲线

根据学习器的预测结果对样例进行排序,排在最前面的是学习器最可能认为是正例的样本,排在最后面的则是认为最不可能是正例的样本。按此顺序逐个把样本作为正例进行预测,则每次可计算出当前的查全率和查准率。以查全率为x轴,查准率为y轴,就得到了查准率-查全率曲线,简称‘P-R曲线’。

代码实现

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import roc_auc_score,roc_curve
from sklearn.metrics import precision_recall_curve
# 导入数据
y_true = [1, 0, 0, 1, 0, 0, 1, 1, 0, 1]
y_pre = [0.9, 0.4, 0.2, 0.6, 0.5, 0.4, 0.7, 0.4, 0.65, 0.35]

# y_pre须是预测为正例的概率
fpr,tpr,th = roc_curve(y_true, y_pre)
precision,recall,th = precision_recall_curve(y_true, y_pre)

# 设置画图参数
fig,ax = plt.subplots(1,2,figsize = (10,5))
ax[0].plot(precision,recall)
ax[0].set_xlabel("recall")
ax[0].set_ylabel("precision")

ax[0].set_title("PR")
plt.show()

结果:

ROC曲线

类似于P-R曲线根据学习器预测结果对样例排序,并逐个作为正例进行预测,以“假正例率”(FPR)为横轴,“真正例率”(TPR)为纵轴可得到ROC曲线,全称“受试者工作特征”(Receiver Operating Characteristic)曲线。相比于PR曲线,ROC曲线对样本类别的比例不敏感,更能反映模型预测性能。

AUC:若某个学习器的ROC曲线被另一个学习器的曲线“包住”,则后者性能优于前者;否者如果曲线交叉,可以根据ROC曲线下面积大小进行比较,也即AUC值。AUC 衡量了样本预测的排序质量,

代码实现

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import roc_auc_score,roc_curve
from sklearn.metrics import precision_recall_curve
# 导入数据
y_true = [1, 0, 0, 1, 0, 0, 1, 1, 0, 1]
y_pre = [0.9, 0.4, 0.2, 0.6, 0.5, 0.4, 0.7, 0.4, 0.65, 0.35]

# y_pre必须是预测为正例的概率
fpr,tpr,th = roc_curve(y_true, y_pre)
precision,recall,th = precision_recall_curve(y_true, y_pre)
auc_socre = roc_auc_score(y_true, y_pre)

print("auc=:{}".format(auc_socre))

# 设置画图参数
fig,ax = plt.subplots(1,2,figsize = (10,5))

# 设置X,Y轴名称
ax[1].plot(fpr,tpr)
ax[1].set_xlabel("fpr")
ax[1].set_ylabel("tpr")

ax[1].set_title("ROC")
plt.show()

结果

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值