Pipeline:chaining(链接)estimators
Pipeline可以用于把多个estimators级联合成一个estimator。这么做的原因是考虑了数据处理过程的一系列前后相继的固定流程,比如:feature selection --> normalization --> classification。
在这里,Pipeline提供了两种服务:
- Convenience: 你只需要一次fit和predict就可以在数据集上训练一组estimators。
- Join parameter selection: 可以把grid search用在pipeline中所有的estimators的参数组合上面。
注意: pineline中除了最后一个之外的所有的estimators都必须是变换器(transformers)(也就是说必须要有一个transform方法)。最后一个estimator可以是任意的类型(transformer, classifier, regresser, etc)。
调用pipeline estimator的fit方法,就等于是轮流调用每一个estimator的fit函数一样,不断地变换输入,然后把结果传递到下一个阶段(step)的estimator。Pipeine对象实例拥有最后一个estimator的所有的方法。也就是说,如果最后一个estimator是一个分类器,则整个pipeline就可以作为一个分类器使用,如果最后一个eatimator是一个聚类器,则整个pipeline就可以作为一个聚类器使用。
Pipeline用法:
Pipeline对象使用(key, value)列表来构建,其中key是一个标识步骤的名称字符串,值是一个estimator对象:
from sklearn.pipeline import Pipeline
from sklearn.svm import SVC
from sklearn.decomposition import PCA # 主成分分析
estimators = [('reduce_dim', PCA()), ('clf', SVC()) ]
pipe = Pipeline(estimators)
print(pipe)
print('-----------')
print(pipe.steps)
print('-----------')
print(pipe.named_steps['clf'])
Pipeline中estimators的参数通过<estimator>__<parameter>语法来获取
pipe.set_params(clf__C=10)
上面的方式在网格搜索中尤其好用
from sklearn.model_selection import GridSearchCV
params = dict(reduce_dim__n_components=[2, 5, 10],
clf__C=[0.1, 10, 100])
grid_search = GridSearchCV(pipe, param_grid=params)
单个的阶段(Step)可以使用参数替换,而且非最后阶段(non-final steps)还可以将其设置为None来忽略。
from sklearn.linear_model import LogisticRegression
params = dict(reduce_dim=[None, PCA(5), PCV(10)],
clf=[SVC(), LogisticRegression()],
clf__C=[0.1, 10, 100])
grid_search = GridSearchCV(pipe, param_grid=params)
函数make_pipeline是一个构造pipeline的简短的工具,它可以接受可变数量的estimators并且返回一个pipeline,每个estimator的名称是自动填充的,他不需要指定name。
from sklearn.pipeline import make_pipeline
from sklearn.naive_bayes import MultinomialNB
from sklearn.preprocessing import Binarizer
make_pipeline(Binarizer(), MultinomialNB())
FeatureUnion: composite(组合)feature spaces
FeatureUnion把若干个transformer object组合成一个新的estimators。这个新的transformer组合了他们的输出,一个FeatureUnion对象接受一个transformer对象列表。
在训练阶段,每一个transformer都在数据集上独立的训练。在数据变换阶段,多有的训练好的Trandformer可以并行的执行。他们输出的样本特征向量被以end-to-end的方式拼接成为一个更大的特征向量。
在这里,FeatureUnion提供了两种服务:
- Convenience: 你只需要调用一次fit和transform就可以在数据集上训练一组estimators。
- Joint parameter selection: 可以把grid search用在FeatureUnion中所有的estimators的参数这上面。
FeatureUnion和Pipeline可以组合使用来创建更加复杂的模型。
注意:FeatureUnion无法检查两个transformers是否产生了相同的特征输出,它仅仅产生了一个原来互相分离的特征向量的集合。确保其产生不一样的特征输出是调用者的事情。
用法:
FeatureUnion对象实例使用(key, value)构成的list来构造,key是你自己起的transformation的名称,value是一个estimator对象。
from sklearn.pipeline import FeatureUnion
from sklearn.decomposition import PCA
from sklearn.decomposition import KernelPCA
estimators = [('linear_pca', PCA()), ('kernel_pca', KernelPCA())]
combined = FeatureUnion(estimators)
combined
与pipeline类似,feature unions也有一个比较简单地构造方法make_union,不需要显式的给出name。