使用Pipeline构建算法链

使用Pipeline构建算法链

描述

在机器学习中,经常会使用多个算法模完成一个任务,这时可以使用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结合网格搜索,选择最佳模型组合及参数。

实施

步骤1、加载并拆分乳腺癌数据集

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)  

步骤2、使用MinMaxScaler缩放器进行预处理,然后创建KNN分类模型并评估

# 创建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时的写法,代码依次调用预处理模型和分类模型,并分别拟合数据,最后评估出成绩。

步骤3、使用Pipeline将预处理模型和分类模型整合

  • Pipleline可以将多个模型整合成一个算法链(可以看做是一个复合模型)
  • Pipleline同样拥有fit、score、predict等方法
  • 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方法进行评估,代码更加清晰简练。

步骤4、创建Pipleline的另一种写法

  • make_pipeline函数写起来简单,但不能自定义模型变量名
  • Pipeline中的模型使用默认变量名(模型类名的小写)
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

步骤5、使用Pipeline结合网格搜索,选择最佳模型组合及对应参数

接下来,我们定义多个分类模型(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。

  • Pipleline对象可以像模型一样,作为GridSearchCV的参数进行自动调参
  • 可以使用Pipleline中的模型名称加上“__参数名”作为key,为模型指定参数字典
  • 定义多个分类模型(KNN、SVC),整合成一个算法链
  • 使用网格搜索(GridSearchCV)给不同的模型设置不同的参数,来选择最佳模型

你可能感兴趣的:(算法,机器学习,python)