holdout交叉验证K折交叉验证可以得到模型的泛化误差的可靠估计(模型在新数据集是的性能表现)。


holdout交叉验证

holdout交叉验证是机器学习模型泛化性能的一个经典且常用的方法

holdout交叉验证能将最初的数据集分为训练集和测试集

 

模型选择:对模型的的不同参数设置进行调优和比较的过程,也就是针对给定分类问题,调整参数以寻找最优值(超参)的过程。

 

使用holdout进行模型选择更好的方法:将数据划分为三个部分,训练集,测试集,验证集。

训练集:用于不同模型的拟合,模型在验证集上的性能表现作为模型选择的标准

 

不使用测试集用于模型训练以及模型选择的优势:

       评估模型应用于新数据上能够获得较小偏差



holdout过程:



holdout缺点:模型性能评估对训练集划分为训练以及验证子集的方法是敏感的,评价的结果随样本的不同而发生变化



K折交叉验证

K折交叉验证将k个训练子集重复holdout方法k次。

K折交叉验证不重复的随机将训练集划分为k个,k-1个用于训练,剩余一个用于测试,重复该过程k次,得到k个模型对模型性能的评价。

 

基于评价结果可以计算平均性能。

与holdput相比,这样得到的结果对数据划分方法敏感度相对较低

 

一般情况将K折交叉验证用于模型调优找到使得模型泛化性能最优的超参值。,找到后,在全部训练集上重新训练模型,并使用独立测试集对模型性能做出最终评价。

 

K折交叉验证使用了无重复抽样技术的好处:每次迭代过程中每个样本点只有一次被划入训练集或测试集的机会



K折交叉验证图:




如果训练数据集相对较小,则增大k值。

增大k值,在每次迭代过程中将会有更多的数据用于模型训练,能够得到最小偏差,同时算法时间延长。且训练块间高度相似,导致评价结果方差较高。

 

如果训练集相对较大,则减小k值。

减小k值,降低模型在不同的数据块上进行重复拟合的性能评估的计算成本,在平均性能的基础上获得模型的准确评估。



K折交叉验证的一个特例:

 留一(LOO)交叉验证法:将数据子集划分的数量等于样本数(k=n),每次只有一个样本用于测试,数据集非常小时,建议用此方法。

 

K折交叉验证改进成的 分层K折交叉验证:

       获得偏差和方差都低的评估结果,特别是类别比例相差较大时。

 

实现K折交叉验证:

使用数据集中的类标y_train初始化sklearn.cross_validation模块下的StratifiedKFold迭代器,通过n_folds参数设置块的数量。

使用kfold在k个块中迭代时,使用train中返回的索引去拟合流水线,通过pipe_lr流水线保证样本都得到适当的缩放。

使用test索引计算模型的准确率,存在score中。



# 使用k-fold交叉验证来评估模型性能。
import numpy as np
from sklearn.cross_validation import StratifiedKFold

kfold = StratifiedKFold(y=y_train, 
                        n_folds=10,
                        random_state=1)

scores = []
for k, (train, test) in enumerate(kfold):
    pipe_lr.fit(X_train[train], y_train[train])
    score = pipe_lr.score(X_train[test], y_train[test])
    scores.append(score)
    print('Fold: %s, Class dist.: %s, Acc: %.3f' % (k+1, np.bincount(y_train[train]), score))
    
print('\nCV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))



使用SKlearn实现分层K折交叉验证:


from sklearn.cross_validation import cross_val_score

scores = cross_val_score(estimator=pipe_lr, 
                         X=X_train, 
                         y=y_train, 
                         cv=10,
                         n_jobs=1)
print('CV accuracy scores: %s' % scores)
print('CV accuracy: %.3f +/- %.3f' % (np.mean(scores), np.std(scores)))



cross_val_score方法特点:将不同分块的性能评估分布到多个CPU上进行处理。

n_jobs:CPU个数,-1为选择全部CPU







Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐