第三周的理论课课后作业,对模型进行评估
对Iris数据集,分别采用SVM算法的线性核、高斯核函数,数据集划分方法分别采用留出法、10折交叉验证法、自助法(可选),性能度量分别采用计算错误率、精度、第一类的查准率和查全率、F1、ROC绘制(可选)进行实验。以表格形式呈现结果,并适当进行分析讨论。(参考网址:https://www.cnblogs.com/luyaoblog/p/6775342.html)
概述
我们通常把学习器的预测和真实值之间的差异成为误差,在训练集上的误差成为训练误差,而在新样本(测试集)上的误差成为泛化误差。显然我们希望得到的是泛化误差小的学习器。本次学习的重点,便是如何利用一组样本,来训练和测试学习器的性能,其中使用到样本的分组方法和性能的度量方法。
一、样本分组
样本分组要尽可能满足训练集和测试集互斥,因为我们更希望测试学习器“举一反三”的能力。若测试集与训练集部分重合,相当于“泄题”。
留出法
简单地说就是选取一部分样本作为训练集,剩余的样本为测试集
在使用留出法时,需要注意:
- 要有足够的样本量,以保证训练模型的效果
- 在划分时注意保证数据分布的一致性(如:500个样本 中正例和反例的比为2:3,则在训练集和测试集中正例和反例的比也要求为2:3),只需要采用随机分层抽样即可
- 为了减弱随机划分的影响,重复划分训练集和测试集,对得到的多次结果取平均作为最后的结果
- 一般训练集和测试集的比例在8:2或者7:3
当然留出法的缺点也非常明显,即它会损失一定的样本信息;同时需要大样本。
代码
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=1, train_size=0.7)
train_test_split返回的是样本的内容,而非索引
random_state:随机种子数,当设定值(一般为0)后可方便调参,因为每次生成的数据集相同
train_size:小于1是训练组占全体的百分比,大于1的整数是训练组样本个数
交叉验证法
交叉验证法(cross validation)可以很好地解决留出法的问题,它对数据量的要求不高,并且样本信息损失不多。
交叉验证法把样本分为k个大小相同的互斥子集,选取一个子集作为测试集而其他作为训练集,那么就得到了k组训练集/测试集。
显然,交叉验证法结果的稳定性和保真性很大程度取决于k的选择,为了强调这一点,交叉验证法也称作“k折交叉验证法”,k最常取的是10,也有取5或者20的。(图示k=5)
如果想对数据集重复几次使用交叉验证法划分的话,使用RepeatedKFold函数即可,其中多了一个参数n_repeats
与留出法相比,交叉验证法的数据损失较小,更加适合于小样本,但是其计算复杂度变高,存储空间变大。极端的说来,如果将数据集D(m个样本)分成m份,每次都取m-1个样本为训练集,余下的那一个为测试集。共进行m次训练和测试。这种方法被叫做留一法。
代码
from sklearn.model_selection import KFold, StratifiedKFold
kf1 = StratifiedKFold(n_splits=10, shuffle=False, random_state=None)
kf2 = KFold(n_splits=10, shuffle=False, random_state=None)
for train, test in kf1.split(x, y):
x_train, x_test, y_train, y_test = x[train], x[test], y[train], y[test]
clf.fit(x_train, y_train.ravel())
y_hat = clf.predict(x_test)
函数返回的是样本序号。
StratifiedKFold和KFold都能实现交叉验证法,其中StratifiedKFold是分层分组,KFold不分层
n_splits:分组数
shuffle:在每次划分时,是否进行洗牌
若为False,其效果相当于random_state为整数(含零),每次划分的结果相同
若为True,每次划分的结果不一样,表示经过洗牌,随机取样的
random_state:随机种子数,当设定值(一般为0)后可方便调参,因为每次生成的数据集相同
自助法
暂略
二、性能度量
性能度量(performance measure)是衡量模型泛化能力的评价标准。
性能度量反映了任务需求,对于一个模型,使用不同的性能度量进行评判往往会得到不同的结果。这意味着模型好坏的是对的,一个模型是好的,不仅取决于算法和数据,还取决于任务需求。
回归任务常用的性能度量是均方误差
E = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 E=1m \sum_{i=1}^{m} (f(x_i)-y_i)^2 E=1mi=1∑m(f(xi)−yi)2
分类任务常用的性能度量有错误率、精度查、准率、查全率、F1等
混淆矩阵
对于二分类问题,可以将样例分为真正类(true positive)、假正类(false positive)、正负类(true negative)、假负类(false negative)。分类结果如混淆矩阵(ocnfusion matrix)所示
显然,
正类样本个数=TP+FN
负类样本个数=FP+TN
预测为正类样本个数=TP+FP
预测为负类样本个数=FN+TN
对于多分类问题,如有类0、类1、类2,那么对于类0而言,类0是正类,类1、类2是负类
错误率与精度
-
错误率(error)
错误率即预测错误的样本个数占全体样本的比值
E = n c o r r e c t n t o t a l = 1 m ∑ i = 1 m ( f ( x i ) − y i ) 2 \begin{aligned} E= & \frac {n_{correct}} {n_{total}}\\ =& \frac 1m \sum_{i=1}^{m} (f(x_i)-y_i)^2 \end{aligned} E==ntotalncorrectm1i=1∑m(f(xi)−