该模块一共讲述了三部分的内容,交叉验证:评估模型,微调模型的超参数以及学习曲线
可用的API有拆分策略,参数优化的方法以及模型评估
拆分策略
对于独立同分布(i.i.d)的数据
函数名 | 作用 | 重要参数 | 方法 | 备注 |
---|---|---|---|---|
KFold([n_splits,shuffle,…]) | k折交叉验证 | n_splits:多少折;shuffle:是否打乱数据;random_state:随机种子 | get_n_splits([X,y,groups]):返回拆分的次数,split(X,[,y,groups]):生成拆分后的训练集和测试集的序号 | 等分数据 |
LeaveOneOut() | 将一个样本作为测试集,其他作为训练集,n个样本就有n个不同的训练集和测试集 | 无参数 | 同KFold | 不推荐使用 |
LeavePOut(p) | 预留出p个样本作为测试集 | p:测试集的大小 | 同KFold | 测试集会有重叠部分 |
RepeatedKFold([n_splits,…]) | 重复KFold n次 | n_repeats:重复次数 | 同KFold | 每次都是不同的拆分方法 |
ShuffleSplit([n_splits,…]) | 随机排列交叉验证 | test_size:测试集大小;train_size:训练集大小 | 同KFold | 可以自己设置训练集/测试集的大小,数据会先打乱,再拆分 |
对于类别分布不平衡的数据,例如正例的数量是反例数量的好几倍。
Tip:对于array数组统计成员出现次数,需要先将np.narray.tolist()转换为list,再使用list的count方法统计某个值的频数。
函数名 | 作用 | 重要参数 | 方法 | 备注 |
---|---|---|---|---|
StratifiedKFold([n_splits,…]) | 分层K折交叉验证 | 同KFold | 同KFold | 每一折的测试集和训练集都不一样 |
RepeatedStratifiedKFold([…]) | 重复分层K折交叉验证 | n_reoeats:重复的次数 | 同KFold | 每一次都用不同的随机方式 |
StratifiedShuffleSplit([…]) | 分层随机排列交叉验证 | 同ShuffleSplit | 同ShuffleSplit |
如果数据间是有关联性的,例如医院调研中,有一些数据属于同一个病人,那么理所应当的应该将这些数据归为一组,不可能说这个病人的一部分数据作为测试集,一部分作为训练集。这一个信息在交叉验证将通过groups参数来传递
函数名 | 作用 | 重要参数 | 方法 | 备注 |
---|---|---|---|---|
GroupKFold([n_splits]) | 无重叠组的K折拆分变形 | 只有一个参数n_splits:折的数量 | 函数同KFold,但注意groups参数要给出 | 因为数据分组的问题,所以每一折拆分出来的数据大小不一定一样 |
GroupShuffleSplit([…]) | 打乱分组顺序的交叉验证 | n_splits:多少折;test_size:测试集大小;train_size:训练集的大小;random_state:随机种子 | 同GroupKFold | |
LeaveOneGroupOut() | 留出一组作为测试集 | 无参数 | 同GroupKFold | |
LeavePGroupsOut(n_groups) | 留出P组作为测试集 | 只有一个参数n_groups:测试集的大小 | 同GroupKFold |
其他还有,与时间相关的划分,例如当前时刻的结果与之前时刻的结果有关,那么包含了当前时刻的样本就应当和之前时刻的样本放在一起当测试集,TimeSeriesSplit([n_splits,…])。还可以事先指定测试集PredefinedSplit(test_fold)。
参数优化
函数名 | 作用 | 重要参数 | 属性 | 方法 |
---|---|---|---|---|
GridSearchCV(estimator,…) | 遍历搜寻给出的参数中的最优参数 | estimator:选用的模型;param_gird:参数表(重要);scoring:评分方式;cv:交叉验证方式;refit:是否选择最优模型;return_train_score:是否返回训练集的分数 | 需要先fit(X[,y,groups]),cv_results_:所有的结果;best_estimator:最佳模型;best_score:最高分数;best_params:最佳参数 | fit(X[,y,groups]):拟合数据;predict(X):预测… |
RandomizedSearchCV(…[,…]) | 随机抽样超参数 | 与GridSearchCV不同的参数,param_distributions: 参数表,dict型数据,对于连续的参数最好给出一个连续的分布(常用的有expon,gamma,uniform,randint)(scipy.stats.distributions),如果给出的是列表,将会进行无放回的抽样;n_iter:抽样次数;random_state:针对给出的参数是列表型的话 | 同GridSearchCV | 同GridSearchCV |
函数名 | 作用 |
---|---|
ParameterGrid(param_grid) | 用于产生一系列离散的参数的迭代器 |
ParameterSample(…[,…]) | 用于产生一系列连续的参数的迭代器 |
fit_grid_point(X,y,…[,…]) | 使用一组参数拟合模型,获得分数 |
模型评估
函数名 | 作用 | 重要参数 | 备注 |
---|---|---|---|
cross_val_score(estimator,X) | 直接获得交叉验证后的分数 | estimator:拟合数据的模型;X:数据;y:标签;scoring:评分方式;cv:交叉验证的拆分策略 | scoring方式 |
cross_validate(estimator,X) | 多种评分方式下的交叉验证得分并且记录拟合以及打分时间 | 同上;return_train_score:是否返回测试集的分数;return_estimator:是否返回模型的参数 | 与cross_val_score的不同:1. 前者允许多种评估方式 2.前者除了返回测试集的分数外,还返回每次拟合的时间,评分的时间,以及训练集的分数 |
cross_val_predict(estimator,X) | 返回每个样本作为CV中的测试集时,对应的模型对于该样本的预测结果 | 基本与cross_val_score相同,没有scoring | 适用于1. 从不同模型中获得预测结果 2.模型融合 |
learning_curve(estimator,X,y) | 学习曲线关注的是增加样本量对测试集以及验证集的影响 | train_sizes:可控制训练集的大小 | 返回训练集的大小,训练集和测试集的分数 |
permutation_test_score(…) | 检查一个交叉验证后得到的分数是否有意义 | n_permutations:对标签进行排列的次数 | 返回pvalue(用于验证未排列时的分数是不是随机得到的,越小越好) |
validation_curve(estimator,…) | 通过画图的方式判断某一参数在训练集和验证集的表现 | param_name:某一参数的名称;param_range:参数的范围 | 返回训练集的分数和测试集的分数。如果在训练集和验证集的分数都偏低,说明模型欠拟合。如果训练集分数很高,验证集分数很低,说明模型过拟合,否则就是拟合得当。 |
分割函数
函数名 | 作用 | 重要参数 | 返回 | 备注 |
---|---|---|---|---|
check_cv([cv,y,classifier]) | 构建一个交叉验证器KFold或者分层KFold | |||
train_test_split(*arrays,…) | 将数列随机分割成训练集和测试集 | 直接返回训练集和测试集 |
参考网址:
[1] https://scikit-learn.org/stable/modules/classes.html#module-sklearn.model_selection
[2] https://scikit-learn.org/stable/modules/cross_validation.html#cross-validation
[3] https://scikit-learn.org/stable/modules/grid_search.html#grid-search
[4] https://scikit-learn.org/stable/modules/learning_curve.html#learning-curve