PCA восстанавливает наиболее важные функции в кадре данных - PullRequest
0 голосов
/ 22 июня 2019

Я пытаюсь понять, как использовать PCA для определения наиболее важных функций.Я думаю, что я сделал это ниже.

Мне интересно, как передать наиболее важные функции с их исходными именами столбцов (из кадра данных pandas) обратно в новый кадр данных, который я создаю внизу?- так что я могу использовать это как новый «облегченный» набор данных?

Таким образом, если я установлю n_components равным 10;Я бы хотел, чтобы 10 новых столбцов (с именами) были переданы в новый фрейм данных.

Есть идеи?

from sklearn.decomposition import PCA

# PCA (principal component analysis) aims to reduce the number of dimensions in the dataset, without losing those which are very relevant to the model
# it provides a score, you can drop those with poor scores.
X_pc = PCA(n_components=2).fit_transform(train_features)
pd.DataFrame({'PC1': X_pc[:, 0], 'PC2': X_pc[:, 1], 'Y': train_labels.ravel()}).sample(10)

1 Ответ

1 голос
/ 22 июня 2019

PCA уменьшил размеры до 2, линейно комбинируя начальные характеристики.После преобразования выходные данные представляют собой матрицу с размером [выборки, компоненты] и, следовательно, невозможно создать кадр данных, поскольку вы не можете проецировать обратно имена / функции.

Важными функциями являютсяте, которые влияют больше на компоненты и, следовательно, имеют большое абсолютное значение для компонента.

Если вы измените код, вы сможете получить самые важные функции на ПК :

from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
np.random.seed(0)

# 10 samples with 5 features
train_features = np.random.rand(10,5)

model = PCA(n_components=2).fit(train_features)
X_pc = model.transform(train_features)

# number of components
n_pcs= model.components_.shape[0]

# get the index of the most important feature on EACH component
# LIST COMPREHENSION HERE
most_important = [np.abs(model.components_[i]).argmax() for i in range(n_pcs)]

initial_feature_names = ['a','b','c','d','e']

# get the names
most_important_names = [initial_feature_names[most_important[i]] for i in range(n_pcs)]

# LIST COMPREHENSION HERE AGAIN
dic = {'PC{}'.format(i+1): most_important_names[i] for i in range(n_pcs)}

# build the dataframe
df = pd.DataFrame(sorted(dic.items()))

Это печатает:

     0  1
 0  PC1  e
 1  PC2  d

Таким образом, на ПК1 функция с именем e является наиболее важной, а на ПК2 d.

...