Featureunion学习笔记

简单介绍

  1. 简单理解:可以把若干转换器组合成一个新的转换器,这个新的转换器组合了它们的输出。大概可以这么理解,pipeline 对各个estimator进行了串行,而featureunion对多个转换器做了并行操作,输出是这些转换器的输出的合集。
  2. 具体实现:在训练阶段,每个转换器都在数据集上独立的训练。在数据变换阶段,所以训练好的转换器可以并行执行,输出的特征向量以end-to-end的形式拼接成一个更大的特征向量。
  3. 与pipeline可以共同使用创建更加复杂的模型。

    功能

  4. 只需要调用一次fit和transform就可以训练一组estimator。
  5. 可以与gridSearchCV结合,在所有的estimator上进行参数调优。
  6. 它无法检查两个转换器是否产生了相同的特征,只是将所有转换器生成的特征合并,确保产生不一样的特征是我们需要确保的。

代码实例

简单例子

  1. 调用transform后,可以返回原始特征经过多个transformer转换后的特征。
  2. 它与pipeline类似,也有一个make_union方法来创建实例。
    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
    from sklearn.pipeline import FeatureUnion
    from sklearn.decomposition import PCA
    from sklearn.decomposition import KernelPCA
    import pandas as pd
    from sklearn.model_selection import train_test_split
    # 读取数据

    data=pd.read_csv("/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(train_x.shape[1])

    # 构造组合特征(后一个estimator可以写成别的,因为我写成kernelPCA后运行代码时内存不足,所以为了测试写两个一样。)
    estimators=[('liner_pca',PCA(2)),('kernel_pca',PCA(3))]
    union=FeatureUnion(estimators)

    # 训练模型
    model=union.fit(train_x,train_y)
    print(model)
    # newfeature=model.get_feature_names()
    features=model.transform(train_x)

    # 输出最后的特征数
    print(features.shape[1])
    print(features)

    # 测试集做同样的转换
    test_new=model.transform(test_x)
    print(test_new.shape[1])

与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
from sklearn.pipeline import FeatureUnion
from sklearn.decomposition import PCA
from sklearn.decomposition import KernelPCA
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
# 读取数据

data=pd.read_csv("/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)

# 构造组合特征
transformers=[('liner_pca',PCA(2)),('kernel_pca',PCA(3))]
union=FeatureUnion(transformers)

# 与pipeline相结合
estimators=[('feature',union),('clf',RandomForestClassifier())]
pipe=Pipeline(estimators)

# 训练模型
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))

featureunion、pipeline、gridSearch

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
from sklearn.pipeline import FeatureUnion
from sklearn.decomposition import PCA
from sklearn.decomposition import KernelPCA
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score
from sklearn.model_selection import GridSearchCV
# 读取数据

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(train_x.shape[1])
# 构造组合特征
estimators=[('liner_pca',PCA(2)),('kernel_pca',PCA(3))]
union=FeatureUnion(estimators)

# 与pipeline相结合
pipe=Pipeline([('feature',union),('clf',RandomForestClassifier())])
# 与GridSearchCV结合
params=dict(feature__liner_pca__n_components=[2,3,4],clf__max_depth=[2,3,5])

grid_search=GridSearchCV(pipe,param_grid=params)
model=grid_search.fit(train_x,train_y)
print(model.best_estimator_)


# 预测
predict_y=model.predict(test_x)
auc=roc_auc_score(test_y,predict_y)
print("auc:"+str(auc))

相关文章