Почему мой n-компонент в PCA может быть только 1 (индексы подразумевают 1)

#python #machine-learning #pca

Вопрос:

 from sklearn.decomposition import PCA
pca = PCA(n_components=1, random_state=42).fit_transform(X_train)
# 43 components according to the graph, but it only allows 1.
pca = pd.DataFrame(pca,columns=['pca'])
#pca
#X_train= pd.concat([X_train,pca],axis=1)
 

Если я изменю n_компонентов на любое другое число(например, 43), оно покажет ошибку примерно так:

 ValueError: Shape of passed values is (54708, 43), indices imply (54708, 1)
 

Я включил это в свой код, чтобы узнать количество компонентов, которые я должен использовать, а это 43:

 # find n components to explain variance.
# Code source: https://www.mikulskibartosz.name/pca-how-to-choose-the-number-of-components/
from sklearn.decomposition import PCA
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data_rescaled = scaler.fit_transform(X_train)
pca = PCA().fit(data_rescaled)

% matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (24,12)

fig, ax = plt.subplots()
xi = np.arange(1, 117, step=1)
# The number 117 is to match y, otherwise it gives me error.
y = np.cumsum(pca.explained_variance_ratio_) 
# (explained_variance_ratio_)
# Percentage of variance explained by each of the selected components.
# np.cumsum
# Return the cumulative sum of the elements along a given axis.


plt.ylim(0.0,1.1)
plt.plot(xi, y, marker='o', linestyle='--', color='b')

plt.xlabel('Number of Components')
plt.xticks(np.arange(0, 117, step=1)) #change from 0-based array index to 1-based human-readable label

plt.ylabel('Cumulative variance (%)')
plt.title('The number of components needed to explain variance')

plt.axhline(y=0.95, color='r', linestyle='-')
plt.text(0.5, 0.85, '95% cut-off threshold', color = 'red', fontsize=16)

ax.grid(axis='x')
plt.show()

# 43 number of components.
 

График из результата кода:

введите описание изображения здесь

Комментарии:

1. в чем заключается ваш вопрос? первый кодовый блок или второй кодовый блок?

2. Извините за путаницу, мой вопрос в том, почему я не могу изменить значение nкомпонента на число, отличное от 1, которое является первым блоком кода. Второй блок кода просто для обеспечения некоторого контекста .

3. Я думаю , что ошибка исходит от этой строки pca = pd.DataFrame(pca,columns=['pca']) , а не от PCA.

4. @FlaviaGiammarino Да, это не позволяет мне создавать фрейм данных.

5. Это потому, что у вас 43 столбца, но при columns=['pca'] этом вы передаете только одно имя столбца. Вы можете использовать columns=['pca' str(i) for i in range(n_components)] с n_components=43 для создания списка из 43 имен столбцов.

Ответ №1:

попробуйте это:

 pca = pd.DataFrame(pca,columns=[str(i) for i in range(pca.shape[1])])
 

Комментарии:

1. Спасибо. Но мой X_train.shape (54708, 116), в строке что-то не так: pca = pd.DataFrame(pca,столбцы=[‘pca’])?

2. @ShaneLi, я знаю , это потому, что вам нужна база имен с несколькими столбцами pca.shape , похожая на блок редактирования кода