在机器学习中,经常会使用多个算法模完成一个任务,这时可以使用Pipeline构建算法链,将多个算法整合为一个“复合模型”,它同样拥有fit、score、predict等方法。构建算法链可以大大简化模型代码,同时还能够避免因模型之间数据不一致导致的性能问题。Pipeline的经典应用场景是整合预处理和监督学习模型,同时还可以结合网格搜索、交叉验证进行调参、选出最优的模型和参数。
本任务主要实践内容包括:
1、 使用Pipeline整合预处理与KNN分类器,实现肿瘤分类预测
2、 使用Pipeline结合网格搜索,自动选择最优模型组合及模型最优参数。
源码下载
操作系统:Windows10、Ubuntu18.04
工具软件:Anaconda3 2019、Python3.7
硬件环境:无特殊要求
依赖库列表
scikit-learn 0.24.2
本任务使用乳腺癌数据集(breast_cancer),任务中涉及以下环节:
a)加载并拆分数据集;
b)使用MinMaxScaler缩放器进行预处理;
c)建立KNN分类模型并评估;
d)使用Pipeline构建算法链,整合上述预处理和分类模型,并评估;
e)使用Pipeline结合网格搜索,选择最佳模型组合及参数。
from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, StandardScaler
# 加载、拆分数据
cancer = load_breast_cancer()
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, random_state=0)
# 创建MinMaxScaler缩放器
scaler = MinMaxScaler()
# 数据缩放预处理
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.fit_transform(X_test)
# 创建分类模型
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train_scaled, y_train) # 拟合预处理后的数据
score = knn.score(X_test_scaled, y_test) # 评估模型成绩
print('Test score: %.2f'%score)
输出结果:
Test score: 0.92
说明:以上步骤1、2为不使用Pipeline时的写法,代码依次调用预处理模型和分类模型,并分别拟合数据,最后评估出成绩。
from sklearn.pipeline import Pipeline # 引入Pipeline
# 将缩放器和分类器整合成一个Pipleline对象
pipe = Pipeline([('scaler', MinMaxScaler()), ('knn', KNeighborsClassifier(n_neighbors=5))])
pipe.fit(X_train, y_train) # 拟合数据
score = pipe.score(X_test, y_test) # 评估成绩
print('Pipe score: %.2f'%score)
输出结果:
Pipe score: 0.96
说明:我们使用Pipeline将数据缩放预处理模型和KNN分类模型整合为一个算法链,统一调用fit方法拟合数据,然后调用score方法进行评估,代码更加清晰简练。
from sklearn.pipeline import make_pipeline
# 使用make_pipeline函数创建pipeline,写法更简便,但不定自定义模型变量名
pipe = make_pipeline(MinMaxScaler(), KNeighborsClassifier(n_neighbors=5))
pipe.fit(X_train, y_train)
score = pipe.score(X_test, y_test) # 评估模型成绩
print('Pipe score: %.2f'%score)
输出结果:Pipe score: 0.96
接下来,我们定义多个分类模型(KNN、SVC)和预处理模型,整合成一个算法链,然后使用网格搜索(GridSearchCV)给不同的模型设置不同的参数,最终选出最优的模型组合和对应的参数。
from sklearn.svm import SVC
# 定义Pipeline
pipe = Pipeline([('preprocessing', StandardScaler()), ('classifier', KNeighborsClassifier(5))])
# 定义参数字典(这里使用了KNN和SVC两种分类模型,不同模型的参数字典不同)
param_grid = [{'preprocessing': [StandardScaler()],
'classifier': [SVC()],
'classifier__gamma': [0.001, 0.01, 0.1, 1, 10, 100],
'classifier__C': [0.001, 0.01, 0.1, 1, 10, 100]},
{'preprocessing': [StandardScaler(), MinMaxScaler()],
'classifier': [KNeighborsClassifier()],
'classifier__n_neighbors': [1, 3, 5, 10]}]
# 定义网格搜索
grid = GridSearchCV(pipe, param_grid, cv=5)
grid.fit(X_train, y_train)
# 输出最佳成绩及对应的参数
print('Best score:%0.2f\n'%grid.best_score_)
print(grid.best_params_)
输出结果:
Best score:0.99
{'classifier': SVC(C=10, gamma=0.01), 'classifier__C': 10, 'classifier__gamma': 0.01, 'preprocessing': StandardScaler()}
说明:最佳成绩为0.99,最佳模型组合为SVC+StandaScaler缩放器,SVC最佳参数为C=10,gamma=0.01。