Python机器学习库SKLearn:数据集转换之管道和特征

来源:互联网 发布:it狂人电影版 编辑:程序博客网 时间:2024/04/29 03:47

4.1 管道和特征:组合估计量

4.1.1 管道:链接估计

管道可以用于将多个估计器链接成一个。 这是有用的,因为在处理数据中经常有固定的步骤序列,例如特征选择,归一化和分类。 管道在这里有两个目的:
方便:您只需调用fit和预测一次您的数据,以适应一个完整的估计量序列。
联合参数选择:可以一次性在管线中的所有估计量的参数上进行网格搜索。
流水线中的所有估计器,除了最后一个,必须是变换器(即必须具有变换方法)。 最后一个估计器可以是任何类型(变换器,分类器等)。

4.1.1.1 用法

流水线是使用(key, value)对的列表构建的,其中key是包含要给予此步骤的名称的字符串,value是估计量对象:

from sklearn.pipeline import Pipelinefrom sklearn.svm import SVCfrom sklearn.decomposition import PCAestimators = [('reduce_dim', PCA()), ('clf', SVC())]pipe = Pipeline(estimators)pipe 输出:Pipeline(steps=[('reduce_dim', PCA(copy=True, iterated_power='auto',n_components=None, random_state=None, svd_solver='auto', tol=0.0,whiten=False)), ('clf', SVC(C=1.0, cache_size=200, class_weight=None,coef0=0.0, decision_function_shape=None, degree=3, gamma='auto',kernel='rbf', max_iter=-1, probability=False, random_state=None,shrinking=True, tol=0.001, verbose=False))])

效用函数make_pipeline是构造管道的简写; 它需要一个可变数量的估计器并返回一个管道,自动填充名称:

from sklearn.pipeline import make_pipelinefrom sklearn.naive_bayes import MultinomialNBfrom sklearn.preprocessing import Binarizermake_pipeline(Binarizer(), MultinomialNB()) 输出:Pipeline(steps=[('binarizer', Binarizer(copy=True, threshold=0.0)),                ('multinomialnb', MultinomialNB(alpha=1.0,                                                class_prior=None,                                                fit_prior=True))])

管道的估计器作为列表存储在steps属性中:

pipe.steps[0]输出:('reduce_dim', PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,  svd_solver='auto', tol=0.0, whiten=False))
并在named_steps中作为dict存在:

pipe.named_steps['reduce_dim']输出:PCA(copy=True, iterated_power='auto', n_components=None, random_state=None,  svd_solver='auto', tol=0.0, whiten=False)

设置参数:

pipe.set_params(clf__C=10) 输出:Pipeline(steps=[('reduce_dim', PCA(copy=True, iterated_power='auto',    n_components=None, random_state=None, svd_solver='auto', tol=0.0,    whiten=False)), ('clf', SVC(C=10, cache_size=200, class_weight=None,    coef0=0.0, decision_function_shape=None, degree=3, gamma='auto',    kernel='rbf', max_iter=-1, probability=False, random_state=None,    shrinking=True, tol=0.001, verbose=False))])

这对于网格搜索尤为重要:

>>> 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)
单个步骤也可以替换为参数,非最终步骤可以通过将其设置为None:

>>> from sklearn.linear_model import LogisticRegression>>> params = dict(reduce_dim=[None, PCA(5), PCA(10)],...               clf=[SVC(), LogisticRegression()],...               clf__C=[0.1, 10, 100])>>> grid_search = GridSearchCV(pipe, param_grid=params)

4.1.2 FeatureUnion:复合特征空间

FeatureUnion将多个转换器对象组合成一个新的转换器,结合了它们的输出。 FeatureUnion获取转换器对象的列表。 在拟合期间,这些中的每一个独立地拟合数据。 对于变换数据,变换器被并行应用,并且它们输出的样本向量端对端地连接成较大的向量。
FeatureUnion具有与Pipeline相同的目的 - 方便和联合参数估计和验证。
FeatureUnion和Pipeline可以组合以创建复杂模型。
(FeatureUnion无法检查两个转换器是否可能产生相同的特征,当特征集不相交时,它只产生一个并集,并确保它们是调用者的责任。)

4.1.2.1 用法

FeatureUnion使用(key,value)对的列表构建,其中key是您要给予给定变换的名称(任意字符串;它仅用作标识符),value是一个估计器对象:

>>> 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 FeatureUnion(n_jobs=1, transformer_list=[('linear_pca', PCA(copy=True,    iterated_power='auto', n_components=None, random_state=None,    svd_solver='auto', tol=0.0, whiten=False)), ('kernel_pca',    KernelPCA(alpha=1.0, coef0=1, copy_X=True, degree=3,    eigen_solver='auto', fit_inverse_transform=False, gamma=None,    kernel='linear', kernel_params=None, max_iter=None, n_components=None,    n_jobs=1, random_state=None, remove_zero_eig=False, tol=0))],    transformer_weights=None)
像管道一样,特征联合体有一个称为make_union的简化构造函数,不需要显式命名组件。像管道一样,单个步骤可以使用set_params替换,并通过设置为None来忽略:

>>> combined.set_params(kernel_pca=None) FeatureUnion(n_jobs=1, transformer_list=[('linear_pca', PCA(copy=True,      iterated_power='auto', n_components=None, random_state=None,      svd_solver='auto', tol=0.0, whiten=False)), ('kernel_pca', None)],    transformer_weights=None)

1 0
原创粉丝点击