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

使用abline_plot与statsmodels绘制预测值vs实际值图的报错解决

问题

我想用Python重现R语言里的「预测值vs实际值」图,使用经典波士顿房价数据集,通过statsmodels构建多元线性回归模型,代码如下:

import statsmodels.formula.api as smf
results = smf.ols('medv ~ col1 + col2 + ...', data=boston).fit()

接着创建了包含实际值和预测值的DataFrame:

new_df = pd.concat([boston['medv'], results.fittedvalues], axis=1, keys=['actual', 'predicted'])

但绘制散点图并添加回归线时报错,代码和错误信息如下:

from statsmodels.graphics.regressionplots import abline_plot
# 绘制散点图
ax = new_df.plot(x='actual', y='predicted', kind='scatter')
# 绘制回归线
abline_plot(model_results=results, ax=ax)

报错信息:

ValueError                                Traceback (most recent call last)
<ipython-input-156-ebb218ba87be> in <module>
      5 
      6 # plot regression line
----> 7 abline_plot(model_results=results, ax=ax)

/usr/local/lib/python3.8/dist-packages/statsmodels/graphics/regressionplots.py in abline_plot(intercept, slope, horiz, vert, model_results, ax, **kwargs)
    797 
    798     if model_results:
---> 799         intercept, slope = model_results.params
    800         if x is None:
    801             x = [model_results.model.exog[:, 1].min(),

ValueError: too many values to unpack (expected 2)

使用的自变量如下:

{'crim': {0: 0.00632, 1: 0.02731, 2: 0.02729, 3: 0.03237, 4: 0.06905},
 'chas': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
 'nox': {0: 0.538, 1: 0.469, 2: 0.469, 3: 0.458, 4: 0.458},
 'rm': {0: 6.575, 1: 6.421, 2: 7.185, 3: 6.998, 4: 7.147},
 'dis': {0: 4.09, 1: 4.9671, 2: 4.9671, 3: 6.0622, 4: 6.0622},
 'tax': {0: 296, 1: 242, 2: 242, 3: 222, 4: 222},
 'ptratio': {0: 15.3, 1: 17.8, 2: 17.8, 3: 18.7, 4: 18.7},
 'lstat': {0: 4.98, 1: 9.14, 2: 4.03, 3: 2.94, 4: 5.33},
 'rad3': {0: 0, 1: 0, 2: 0, 3: 1, 4: 1},
 'rad4': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
 'rad5': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
 'rad6': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
 'rad7': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
 'rad8': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
 'rad24': {0: 0, 1: 0, 2: 0, 3: 0, 4: 0},
 'dis_sq': {0: 16.728099999999998,
  1: 24.67208241,
  2: 24.67208241,
  3: 36.75026884,
  4: 36.75026884},
 'lstat_sq': {0: 24.800400000000003,
  1: 83.53960000000001,
  2: 16.240900000000003,
  3: 8.6436,
  4: 28.4089},
 'nox_sq': {0: 0.28944400000000003,
  1: 0.21996099999999996,
  2: 0.21996099999999996,
  3: 0.209764,
  4: 0.209764},
 'rad24_lstat': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0},
 'rm_lstat': {0: 32.743500000000004,
  1: 58.687940000000005,
  2: 28.95555,
  3: 20.57412,
  4: 38.09351},
 'rm_rad24': {0: 0.0, 1: 0.0, 2: 0.0, 3: 0.0, 4: 0.0}}

解决方法

报错原因

abline_plot的model_results参数是为一元线性回归模型设计的,会提取模型的截距和斜率两个参数。但你构建的是多元线性回归模型,参数数量远多于2个,因此触发「too many values to unpack」错误。

而预测值vs实际值图需要的是理想拟合线(即y=x),不需要关联原多元回归模型的参数,直接指定截距为0、斜率为1即可。

修正后的代码

from statsmodels.graphics.regressionplots import abline_plot
import matplotlib.pyplot as plt

# 绘制散点图,添加透明度避免点重叠
ax = new_df.plot(x='actual', y='predicted', kind='scatter', alpha=0.6)
# 绘制y=x的理想回归线
abline_plot(intercept=0, slope=1, ax=ax, color='red', linestyle='--')

# 添加图表标注
plt.title('Actual vs Predicted Values')
plt.xlabel('Actual MEDV')
plt.ylabel('Predicted MEDV')
plt.show()

补充:绘制预测值与实际值的拟合线

如果想要观察预测值与实际值的真实线性关系(而非理想y=x线),可以单独对actual和predicted做一元线性回归,再传入模型结果:

# 对实际值和预测值做一元回归
simple_model = smf.ols('predicted ~ actual', data=new_df).fit()
# 绘制回归线
abline_plot(model_results=simple_model, ax=ax, color='green')

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:40:26