按行生成回归预测(Python):双模型预测报错求解
解决回归预测对比与推理适配问题
核心问题分析
ValueError: Shape of passed values is (11, 1), indices imply (11, 11):多因预测结果为二维数组(如(11,1)),但构造DataFrame时误将其当作多列数据传入,或索引不匹配导致。- 列名匹配失败:训练时特征列名与推理输入列名不一致,或合并结果时列名未正确指定。
简洁实现方案(适配训练+推理全流程)
以下是符合机器学习常规流程的代码,包含数据拆分、模型训练、预测对比、MAE评估,同时适配推理阶段:
import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.linear_model import LinearRegression from sklearn.ensemble import RandomForestRegressor from sklearn.metrics import mean_absolute_error # ---------------------- 1. 数据准备 ---------------------- # 示例数据集,替换为你的真实数据 df = pd.DataFrame({ 'distance': np.random.rand(100) * 100, 'target': np.random.rand(100) * 50 + 0.3 * np.random.rand(100) * 100 }) # 拆分数据集:X必须为二维数组(双括号[[...]]保证维度) X = df[['distance']] y = df['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=42) # ---------------------- 2. 训练双回归器 ---------------------- model_lr = LinearRegression() model_rf = RandomForestRegressor(random_state=42) model_lr.fit(X_train, y_train) model_rf.fit(X_train, y_train) # ---------------------- 3. 预测结果与真实值对比 ---------------------- # 获取一维预测结果,避免形状冲突 y_pred_lr = model_lr.predict(X_test) y_pred_rf = model_rf.predict(X_test) # 合并为对比DataFrame,保留原测试集索引 compare_df = pd.DataFrame({ '真实值': y_test.values, '线性回归预测': y_pred_lr, '随机森林预测': y_pred_rf }, index=y_test.index) print("真实值与预测值对比:") print(compare_df.head()) # ---------------------- 4. MAE指标评估 ---------------------- mae_lr = mean_absolute_error(y_test, y_pred_lr) mae_rf = mean_absolute_error(y_test, y_pred_rf) print(f"\n线性回归MAE: {mae_lr:.2f}") print(f"随机森林MAE: {mae_rf:.2f}") # ---------------------- 5. 推理阶段适配函数 ---------------------- def predict_by_distance(model, distance_input): """ 兼容单个/批量distance输入的推理函数 :param model: 训练完成的回归模型 :param distance_input: 单个数值/数值列表/数组 :return: 预测结果(单个值/数组) """ # 统一转为二维数组,符合sklearn模型输入要求 X_in = np.array(distance_input).reshape(-1, 1) pred_result = model.predict(X_in) # 单个输入返回数值,批量返回数组 return pred_result[0] if len(pred_result) == 1 else pred_result # 推理示例 single_pred = predict_by_distance(model_lr, 50) batch_pred = predict_by_distance(model_rf, [20, 30, 70]) print(f"\n单个distance=50的预测值(线性回归):{single_pred:.2f}") print(f"批量distance=[20,30,70]的预测值(随机森林):{batch_pred.round(2)}")
关键注意点
- 训练/推理时特征输入必须为二维数组:用
df[['distance']]而非df['distance'],推理时通过reshape(-1,1)确保输入维度正确。 - 构造对比DataFrame时直接使用一维预测结果,避免二维数组导致的形状不匹配错误。
- 推理函数兼容单值与批量输入,适配实际部署场景。
内容的提问来源于stack exchange,提问作者kevin811
相关产品推荐
相关产品推荐

