为何使用sklearn KMeans拟合模型后数据集发生改变?
问题根源与修正方案
你的数据集变化不是KMeans导致的,是预处理阶段的独热编码操作错误,加上参数拼写问题,具体问题和解决方法如下:
核心问题
- 独热编码赋值错误:
OneHotEncoder处理二元分类变量Private时,会生成2列结果(比如Private_Yes和Private_No),但你直接把二维数组赋值给data["Private"]这一列,导致该列每个单元格变成了长度为2的数组,直接破坏了数据集结构。 - KMeans参数拼写错误:代码里写的是
n_cluster,正确参数名是n_clusters,运行时会直接报错。
修正后的完整代码
# 复制原数据,避免破坏原始数据集 data_processed = data.copy() # 标准化数值变量 num_vars = data_processed.columns[1:] scaler = StandardScaler() data_processed[num_vars] = scaler.fit_transform(data_processed[num_vars]) # 正确执行独热编码 ohe = OneHotEncoder(sparse_output=False) # 对Private列编码,得到二维数组 private_encoded = ohe.fit_transform(data_processed[["Private"]]) # 将编码后的列添加到数据集,用自动生成的列名(如Private_Yes、Private_No) data_processed[ohe.get_feature_names_out(["Private"])] = private_encoded # 删除原Private列 data_processed.drop("Private", axis=1, inplace=True) # 初始化KMeans(修正参数名,添加random_state保证结果可复现) km = KMeans(n_clusters=6, random_state=42) # 用处理好的特征矩阵拟合模型 km.fit(data_processed) # 可选:将聚类标签加入数据集 data_processed["cluster_label"] = km.labels_
补充说明
- KMeans的
fit()方法不会修改输入数据集,它只计算聚类中心和标签,你看到的数据集变化完全是预处理时错误赋值独热编码导致的。 - 处理分类变量时,尽量避免直接修改原数据集的列结构,用复制后的数据集操作更安全。
内容的提问来源于stack exchange,提问作者Mina
相关产品推荐
相关产品推荐

