目录
在调参过程中,由于是根据测试集测试模型效果的,因此测试集的信息会泄露进模型,从而使得模型效果变好。应该单独取一数据集作预测来查看预测的一般性能。即训练集做训练(训练模型)、评价集选模型(通过得分评价模型挑选出一个模型中最合适的参数)、测试集检验结果(对参数最佳的多种模型进行选择,从而得到最佳模型)。也可将训练集做训练、评价集选模型合为一个,做交叉验证(如网格搜索)来获得一个模型的最佳参数;用测试集选择不同模型中最佳者。
from sklearn import model_selection
一、将数据集拆分为训练/测试集(一次)
抽样时要尽可能保持数据分布的一致性,避免引入额外的偏差。
model_selection.train_test_split(data, target, test_size, train_size, random_state, shuffle, stratify)
将列表、数组、矩阵或DataFrame随机拆分为训练集和测试集构成的元组(X_train, X_test, y_train, y_test)(若输入是稀疏的则返回scipy.sparse.csr_matrix,否则数据类型同输入)。
data
、target
是位置参数,分别为特征数组或矩阵、目标数组后矩阵。test_size
指定测试集的大小,小数则表示占比,整数表示样本量,缺失默认0.25。train_size
指定训练集的大小。random_state
指定随机数种子。shuffle
是否在拆分前先打乱原数据,为False时stratify必须为None。stratify
是用来标识分层的数组作为分层抽样依据,为None时将按顺序拆分为训练和测试集。
一般将训练样本和测试样本分为8:2或7:3。更好的方式是将数据分为3份:训练集:交叉验证数据集:测试集=6:2:2(交叉验证数据集用于选择模型,测试集用于测试准确性,使选择模型与评价预测性能分开)。
二、交叉验证生成器:K折交叉验证时的数据集索引拆分方法
仅实例化(未考虑数据分布),需用split()返回**(训练集索引, 测试集索引)**构成的生成器。也可直接作为交叉验证的cv参数值。
1、K折交叉验证抽样
将数据拆分为k份(尽可能均分),每次取一份做测试集,其余做训练集。
model_selection.KFold(n_splits=3, shuffle=False, random_state=None)
将数据集通过索引连续的(不分层)拆分成训练集/测试集,之后在交叉验证中每次取一折作为测试样本,其余作为训练样本。
n_splits
指定数据集拆分次数(K折)。shuffle
是否在拆分前分层。random_state
随机种子。
方法:split(X, y=None, groups=None)对X、y进行抽样拆分,返回拆分后数据(tain, test)的生成器,每个是一组数据的索引。groups指定样本对应的组,用于抽样。
2、指定次数重复K折交叉验证抽样
对数据重复指定次数的k折交叉验证,避免一次K折交叉验证中可能因抽样使样本分布发生变化的缺陷。
model_selection.RepeatedKFold(n_splits=5, n_repeats=10, random_state=None)
n_splits
指定拆分次数(K折)。n_repeats
指定重复k折交叉验证的次数。
3、分层K折交叉验证抽样
根据标签各水平值的比例,对数据进行分层K折交叉验证抽样交,从而保持数据中各类别的比例和原始数据一致。是K折交叉验证的变种。
model_selection.StratifiedKFold(n_splits=3, shuffle=False, random_state=None)
n_splits
指定拆分次数(K折)。shuffle
指定是否分层。
4、有放回抽样(自助法抽样Boot Strapping)
有放回地采集m个样本(样本可以出现多次,也可以一次也出现)。样本始终不出现的概率为
,即在多次抽样后有36.8%(1/3)的样本从未被抽到。因此可以将抽到的样本作为训练集,为抽到的样本做测试集,从而确保在尽可能使用全样本的情况下又能有新样本做测试使用。
将数据按指定大小的训练集拆分k次,数据拆分是有放回的,即本次拆分后,下次重新从初始状态拆分。
model_selection.ShuffleSplit(n_splits=10, test_size="default", train_size=None, random_state=None)
n_splits
指定数据集拆分次数(K折)。test_size
、train_size
指定测试集占样本量的比例或测试集大小。random_state
随机种子。
方法:split(X)
对数组拆分,返回(train_index, test_index)构成的索引(源数据中位置)生成器。
get_n_splits(X)
返回对数组X进行的拆分次数。
三、交叉验证
1、获取得分
model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv=None, n_jobs=1,
verbose=0, fit_params=None, pre_dispatch="2*n_jobs")
返回每折运算得分结果构成的数组
estimator
是模拟器,即执行fit()和predict()方法的对象。X
是特征数组。y
是标签数组。groups
是因变量的分组标签变量(数组),用于将数据分为训练集/测试集。scoring
计算得分的函数名称(metrics中的方法名,如"f1_macro"、"accuracy"等)或可调用对象(用metrics.make_scorer(函数)生成)。cv
指定进行k折交叉验证,可以是None(3折交叉验证)、整数、一个拆分数据集的实例化对象(KFold()、ShuffleSplit())、一个生成训练/测试集的可迭代对象;对None、整数若模拟器是分类器且y是分类变量则用StratifiedKFold方法,否则用KFold方法。n_jobs
指定使用CPU核数。verbose
控制显示程度。fit_params
以字典形式传递给模拟器的predict()方法的参数。pre_dispatch
用于控制并行运算。
2、进行预测
model_selection.cross_val_predict(estimator, X, y=None, groups=None, cv=None, n_jobs=1, verbose=0,
fit_params=None, pre_dispatch='2*n_jobs', method='predict')
返回各样本在每折交叉预测结果的最终合成(投票?)后的结果数组。用于做误差分析,减小因样本变化对模型的影响
estimator
是模拟器,即执行fit()和predict()方法的对象。X
是特征数组。y
是标签数组。groups
是因变量的分组标签变量(数组),用于将数据分为训练集/测试集。cv
指定进行k折交叉验证,可以是None(3折交叉验证)、整数、一个拆分数据集的实例化对象(KFold()、ShuffleSplit())、一个生成训练/测试集的可迭代对象;对None、整数若模拟器是分类器且y是分类变量则用KFold方法,否则用KFold方法。n_jobs
指定使用CPU核数。verbose
控制显示程度。fit_params
以字典形式传递给模拟器的参数。pre_dispatch
指定分发的最多任务数,超出的将被杀死。method
指定传递给模拟器的方法名称,有"predict"、“predict_proba”、“predict_log_proba”、“decision_function”(对排序后的因变量)。
3、进行交叉验证(可获得每折的具体结果)
model_selection.cross_validate(estimator, X, y=None, groups=None, scoring=None, cv=’warn’, n_jobs=None, verbose=0, fit_params=None, pre_dispatch=‘2*n_jobs’, return_train_score=’warn’, return_estimator=False, error_score=’raise-deprecating’)
返回字典,键是test_score(测试集得分)、train_score(训练集的分)、fit_time(拟合时间)、score_time(计算得分时间)、estimator,对应的值是每折的建模结果。
groups
指定用分层抽样时所依据的数据。scoring
指定计算得分的方法名称或函数(只能返回一个值),可以通过列表、字典或列表得到多个得分,None用拟合器自身的得分计算方法。cv
指定交叉验证的折次(为整数或None且是分类拟合器,则用StratifiedKFold分层抽样,否则用KFold)或自定义的样本拆分实例。fit_params
指定拟合器的参数字典。return_train
是否返回交叉训练时训练集的得分,默认warn同True。return_estimator
是否返回各折交叉验证所拟合到的模型。error_score
指定计算得分出错时的默认值,"raise"产生异常并终止、"raise-deprecating"会在产生异常通告FurtureWarning;对refit步无效。