from sklearn.decomposition import PCApca = PCA(n_components=1, random_state=42).fit_transform(X_train)# 根据图表应该有43个组件,但它只允许1个。pca = pd.DataFrame(pca,columns=['pca'])#pca#X_train= pd.concat([X_train,pca],axis=1)
如果我将n_components更改为其他任何数字(例如,43),它会显示如下错误:
ValueError: Shape of passed values is (54708, 43), indices imply (54708, 1)
我在代码中使用以下内容来帮助我确定应该使用的组件数量,即43:
# 查找解释方差所需的组件数。# 代码来源:https://www.mikulskibartosz.name/pca-how-to-choose-the-number-of-components/from sklearn.decomposition import PCAfrom sklearn.preprocessing import MinMaxScalerscaler = MinMaxScaler()data_rescaled = scaler.fit_transform(X_train)pca = PCA().fit(data_rescaled)% matplotlib inlineimport matplotlib.pyplot as pltplt.rcParams["figure.figsize"] = (24,12)fig, ax = plt.subplots()xi = np.arange(1, 117, step=1)# 数字117是为了与y匹配,否则会出错。y = np.cumsum(pca.explained_variance_ratio_) # (explained_variance_ratio_)# 每个选定组件解释的方差百分比。# np.cumsum# 返回沿给定轴的元素的累积和。plt.ylim(0.0,1.1)plt.plot(xi, y, marker='o', linestyle='--', color='b')plt.xlabel('组件数量')plt.xticks(np.arange(0, 117, step=1)) # 从基于0的数组索引更改为基于1的人类可读标签plt.ylabel('累积方差(%)')plt.title('解释方差所需的组件数量')plt.axhline(y=0.95, color='r', linestyle='-')plt.text(0.5, 0.85, '95%截止阈值', color = 'red', fontsize=16)ax.grid(axis='x')plt.show()# 组件数量为43。
代码结果的图表:
回答:
试试这个:
pca = pd.DataFrame(pca,columns=[str(i) for i in range(pca.shape[1])])