将 PCA 按一组特征制作到 Scikit-Learn Pipeline 而不是整个特征
Posted
技术标签:
【中文标题】将 PCA 按一组特征制作到 Scikit-Learn Pipeline 而不是整个特征【英文标题】:Make PCA by group of features to Scikit-Learn Pipeline instead to the whole features 【发布时间】:2021-12-23 02:43:29 【问题描述】:我有一个由 100 个特征组成的数据框,用于解决集群问题。这些功能分为N1
、N2
和N3
三个功能块,所有功能都以对应组作为后缀。例如,功能的名称可能是:
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 过程?
【问题讨论】:
【参考方案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)
])
【讨论】:
以上是关于将 PCA 按一组特征制作到 Scikit-Learn Pipeline 而不是整个特征的主要内容,如果未能解决你的问题,请参考以下文章