You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

商场数据集K-means聚类后线性回归预测值对比报错求助

解决K-means聚类后线性回归的ValueError问题

嘿,我来帮你搞定这个报错问题~ 先看看你遇到的错误:ValueError: array length 35 does not match index length 18,根源其实很简单,就是你用来创建DataFrame的两个数组长度不一样,没法对齐。

错误原因拆解

  • 你用y_pred = regressor.predict(X)生成的预测值,是基于整个聚类子集df0的所有特征数据(也就是X的长度是df0的总样本数,假设是35条)
  • 而y_test是train_test_split拆分后的测试集真实值,因为你设置了test_size=0.5,所以它的长度是总样本数的一半(也就是18条)
  • 两个数组长度不匹配,Pandas自然没法把它们放到同一个DataFrame里,就抛出了这个错误。

具体修正方案

1. 修正预测数据的来源

把预测时用的数据集从整个X改成测试集X_test,这样生成的y_pred长度就和y_test完全一致了:

# 原来的错误写法
# y_pred = regressor.predict(X)
# 改成下面这样
y_pred = regressor.predict(X_test)

2. 补全缺失的mydict定义

你的代码里用了mydict[0]但没定义mydict,这会导致df0创建失败,需要在生成df0之前加上这段代码,把K-means每个簇的索引存到字典里:

import numpy as np
# 把每个簇的样本索引存入mydict
mydict = {i: np.where(y_kmeans == i)[0] for i in range(kmeans.n_clusters)}

3. 完整修正后的代码

整合所有修正后的完整代码如下:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression

# 读取数据集,补充'Age'列(原代码X用到了但读取时没选)
df = pd.read_csv('D:\\Mall_Customers.csv', usecols = ['Spending Score (1-100)', 'Annual Income (k$)', 'Age'])
# 仅对聚类用到的特征做标准化
x = StandardScaler().fit_transform(df[['Spending Score (1-100)', 'Annual Income (k$)']])

kmeans = KMeans(n_clusters=5, max_iter=100, random_state=0)
y_kmeans = kmeans.fit_predict(x)

# 补全mydict定义,存储每个簇的样本索引
mydict = {i: np.where(y_kmeans == i)[0] for i in range(kmeans.n_clusters)}
df0 = df[df.index.isin(mydict[0].tolist())]

Y = df0['Spending Score (1-100)']
X = df0[['Annual Income (k$)','Age']]

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size = 0.5, random_state = 0)

regressor = LinearRegression()
regressor.fit(X_train, y_train)

r_sq = regressor.score(X, Y)
print('coefficient of determination:', r_sq)
print('intercept:', regressor.intercept_)
print('slope:', regressor.coef_)

# 用测试集X_test预测,得到和y_test长度一致的y_pred
y_pred = regressor.predict(X_test)

# 现在可以正常创建DataFrame并打印了
df_result = pd.DataFrame({'Actual': y_test, 'Predicted': y_pred})
print(df_result)

额外说明

如果你想对比整个聚类子集df0的真实值和预测值,而不是只对比测试集,那应该用整个Y和基于整个X的预测值来创建DataFrame,代码如下:

y_pred_full = regressor.predict(X)
df_full_result = pd.DataFrame({'Actual': Y, 'Predicted': y_pred_full})
print(df_full_result)

内容的提问来源于stack exchange,提问作者user13281288

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 17:03:13