0. 写在前面
本博客累积一些关于sklearn中model_selection中常用的函数.
1. 形成测试集和训练集
from sklearn.model_selection import train_test_split
Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine.data,wine.target,test_size=0.3,shuffle=True)
2. 交叉验证
2.1 cross_val_score
Q1: 返回的评价指标是什么?
A1: 默认每次交叉验证,使用estimator本身的评价指标,具体可以参考sklearn对该estimator的介绍。当然也可以通过参数scoring来改变
Q2 :交叉验证时,使用训练集还是全部的数据集?
A2 :严谨来说,应该使用训练集。当使用全部数据集时,存在这样一个问题:有一个数据集第一次交叉验证时被作为训练集,第二次被作为验证集,这就相当于提前告诉了模型一些数据信息,使得模型过拟合。所以要使用训练集作为交叉验证的全部数据,在每一次交叉验证时,一份作为验证集,其余作为训练集,在验证集上表现好的,还要再测试集上测试,最后得出答案。
Q3 :estimator是训练后的还是未训练的
A3 :未训练的
注意:交叉验证本身就是一个经验技术,帮助我们更好的判断模型的训练效果,但并不是在验证集和测试集上都表现好的模型就是一个好模型,因为我们不确定它们对所有未知数据的预测
from sklearn.model_selection import cross_val_score
cross_val_score(
estimator,
X,
y=None,
*,
groups=None,
scoring=None,
cv=None,
n_jobs=None,
verbose=0,
fit_params=None,
pre_dispatch='2*n_jobs',
error_score=nan,
)
Docstring:
Evaluate a score by cross-validation
顺便提一下,你可以通过以下代码查看所有的评价指标:
import sklearn
sorted(sklearn.metrics.SCORERS.keys())
2.2 KFold
也许你还会碰到KFold
对象用来交叉验证,它需要配合cross_val_score
来使用,具体的:
cv = KFold(n_splits=5, shuffle = True, random_state=42)
results = cross_val_score(estimator,X,y,cv=cv)
2.3 网格搜索交叉验证GridSearchCV
目的:使用网格搜索法进行穷尽搜索最好的参数对(一般是两个参数)。
使用:GridSearchCV实现了fit
和score
方法。如果estimator
本身实现了predict
、predict_proba
、decision_function
、transform
和inverse_transform
方法,则GridSearchCV的类对象也可以调用这些方法
GridSearchCV(
estimator, # √
param_grid, # √
*,
scoring=None, # √
n_jobs=None,
iid='deprecated',
refit=True,
cv=None, # √
verbose=0,
pre_dispatch='2*n_jobs',
error_score=nan,
return_train_score=False,
)
在实际使用中,一般下面的操作:
1. 定义一个字典类型变量param,其中key值是estimator的参数,value是该参数取值范围
2. 定义模型,该模型一定是未经过训练的
3. 定义交叉验证对象,可以使用KFold,该步可有可无
4. 定义GridSearchCV对象
5. 训练等后续操作