pipeline、featureunion、ColumnTransformer区别与结合

区别

简单描述

  1. pipeline用于对特征处理、数据转换、回归或分类等多个步骤进行串联,功能是实现多个estimator的串行处理。
  2. featureunion用于对特征的处理,功能是实现多个transformer的并行处理,最终输出它们的结果的并集。每个transformer的输入都是全部的原始特征。
  3. ColumnTransformer用于对特征的处理,功能是针对不同的列做不同的处理,最终输出各自结果的合集。与featureunion不同的是,它各个transformer的输入是原始特征的一部分。
    可以结合下图来帮助理解,可能图与对应的实现方式不太一致,但是可以帮助我们理解这三个函数的作用。

    图示

  4. pipeline



  5. featureunion



  6. columntransformer



    三者结合实现复杂的特征处理

    简单说明

  7. 特征处理:分别使用columntransformer对特征进行处理、PCA进行处理。
  8. 特征组合:使用featureunion对columntransformer、PCA的结果进行组合。
  9. 使用pipeline将以上的结果与分类模型进行组合,形成从特征选择、数据处理、回归的一体化流程。

    代码实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
from sklearn.compose import ColumnTransformer
from sklearn.pipeline import Pipeline
from sklearn.pipeline import FeatureUnion
from sklearn.decomposition import PCA
from sklearn.impute import SimpleImputer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split, GridSearchCV
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
# 读取数据

data=pd.read_csv("/Users/yuxuemin/Documents/pywork/mLearn/jiandu/data/creditcard.csv")

# 将数据分为特征与标签
y=data['Class']
x=data.drop('Class',axis=1)
train_x,test_x,train_y,test_y=train_test_split(x,y)

print(data.dtypes)
# 利用ColumnTransformer对不同的特征做不同的处理。
print(data.isnull().any())
f1=['Time']
f1_transformer=Pipeline(steps=[('imputer',SimpleImputer(strategy='constant',fill_value=1))])
f2=['V1','V2','V3']
f2_transformer=Pipeline(steps=[('imputer',SimpleImputer(strategy='constant')),('scaler',StandardScaler())])
## 剩下的特征不进行处理,如果为drop则剩下的特征进行删除。
preprocessor=ColumnTransformer(transformers=[('f1',f1_transformer,f1),('f2',f2_transformer,f2)],remainder='passthrough')

# 实现ColumnTransformer与PCA处理的特征进行组合。
union_feature=FeatureUnion(transformer_list=[('columnTransformer',preprocessor),('pca',PCA())])
pipe=Pipeline(steps=[('union_feature',union_feature),('clf',RandomForestClassifier())])
model=pipe.fit(train_x,train_y)
# 预测
predict_y=model.predict(test_x)
auc=roc_auc_score(test_y,predict_y)
print("auc:"+str(auc))

相关文章