一、用预处理进行参数选择
image.png建模过程中,交叉验证中的划分无法正确地反映新数据的特征,已经将这部分数据的信息泄露给建模过程。
在交叉验证过程中,应该在进行任何预处理之前完成数据集的划分。任何从数据集中提取信息的处理过程都应该仅应用于数据集的训练部分,因此,任何交叉验证都应该位于处理过程的“最外层循环”。
Pipeline 类:
- 可以将多个处理步骤合并为单个 scikit-learn 估计器
- Pipeline 类具有 fit、predict、score 方法。
- Pipeline 类最常见的用例是将预处理步骤与一个监督模型链接在一起。
二、构建管道、在网格搜索中使用管道
image.pngfrom sklearn.svm import SVC
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
import mglearn
import matplotlib.pyplot as plt
# 加载数据
cancer=load_breast_cancer()
X_train,X_test,y_train,y_test=train_test_split(cancer.data,cancer.target,random_state=0)
# 计算数据的最小值和最大值
scaler=MinMaxScaler().fit(X_train)
#对训练数据进行缩放
X_train_scaled=scaler.transform(X_train)
X_test_scaled=scaler.transform(X_test)
svm=SVC()
svm.fit(X_train_scaled,y_train)
print('Test score:{:.2f}'.format(svm.score(X_test_scaled,y_test)))
pipe=Pipeline([('scaler',MinMaxScaler()),('svm',SVC())])
pipe.fit(X_train,y_train)
print('Test score:{:.2f}'.format(pipe.score(X_test,y_test)))
param_grid={'svm__C': [0.001, 0.01, 0.1, 1, 10, 100],
'svm__gamma': [0.001, 0.01, 0.1, 1, 10, 100]}
grid=GridSearchCV(pipe,param_grid=param_grid,cv=5)
grid.fit(X_train,y_train)
print('Best cross-validation accuracy:{:.2f}'.format(grid.best_score_))
print('Test set score:{:.2f}'.format(grid.score(X_test,y_test)))
print('Best parameters:{}'.format(grid.best_params_))
三、通用的管道接口
管道中的估计器的唯一要求:除了最后一步之外的所有步骤都需要具有 transform 方法,这样就可以生成新的数据表示,以供下一个步骤使用。
调用 Pipeline.fit 的过程,管道内部依次对每个步骤调用 fit 和 transform,其输入是前一个步骤中 transform 方法的输出。对于管道中的最后一步,仅调用 fit。
image.png
四、总结
Pipeline 可以将许多算法模型串联起来,比如将特征提取、归一化、分类组织在一起形成一个典型的机器学习问题工作流。主要带来两点好处:
- 直接调用 fit 和 predict 方法来对 pipeline 中的所有算法模型进行训练和预测。
- 可以结合 grid search 对参数进行选择。
网友评论