交叉验证——(监督)学习器性能评估方法
一、思考:交叉验证有什么好值得我们使用的?
每个算法模型都需要经过两个阶段:训练和验证。
1) 一般情况下的,我们用的方法是:将原始数据集分为 训练数据集 & 测试数据集。
优点:是,但仅仅是思路正确。
缺点:思路正确,但是方法不够高明。
分析:一方面,如果不把原始数据集划分为 训练数据集&测试数据集,而是直接使用,结果会是过拟合、泛化能力极低(即模型完美于预测原始数据,完败于预测原始样本集之外的任何数据);而划分之后,就可以用 训练数据集训练模型,得到算法参数;
但是我们得到的这个算法参数,其实是从一系列参数中对比的来的,这意味着测试数据集的信息会被间接地泄露出来,参数调整的越多、泄露得越多,测试数据集的意义越低;
所以为了防止这个问题,一个好的方法是从训练数据集中划出一部门数据我们称之为“validation set”(验证数据集),在用它评估得到的模型进行验证;
最后再用测试数据集对标模型的输出,检验算法的泛化能力
——这即是它的优点;
2)另一方面,把原始数据集分割之后,用来训练模型的数据集大大减小,同时训练结果也更大的依赖于训练数据集和测试数据集占原始数据集的比重。
一个解决方法就是cross-validation(交叉检验),缩写CV。
此时,任然需要一个测试数据集以进行最终评估,但是“validation set”就不需要了。在名为k-fold CV的基本方法中,训练集被分成k个较小的集合/k-folds(还有其他方法,但通常遵循相同的原则),然后如图进行一下操作:
分别让一个fold作为测试集,余下部分作为训练集,进行k次训练,共计得到k个参数。最终使用均值作为最终的模型参数。
缺点:相同大小的数据集,需要进行更多的运算。
优点:最大特点是不再浪费validation set大小的数据,尤其是在样本集不够大的情况下。
二、如果我想在python使用cross-validation,怎么操作呢?
一个简单的方法就是引用cross_val_score()函数。官方文档链接。
1)首先认识一下CV函数:
-
sklearn.model_selection.cross_val_score(
-
estimator,
-
X,
-
y=None,
-
groups=None,
-
scoring=None,
-
cv=’warn’,
-
n_jobs=None,
-
verbose=0,
-
fit_params=None,
-
pre_dispatch=‘2*n_jobs’,
-
error_score=’raise-deprecating’)
2)举个栗子:
我们用SVM()/support vector machines(支持向量机)中的SVC分类算法为例:
-
from sklearn.model_selection import cross_val_score
-
clf = svm.SVC(kernal='linear', C=1)
-
scores = cross_val_score(clf, iris.data, iris.target, cv =5)
-
print(scores)
array([0.96..., 1. ..., 0.96..., 0.96..., 1. ])
3)认识常用参数:
3.1 必选参数部分:
estimator:就是自己选定的模型;
X:array类型数据。训练集(自变量部分);
3.2)可选参数部分:
y:array类型数据。训练集(因变量部分);
cv:int类型。设定cross-validation的维度。输入可以是:
· 测试最优k-fold值的 & 迭代产生的序列,
· 整数:自行设定k-fold的值,
· 不设定cv:使用默认值3,即k-fold=3,
· 用作交叉验证迭代器的对象,