基于用户ID数据集应用PCA聚类报ValueError的解决方案咨询
用户学习行为聚类PCA降维问题
基础信息
- 数据集维度:
(27884 行, 8933 列) - 全量数据包含27884名学生用户,8932个书籍章节学习行为字段,字段命名规则为
b1~b8932 - 字段规则:
user_iD:用户唯一身份标识b1~b8932:单元格数值代表学生学习对应章节的先后顺序,数值0表示该学生未学习对应章节
数据集预览(小样本)
| user_iD | b1 | b2 | b3 | b4 | b5 | b6 | b7 | b8 | b9 | b10 | b11 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | 1 | 7 | 2 | 3 | 8 | 0 | 4 | 0 | 6 | 0 | 5 |
| 2 | 7 | 8 | 1 | 2 | 4 | 6 | 5 | 9 | 10 | 3 | 0 |
| 3 | 0 | 0 | 0 | 0 | 1 | 5 | 2 | 3 | 4 | 0 | 6 |
| 4 | 1 | 7 | 2 | 3 | 8 | 0 | 5 | 0 | 6 | 0 | 4 |
| 5 | 0 | 4 | 7 | 0 | 6 | 1 | 5 | 3 | 0 | 0 | 2 |
| 6 | 1 | 0 | 2 | 3 | 0 | 5 | 4 | 0 | 0 | 6 | 7 |
报错信息
执行PCA代码时抛出如下错误:
ValueError: Found array with 0 feature(s) (shape=(22307, 0)) while a minimum of 1 is required.
原问题中使用的错误实现代码如下:
df3 = pd.read_feather('Bundles.ftr') X = df3['user_iD'] y = df3.loc[:, df3.columns != 'user_iD'] # Splitting the X and Y into the # Training set and Testing set from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0) # performing preprocessing part from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train= X_train.values.reshape(-1, 1) X_test = X_test.values.reshape(-1, 1) X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) # Applying PCA function on training # and testing set of X component from sklearn.decomposition import PCA pca = PCA(n_components = 2) X_train = pca.fit_transform(X_train) X_test = pca.transform(X_test) explained_variance = pca.explained_variance_ratio_
报错核心原因
原代码存在两处逻辑错误:
- 列赋值完全颠倒:把仅作为用户标识的单维度
user_iD列赋值给了本该存放行为特征的变量X,反而把8932个章节学习特征全部赋值给了无意义的标签变量y,后续所有预处理、PCA计算都只在单列用户ID上执行,完全没有用到真正的行为特征,最终触发维度错误。 - 场景适配错误:用户学习行为聚类是无监督任务,不存在需要预测的标签,不需要做训练集、测试集拆分,全量样本直接参与降维即可。
正确实现方案
import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA # 1. 加载数据 df3 = pd.read_feather('Bundles.ftr') # 2. 分离用户ID和行为特征:ID列不参与降维计算 user_ids = df3['user_iD'] X = df3.drop(columns=['user_iD']) # 3. 特征标准化:PCA对特征尺度敏感,必须执行标准化避免大数值特征干扰结果 sc = StandardScaler() X_scaled = sc.fit_transform(X) # 4. 执行PCA降维,若需要可视化可先设为2维,也可传入0.9自动保留90%方差 pca = PCA(n_components=2) X_pca = pca.fit_transform(X_scaled) # 5. 查看方差解释率,评估降维后的信息保留程度 explained_variance = pca.explained_variance_ratio_ print(f"各主成分方差解释率: {explained_variance}, 累计解释率: {explained_variance.sum():.2f}")
注意事项
- 数据中数值
0代表“未学习对应章节”,是有明确业务含义的有效值,不需要做缺失值填充,直接参与计算即可 - 如果2个主成分的累计方差解释率低于50%,说明信息损失过多,可将
n_components参数调整为0.8~0.9区间的数值,让PCA自动选择满足方差保留要求的最小维度数 - 降维输出的
X_pca矩阵可以直接输入KMeans、DBSCAN等聚类模型,完成用户学习行为分群
内容的提问来源于stack exchange,提问作者Haseeb Sultan
相关产品推荐
相关产品推荐

