【大数据专业】机器学习分类模型评估和优化之交叉验证的多种方法

学习目标:

机器学习
分类评估模型及优化之交叉验证
交叉验证的三种基本方法:
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是给定数据集的容量。

模型评估:

【大数据专业】机器学习分类模型评估和优化之交叉验证的多种方法_第1张图片

实验过程:

一、将拆分与评价合并执行

【大数据专业】机器学习分类模型评估和优化之交叉验证的多种方法_第2张图片
1、导入所需的数据库

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

你可能感兴趣的:(python,jupyter,机器学习,分类算法)