【问题标题】:Make PCA by group of features to Scikit-Learn Pipeline instead to the whole features将 PCA 按一组特征制作到 Scikit-Learn Pipeline 而不是整个特征
【发布时间】:2021-12-23 02:43:29
【问题描述】:

我有一个由 100 个特征组成的数据框,用于解决集群问题。这些功能分为N1N2N3 三个功能块,所有功能都以对应组作为后缀。例如,功能的名称可能是:

umidity_n1、air_n1、lat_n2、long_n2 等。

所以,到目前为止,我正在我的管道中将 PCA 应用于整个数据,我希望 PCA 是按组应用的。因此,一个 PCA 用于带有 _n1 后缀的功能,一个 PCA 用于带有 _n2 后缀的功能,另一个 PCA 用于带有 _n3 后缀的功能。

我的管道工作如下:

## Pipeline
prepData = Pipeline(
    [
        ("scaler", StandardScaler()),
        ("pca", PCA(n_components=20, random_state=42)),
    ]
)

kModel = Pipeline(
    [
        (
            "kmeans",
                KMeans(
                    n_clusters=6,
                    init="k-means++",
                    n_init=20,
                    max_iter=100,
                    random_state=42,
                ),
        ),
    ]
)

pipe = Pipeline(
    [
        ("prepData", prepData),
        ("kModel", kModel)
    ]
)

任何想法如何通过上述管道中的变量块来拆分 PCA 过程?

【问题讨论】:

    标签: python scikit-learn pipeline k-means pca


    【解决方案1】:

    您可以使用ColumnTransformer 通过 pca 单独转换列。从help page for ColumnTransformer 中,您传递要使用每个 pca 转换的列的索引,下面我使用(用于获取具有 n1 后缀的列):

    np.where(df.columns.str.contains('_n1'))[0]
    

    示例数据:

    import pandas as pd
    import numpy as np
    from sklearn.preprocessing import StandardScaler
    from sklearn.compose import ColumnTransformer
    from sklearn.decomposition import PCA
    from sklearn.pipeline import Pipeline
    
    df = pd.DataFrame(np.random.uniform(0,1,(100,6)),
    columns = ['umidity_n1','air_n1','a_n1','lat_n2','long_n2','b_n2'])
    

    设置立柱变压器和管道:

    pca = PCA(n_components=2)
    
    pca_by_column = ColumnTransformer(transformers=[
        ('pca_n1', pca, np.where(df.columns.str.contains('_n1'))[0]),
        ('pca_n2', pca, np.where(df.columns.str.contains('_n2'))[0])
        ],
        remainder='passthrough')
    
    prepData = Pipeline(steps=[
        ("scaler", StandardScaler()),
        ('pca', pca_by_column)
    ])
    

    【讨论】:

      猜你喜欢
      • 2017-03-09
      • 2016-02-25
      • 2018-02-24
      • 2018-06-01
      • 2016-10-11
      • 1970-01-01
      • 2017-08-01
      • 2017-11-04
      相关资源
      最近更新 更多