Sklearn Pipeline:机器学习工作流小教程——酒类识别数据集
在机器学习当中,最主要和标准的几个工作流程为数据预处理、数据降维、特征选择、建立机器学习模型。Python的scikit-learn中,提供了能够实现机器学习流程自动化的管道机制,即sklearn.pipeline.Pipeline()
。
Pipeline的用途:
-
方便和封装
只需在数据集上调用一次fit()
和predict()
,就可以将数据集fit进数个有序的estimators
。 -
联合参数选择
可以一次对管道中所有估计量的参数进行网格搜索GridSearchCV
。 -
安全
通过确保使用相同的样本来训练transformers
(变换器)和estimators
(预测器),Pipeline可避免测试数据中的数据泄漏到经过交叉验证训练的模型中。例如,在机器学习之前对整个数据集使用数据标准化来准备数据将不是有效的,因为训练数据集会受到测试集中数据规模的影响。
所有在Pipeline中的estimators必须为transformers,即必须拥有变换方法,如数据标准化。最后一个estimator可以为任意类别,如变换器,和分类器 (transformer, classifier, etc.)。
以下为两个小小的教程:
小教程1
使用Pipeline完成数据预处理和机器学习模型的建立:
- 数据标准化,使用
StandardScaler()
- 数据降维,使用主成分分析
PCA()
- 分类模型,使用决策分类树
DecisionTreeClassifier()
Step 1: 导入需要使用到的库。
import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
% matplotlib inline
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
Step 2: 加载酒类识别数据集。
wine_x, wine_y = datasets.load_wine(return_X_y=True)
wine_df_x = pd.DataFrame(wine_x, columns=['Alcohol', 'Malic acid', 'Ash', 'Alcalinity of ash', 'Magnesium',
'Total phenols', 'Flavanoids', 'Nonflavanoid phenols', 'Proanthocyanins',
'Color intensity', 'Hue', 'OD280/OD315', 'Proline'])
wine_df_y = pd.DataFrame(wine_y, columns=['Target'])
x_train, x_test, y_train, y_test = train_test_split(wine_df_x, wine_df_y,
test_size=0.2, random_state=40, stratify=wine_df_y)
Step 3: 创建Pipeline。
注意:在steps中transformer
的名字可为任意字符串,如'scaler'
。
# define steps that need to be in the pipeline
steps = [('scaler', StandardScaler()), ('PCA', PCA()), ('DCT', DecisionTreeClassifier())]
# create pipeline object
pipeline_one = Pipeline(steps)
pipeline_one.fit(x_train, y_train)
pipeline_one.score(x_test, y_test)
result: 0.9444444444444444
最后,酒类识别数据集的决策分类树模型的准确率为0.6944。
小教程2
上面的小教程中,并没有对决策分类树模型进行调参,这里使用Pipeline与GridSearchCV来进行调参:
- Pipeline中一样包含了
StandardScaler()
,PCA()
,DecisionTreeClassifier()
。 - 调整决策分类树中的参数:
-criterion
: gini, entropy;
-random_state
: 10, 20;
-max_depth
: 5, 10, 15, 20, 25, 30。 - 创建
GridSearchCV
实例,选择cv=10
(10折)。
Step 1和Step 2是一样的。
Step 3: 创建Pipeline。
注意:在设置调参使用的参数范围时,使用steps
中定义的变换器(transformer)名字,加上两个下划线__
。
# define steps that need to be in the pipeline
steps_cv = [('scaler', StandardScaler()), ('PCA', PCA()), ('DCT', DecisionTreeClassifier())]
# create pipeline object
pipeline_cv = Pipeline(steps_cv)
# create a dictionary with parameters
parameters = {'DCT__criterion':['gini', 'entropy'], 'DCT__random_state':[10,20], 'DCT__max_depth':[5,10,15,20,25,30]}
Step 4: 创建GridSearchCV实例。
# create a gridsearchCV object
grid_cv = GridSearchCV(pipeline, param_grid=parameters, cv=10)
# fit the training dataset on grid_cv
grid_cv.fit(x_train, y_train)
print(grid_cv.score(x_test, y_test) )
print(grid_cv.best_params_)
result: 0.8611
best_params:{'DCT__criterion': 'entropy', 'DCT__max_depth': 5, 'DCT__random_state': 20}
本文的JupyterNotebook的Github 链接。
*本文只提供示范了Pipeline的使用方法,若需要更为了解其中的参数和方法,建议阅读官方的文档。
参考链接:
[1] Automate Machine Learning Workflows with Pipelines in Python and scikit-learn
[2] A Simple Example of Pipeline in Machine Learning with Scikit-learn
[3] Pipeline and composite estimators