交叉验证实战

1.简单交叉验证

简单交叉验证方法是:首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作为测试集(例如,70%的数据为训练集,30%的数据为测试集);然后用训练集在各种条件下(例如,不同的参数个数)训练模型,从而得到不同的模型;在测试集上评价各个模型的测试误差,选出测试误差最小的模型。

2.S折交叉验证

应用最多的是S折交叉验证(S-fold cross validation),方法如下:首先随机地将已给数据切分为S个互不相交、大小相同的子集;然后利用S-1个子集的数据训练模型,利用余下的子集测试模型;将这一过程对可能的S种选择重复进行;最后选出S 次评测中平均测试误差最小的模型。

3.留一交叉验证

S折交叉验证的特殊情形是S = N,称为留一交叉验证(leave-one-out crossvalidation),往往在数据缺乏的情况下使用。这里,N是给定数据集的容量。

在这里插入图片描述

将拆分与评价合并执行

sklearn.model_selection.cross_val_score(

estimator :用于拟合数据的估计器对象名称 : array-like,用于拟合模型的数据阵

y = None : array-like,有监督模型使用的因变量

groups = None : array-like,形如(n_samples,),样本拆分时使用的分组标签scoring = None : string,callable or None,模型评分的计算方法

cv = None : int,设定交互验证时的样本拆分策略

   None,使用默认的3组拆分

   integer,设定具体的拆分组数

   object / iterable 用于设定拆分

   n_jobs = 1,verbose = 0,fit _params = Nonepre_dispatch = '2*n_jobs '

)返回:每轮模型对应评分的数组

#导入波士顿房价数据集
from sklearn.datasets import load_boston
boston = load_boston()
#导入线性回归模型
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
#将拆分与评价合并执行
from sklearn.model_selection import cross_val_score
scores = cross_val_score(reg,boston.data,boston.target,cv=10)
scores
array([ 0.73376082,  0.4730725 , -1.00631454,  0.64113984,  0.54766046,
        0.73640292,  0.37828386, -0.12922703, -0.76843243,  0.4189435 ])
scores.mean(),scores.std()
(0.20252899006056552, 0.5952960169512287)
scores = cross_val_score(reg,boston.data,boston.target,
                        scoring = 'explained_variance',cv=10)
scores
array([ 0.74784412,  0.5381936 , -0.80757662,  0.66844779,  0.5586898 ,
        0.74128804,  0.41981565, -0.11666214, -0.44561819,  0.42197365])
scores.mean()
0.2726395697941396

保证案例顺序的随机性

样本中案例顺序如果非随机,将会对模型验证带来严重的影响。

KFold等函数有一个内置的参数shuffle,可以要求在拆分数据前将数据索引随机排序(但该参数默认为False ) 。

cross_val_score等函数无此参数,因此必要时应当先对数据进行随机排序。

#对数据进行随机重排,保证拆分的均匀性
import numpy as np
X, y = boston.data,boston.target
indices = np.arange(y.shape[0])
np.random.shuffle(indices)
X, y = X[indices],y[indices]
from sklearn.linear_model import LinearRegression
reg = LinearRegression()
from sklearn.model_selection import cross_val_score
scores = cross_val_score(reg,X,y,cv=10)
scores
array([0.52652498, 0.64479681, 0.71332622, 0.77957089, 0.72579498,
       0.72621903, 0.75031061, 0.82087958, 0.60974587, 0.69110699])
scores.mean(),scores.std()
(0.698827597597641, 0.08145985882932301)

同时使用多个评价指标

cross_validate函数使用的参数基本和cross_val_score相同,但是功能上有以下扩展:

可以指定多个指标对模型进行评估。

除测试集得分之外,还会返回一个包含训练得分,拟合次数,得分次数的字典。

在这里插入图片描述

#同时使用多个指标评价
from sklearn.model_selection import cross_validate
scoring = ['r2','explained_variance']
scores = cross_validate(reg,X,y,cv=10,scoring = scoring,return_train_score = False)
scores
{'fit_time': array([0.0009985 , 0.00099707, 0.        , 0.00099754, 0.        ,
        0.00099707, 0.00099802, 0.00099802, 0.0009973 , 0.00099707]),
 'score_time': array([0.00199246, 0.00099778, 0.00099754, 0.00099707, 0.0009973 ,
        0.00099945, 0.00099349, 0.00099659, 0.00100994, 0.001019  ]),
 'test_r2': array([0.52652498, 0.64479681, 0.71332622, 0.77957089, 0.72579498,
        0.72621903, 0.75031061, 0.82087958, 0.60974587, 0.69110699]),
 'test_explained_variance': array([0.52675173, 0.64615136, 0.71723182, 0.78034103, 0.75457833,
        0.7437355 , 0.75721027, 0.83083647, 0.61009188, 0.69155294])}
scores['test_r2'].mean()
0.698827597597641

使用交互验证后的模型进行预测

sklearn.model_selection.cross_val_predict(

estimator, x, y = None,groups = None, cv = Nonen_jobs = 1, verbose = 0, fit_params = None

pre_dispatch = ‘2*n_jobs’

method = ‘predict’ :指明估计器使用的预测命令

method = 'predict _proba’时,各列按照升序对应各个类别

)返回: ndarray,模型对应的各案例预测值

from sklearn.model_selection import cross_val_predict
pred = cross_val_predict(reg,X,y,cv=10)
pred[:10]
array([22.86797177, 19.21452593, 35.87564631, 15.69494715, 16.97841578,
       19.70808991, 24.73419866, 21.24975714, 20.34802558, 24.82573974])
from sklearn.metrics import r2_score
r2_score(y,pred)
0.7143750140718722

  • 9
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值