4-1、模型选择


在调参过程中,由于是根据测试集测试模型效果的,因此测试集的信息会泄露进模型,从而使得模型效果变好。应该单独取一数据集作预测来查看预测的一般性能。即训练集做训练(训练模型)、评价集选模型(通过得分评价模型挑选出一个模型中最合适的参数)、测试集检验结果(对参数最佳的多种模型进行选择,从而得到最佳模型)。也可将训练集做训练、评价集选模型合为一个,做交叉验证(如网格搜索)来获得一个模型的最佳参数;用测试集选择不同模型中最佳者。

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,否则数据类型同输入)。
datatarget是位置参数,分别为特征数组或矩阵、目标数组后矩阵。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个样本(样本可以出现多次,也可以一次也出现)。样本始终不出现的概率为 l i m ( 1 1 m ) m > 1 e = 0.368 lim(1-\frac{1}{m})^m -> \frac{1}{e}=0.368 ,即在多次抽样后有36.8%(1/3)的样本从未被抽到。因此可以将抽到的样本作为训练集,为抽到的样本做测试集,从而确保在尽可能使用全样本的情况下又能有新样本做测试使用。
将数据按指定大小的训练集拆分k次,数据拆分是有放回的,即本次拆分后,下次重新从初始状态拆分。

model_selection.ShuffleSplit(n_splits=10, test_size="default", train_size=None, random_state=None)

n_splits指定数据集拆分次数(K折)。test_sizetrain_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步无效。

4、通过交叉验证计算学习曲线

```python model_selection.learning_curve(estimator, X, y, groups=None, train_sizes=array([0.1, 0.325, 0.55, 0.775, 1.]), cv=None, scoring=None, exploit_incremental_learning=False, n_jobs=1, pre_dispatch="all", verbose=0, shuffle=False, random_state=None) ``` 返回数组哦构成的元组**(训练集大小列表, 训练集得分数组(每行是一次数据拆分对应的交叉验证的得分), 测试集得分数组(每行是一次数据拆分对应的交叉验证的得分))**,用于反映训练集和测试集得分随训练集大小变化的情况。 ``estimator``是模型估计器(有fit()和predict()方法)。``X``是样本特征数组。``y``是目标变量(对非监督模型是None)。``groups``是长度同样本量的数组,用于对样本进行分组。``train_sizes``是各次取的训练集样本量占总样本的比例,整数时为具体样本量。``cv``指定交叉验证的次数(K折交叉验证,默认3),或是用于交叉验证拆分数据的生成器(如ShuffleSplit())、产生训练/测试集的生成器(train_test_split())(若为整数或None,且模型是有监督分类,则用StratifiedKFold,否则用KFold)。``scoring``指定计算得分方法的字符串或函数,也可以是None。``exploit_incremental_learning``若模型支持增量学习,则可设为True加快学习速度。``n_jobs``指定并行计算任务量。``pre_dispatch``。``verbose``指定显示的信息级别,整数值越大信息越多。``shuffle``是否在指定训练集大小基础上进行分层抽样。``random_state``指定随机种子。 ## 5、网格搜索:通过设置参数字典进行交叉验证(用于调参) ```python model_selection.GridSearchCV(estimator, param_grid, scoring=None, n_jobs=1, iid=True, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score='raise', return_train_score='warn') ``` 会对param_grid列表中的每个参数字典里的各参数做笛卡尔积来建模(共$dict1_a1*dict1_a2+dict1_b1*dict2_b2$个模型),通过交叉验证返回最优模型(是用apply()进行参数选择和交叉验证的合体)。会用fit和score方法,若在拟合器中有有predict、predict_proba、decision_function、transform、inverse_transform方法也可以使用。[参考](https://www.cnblogs.com/pinard/p/6160412.html?utm_source=itdadao&utm_medium=referral) ``estimator``是模型拟合器,要有fit()和score()方法;可以直接设置模型内不需要改变的参数。``param_grid``指定模型拟合器的参数字典,字典的键是待选值的列表(会将值进行笛卡尔积组合进入模型来筛选);或是字典的列表(每个字典表示一系列尝试,值是列表,表示各次迭代的参数,会将短元素进行拓展,使一个字典内值的元素长度相同);或是列表(各元素是一次迭代的参数)。``scoring``指定获得测试集的分的方法,是字符串(如"roc_auc")、函数(自定义得分函数,仅返回一个值)、序列、字典或None(用拟合器的scorer方法)。``n_jobs``指定并行任务量。``iid``指定各个交叉验证folder的数据分布是否一致。``cv``指定交叉验证的次数或交叉验证生成器。``pre_dispatch``指定启动任务前先关闭的任务数量。``fefit``是否用交叉验证获得的最佳参数组合对整个数据集进行拟合(不再是交叉验证),从而返回更准确的参数;若有多个评价方法则必须指定一个给scoring;使用该参数时实例会有best_estimator_属性,并可以直接使用实例的predict()方法。``verbose``指定显示等级。``error_score``指定拟合器拟合出错时的解决方法,"raise"(产生异常)、数值(作为默认得分,会有报警);对refit=True时,最终都会报错。``return_train_score``是否返回训练集的得分(通过cv_results_属性)。 ==属性==:``beat_params_``最佳模型的参数,在refit=True时有效。 ``best_estimator_``返回最佳拟合模型(测试集得分最高),在refit=False时有效。 ``best_score_``返回最佳拟合模型的交叉验证平均得分,在refit=True时有效。 ``best_index_``返回最佳模型对应的参数在所有参数中的索引位置(全部参数),仅在refit=True时有效。``scorer_``返回用于计算得分的方法。``grid_scores_``返回每组参数交叉验证建模后得到的得分的均值、方差、对应的param_grid参数 ``cv_results_``返回各种参数组合建模的结果字典 ,键有'mean_fit_time', 'mean_score_time'等。 ``classes_``返回类别列表。 ``estimator``建树所用的拟合器 ==方法==:``fit(X, y=None, groups=None, **fit_params)``进行模型拟合。groups指定对数据集X的分组,是数组,用于分层拆分。 ``predict(X)``用最佳参数对应的模型进行预测。仅对refit=True且拟合器支持predict方法时有效。``predict_proba(X)``拟合概率值。``predict_log_proba(X)``拟合对数概率值 ``score(X, y)``获得最佳参数对应模型的得分。仅对refit=True且拟合器支持score方法时有效。 ``transform(X)``对数据进行转化,需要拟合器支持。``inverse_transform(X)``对X根据拟合器进行逆向转换。

猜你喜欢

转载自blog.csdn.net/fengsuiwoxing/article/details/87918035
4-1