商场数据集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
相关产品推荐
相关产品推荐

