循环执行线性回归时accuracy列表值全部相同的修复方案咨询
修复循环中线性回归结果重复的问题
看起来你遇到的问题是循环里每个迭代的结果都一模一样,这是因为代码里有几个关键的逻辑错误,我来帮你拆解并修复:
问题根源分析
- 覆盖原始数据集:循环中直接修改了原始的
data变量,导致后续迭代都是基于前一个子集的数据,而非完整的原始数据。 - 未基于子集提取特征:全局定义的
X和y指向的是整个数据集,没有针对每个商品子集重新提取特征与目标变量。 - 数据集划分逻辑错误:训练/测试集的切片操作是基于全局
X,而非当前子集的特征数据,导致每次都用相同的数据计算。 - 变量名笔误:代码中使用了未定义的
owner_cost,应该是real_cost。
修正后的代码
import numpy as np from sklearn import linear_model # 获取商品的唯一编码 codes = np.unique(data["cod_id"]) accuracy = [] # 循环遍历每个商品编码 for code in np.nditer(codes): # 提取当前商品的子集,注意不要覆盖原始data subset_data = data.loc[data["cod_id"] == code] # 从子集里提取特征与目标变量(线性回归要求X是二维数组) X_sub = subset_data['price'].values.reshape(-1, 1) y_sub = subset_data["quantity"] # 设置判断语句避免空数组,同时按80%训练集、20%测试集划分 if len(subset_data) <= 2: # 数据量太少,直接用整个子集作为训练和测试(或根据需求跳过) X_train = X_sub y_train = y_sub X_test = X_sub y_test = y_sub else: t = int(0.8 * len(subset_data)) # 基于当前子集划分训练/测试集 X_train = X_sub[:t] y_train = y_sub[:t] X_test = X_sub[t:] y_test = y_sub[t:] # 运行线性回归算法 lr = linear_model.LinearRegression() lr.fit(X_train, y_train) predicted_test_tr = lr.predict(X_test) # 计算预测成本与真实成本(X_test是二维数组,需要flatten转为一维) pred_cost = (X_test.flatten() * predicted_test_tr).sum() real_cost = (X_test.flatten() * y_test.values).sum() # 计算delta并加入列表(避免除以0的异常) if real_cost != 0: delta = (pred_cost - real_cost) / real_cost accuracy.append(delta) else: # 处理真实成本为0的特殊情况,可根据需求调整 accuracy.append(np.nan)
额外说明
- 线性回归要求输入特征
X为二维数组,所以用reshape(-1, 1)将一维的价格数据转换为符合要求的格式。 - 增加了
real_cost != 0的判断,避免出现除以0的运行错误。 - 循环变量改用
code替代i,提升代码可读性。
内容的提问来源于stack exchange,提问作者Alessandro Ceccarelli
相关产品推荐
相关产品推荐

