Python新手神经网络回归:预测与实际值索引不匹配问题求助
解决预测值与实际值索引不匹配问题及后续可视化/评估方案
首先,咱们先定位问题核心:你手动遍历匹配X_test和原始X的方式存在两个致命问题:
- 如果原始数据中有重复的特征行,同一个
X_test的样本可能在原始X中找到多个匹配项,导致actual_values长度超过pred(就是你遇到的13 vs 12的情况); - 完全没必要这么做!
train_test_split函数已经帮你把对应X_test的实际值拆成y_test了,两者是天然一一对应的。
一步修正代码(直接用y_test作为实际值)
把你手动找索引的代码全部删掉,替换成下面的简化版本:
#import statements import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.neural_network import MLPRegressor from sklearn.model_selection import train_test_split %matplotlib inline #importing the dataset data = pd.read_csv("PPV_dataset.csv") X = data.drop(["PPV"], axis=1) # 用axis=1替代旧写法,适配新版pandas y = data["PPV"] #model training & prediction nn = MLPRegressor(hidden_layer_sizes=(100,), activation='logistic', solver='sgd') # 拆分数据:X_train/X_test和y_train/y_test是严格对应的 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25) nn.fit(X_train, y_train) pred = nn.predict(X_test) # 验证长度:现在两者肯定一致 print(f"实际值长度: {len(y_test)}, 预测值长度: {len(pred)}")
如果你需要获取测试样本的原始索引
如果后续需要用到这些测试样本在原始数据集里的位置,直接用X_test的索引即可(因为我们用DataFrame存储X,保留了原始索引):
# 获取测试样本的原始索引 test_original_indices = X_test.index # 通过索引取实际值(和y_test完全等价) actual_values = y.loc[test_original_indices]
绘制预测值vs实际值曲线
现在可以放心绘制对比图了,加上一条完美预测的参考线会更直观:
plt.figure(figsize=(10, 6)) # 散点图展示预测值与实际值的分布 plt.scatter(y_test, pred, alpha=0.6, label='预测值') # 绘制y=x参考线(代表完美预测) plt.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', label='完美预测线') plt.xlabel('实际值 (PPV)') plt.ylabel('预测值 (PPV)') plt.title('神经网络回归:预测值 vs 实际值') plt.legend() plt.show()
关于回归系数的说明
MLP是非线性神经网络模型,不像线性回归那样有明确的单一回归系数。如果要评估模型的回归性能,推荐用这些常用指标:
from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error r2 = r2_score(y_test, pred) mae = mean_absolute_error(y_test, pred) mse = mean_squared_error(y_test, pred) print(f"R²决定系数: {r2:.4f}") # 越接近1越好 print(f"平均绝对误差(MAE): {mae:.4f}") print(f"均方误差(MSE): {mse:.4f}")
内容的提问来源于stack exchange,提问作者Robert Nyirenda
相关产品推荐
相关产品推荐

