机器学习:
分类评估模型及优化之交叉验证
交叉验证的三种基本方法:
1、将拆分与评价合并执行
sklearn.model_selection.cross_val_score
2、同时使用多个评价指标
sklearn.model_selection.cross_validate
3、使用交叉验证后的模型进行预测
sklearn.model_selection.cross_val_predict
交叉验证
一种常用的模型选择方法是交叉验证(cross validation)。
如果给定的样本数据充足,进行模型选择的一种简单方法是随机地将数据集切分成三部分,分别为训练集(training set)、验证集(validation set) 和测试集(test set)。训练集用来训练模型,验证集用于模型的选择,而测试集用于最终对学习方法的评估。在学习到的不同复杂度的模型中,选择对验证集有最小预测误差的模型。由于验证集有足够多的数据,用它对模型进行选择也是有效的。
但是,在许多实际应用中数据是不充足的。为了选择好的模型,可以采用交叉验
证方法。交叉验证的基本想法是重复地使用数据;把给定的数据进行切分,将切分的数据集组合为训练集与测试集,在此基础上反复地进行训练、测试以及模型选择。
1、简单交叉验证:
简单交叉验证方法是:首先随机地将已给数据分为两部分,一部分作为训练集,另一部分作 为测试集(例如,70%的数据为训练集,30%的数据为测试集);然后用训练集在各种条件下(例如,不同的参数个数)训练模型,从而得到不同的模型:在测试集上评价各个模型的测试误差,选出测试误差最小的模型。
2、S折交叉验证:
应用最多的是s折交叉验证(S-fold cross validation),方法如下:首先随机地将已给数据切分为S个互不相交、大小相同的子集;然后利用S- 1个子集的数据训练模型,利用余下的子集测试模型;将这-过程对可 能的s种选择重复进行:最后选出S次评测中平均测试误差最小的模型。
3、留一交叉验证
S折交叉验证的特殊情形是S = N,称为留一交叉验证(leave-one-out cross validation),往往在数据缺乏的情况下使用。这里,N是给定数据集的容量。
from sklearn import model_selection
2、导入波士顿房价数据集
from sklearn.datasets import load_boston
boston = load_boston()
3、导入线性模型并进行实例化
#导入线性模型
from sklearn.linear_model import LinearRegression
#实例化
reg = LinearRegression()
4、导入交叉验证模型
from sklearn.model_selection import cross_val_score
5、进行交叉验证
scores = cross_val_score(reg,boston.data,boston.target,cv = 10)#reg模型 boston.data 验证的数据 cv测试次数
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.20252899006056163, 0.5952960169512315)
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.2726395697941379
【注意】:
样本中案例顺序如果非随机,将会对模型验证带来严重的影响。因此需要保证案例顺序的随机性。
通过对数据进行随机排序,重新进行交叉验证
1.1、对数据进行随机编排,保证拆分的均匀性
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]
1.2、导入线性模型并进行实例化
#导入线性模型
from sklearn.linear_model import LinearRegression
#实例化
reg = LinearRegression()
1.3、导入交叉验证库并进行交叉验证
from sklearn.model_selection import cross_val_score
scores = cross_val_score(reg,X,y,cv = 10)
scores
结果为:
array([0.55846953, 0.81187287, 0.62829828, 0.78075856, 0.76837108,
0.83054805, 0.74590663, 0.45446651, 0.69433869, 0.5928207 ])
scores.mean(),scores.std()
结果为:
(0.6865850907284173, 0.11749079152594104)
cross_validate函数使用的参数基本和cross_val_score相同,但功能上有以下扩展: 1、可以指定多个指标对模型进行评估 2、除测试集得分外,还会返回一个包含训练得分,拟合次数,得分次数的字典
1、导入相应的交叉验证库并进行实例
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.0029912 , 0.00099635, 0.00099587, 0.00099659, 0. ,
0.00099707, 0.00099683, 0.0009954 , 0.00099564, 0. ]),
'score_time': array([0. , 0.00099707, 0. , 0. , 0.00099707,
0. , 0.00099659, 0.00099707, 0.00099659, 0.00099659]),
'test_r2': array([0.55846953, 0.81187287, 0.62829828, 0.78075856, 0.76837108,
0.83054805, 0.74590663, 0.45446651, 0.69433869, 0.5928207 ]),
'test_explained_variance': array([0.55901873, 0.81190504, 0.64414581, 0.7837994 , 0.79016637,
0.83990847, 0.76482864, 0.46429681, 0.69911918, 0.60911221])}
2、交叉验证结果
scores["test_r2"].mean()
结果为:
0.6865850907284173
1、导入交叉验证相应的库
from sklearn.model_selection import cross_val_predict
2、实例化并进行交叉验证
pred = cross_val_predict(reg,X,y,cv = 10)
pred[:10]
结果为:
array([24.15390676, 28.72708662, 15.20575846, 15.84827014, 21.35570108,
23.83676297, 12.95200048, 37.07211543, 19.51976817, 0.61335644])
from sklearn.metrics import r2_score
r2_score(y,pred)
结果为:
0.7212971277918162