在 scikit-learn 中的 PCA 之后保留索引

Preserve index after PCA in scikit-learn

我想保留我的数据框 my_df 的列 Unique_id 以便在应用 PCA 后进行进一步分析。但是在降维过程中,该列将丢失。有没有办法保留该列?

my_df 看起来像这样:


    Unique_id EndValue Peak_val Score       f1          f2          f3          f4          f5          f6
0   15         44.5   46.5     377.17   38.366667   17.757471   -0.610802   -1.028477   45.372727   0.150168
1   15         45.0   47.0     1268.37  46.909091   0.090909    -2.846050   6.100000    46.909091   0.090909
2   18         45.0   47.0     373.16   45.030303   0.030303    5.480078    28.031250   45.651685   0.252298
3   18         45.0   47.0     369.68   45.000000   0.000000    0.000000    -3.000000   46.052632   0.052632
4   19         45.0   47.0     1414.97  46.000000   0.000000    0.000000    -3.000000   46.000000   0.000000

我按照建议的方法保留原始数据的索引,并在应用PCA后将其附加到my_df

在 PCA 期间,我删除了 Unique_id 列,因为它不是一个特征。然后我尝试了:

def pca2(data, n, pc_count = None):
    return PCA(n_components = n).fit_transform(data)

results_2d = pca2(my_df, 2)

df_temp = pd.DataFrame(results_2d, index=my_df.index)
df_temp

输出如下所示:

     0              1
0   -1.863714e+03   -14.793301
1   -2.754914e+03   -10.330997
2   -1.859704e+03   23.473387
3   -1.856224e+03   5.703049
4   -2.901514e+03   -19.540132
5   -1.786054e+03   17.621220
6   -2.555565e+03   38.636828
7   -1.667134e+03   11.647753

我知道很难验证索引是否正确。有什么方法可以检查我的结果吗?有没有更好的方法来保留实际的 Unique_id?

你应该使用 ColumnTransformer:

>>> import pandas as pd
>>> from sklearn.compose import ColumnTransformer
>>> from sklearn.decomposition import PCA
>>> df = pd.DataFrame({'c1': [1, 2, 3, 4],
...                    'c2': [3., 5.5, 8., 10.5],
...                    'c_to_preserve': [-5, -3, 6, 10]})
>>> featurizer = ColumnTransformer([('pca', PCA(n_components=1), ['c1', 'c2']),
...                                 ('preserve', 'passthrough', ['c_to_preserve'])])
>>> featurizer.fit_transform(df)
array([[ 4.03887361, -5.        ],
       [ 1.3462912 , -3.        ],
       [-1.3462912 ,  6.        ],
       [-4.03887361, 10.        ]])

查看 sklearn.compose.ColumnTransformer 了解更多信息。