【问题标题】:Preserve index after PCA in scikit-learn在 scikit-learn 中保留 PCA 后的索引
【发布时间】:2021-05-28 12:38:34
【问题描述】:

我想保留我的数据框my_dfUnique_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

我按照this thread建议的方法保留原始数据的索引,并在应用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

【问题讨论】:

  • 从您编写代码的方式来看,结果应该与原始数据具有相同的顺序。你可以做df_temp['Unique_id'] = my_df['Unique_id']
  • @QuangHoang 对吗?:) 谢谢 Quang!

标签: python numpy indexing scikit-learn pca


【解决方案1】:

你应该使用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了解更多信息。

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 2016-05-13
    • 1970-01-01
    • 2016-08-02
    • 2020-07-14
    • 2013-11-24
    • 2015-06-19
    相关资源
    最近更新 更多