为何Linear Regression模型的y-intercept与图表显示值不一致?
线性回归截距计算值与图表显示值不符的原因
我用scikit-learn构建线性回归模型,输出的y截距为152.91886182616167,但matplotlib绘制的回归直线图表中,视觉上的“截距”仅约80,二者不匹配。相关代码、输出及图表如下:
代码
# Adapted from https://scikit-learn.org/stable/auto_examples/linear_model/plot_ols.html#sphx-glr-auto-examples-linear-model-plot-ols-py # Code source: Jaques Grobler # License: BSD 3 clause import matplotlib.pyplot as plt import numpy as np from sklearn import datasets, linear_model from sklearn.metrics import mean_squared_error, r2_score diabetes_X, diabetes_y = datasets.load_diabetes(return_X_y = True) diabetes_X = diabetes_X[:, np.newaxis, 2] diabetes_X_train = diabetes_X[:-20] diabetes_X_test = diabetes_X[-20:] diabetes_y_train = diabetes_y[:-20] diabetes_y_test = diabetes_y[-20:] regr = linear_model.LinearRegression() regr.fit(diabetes_X_train, diabetes_y_train) diabetes_y_pred = regr.predict(diabetes_X_test) # The y-intercept print("y-intercept: \n", regr.intercept_) plt.scatter(diabetes_X_test, diabetes_y_test, color="black") plt.plot(diabetes_X_test, diabetes_y_pred, color="blue", linewidth=3) plt.xlabel('x') plt.ylabel('y') plt.show()
脚本输出
y-intercept: 152.91886182616167
图表

原因分析
- 图表仅绘制了回归直线的局部片段:当前代码只绘制了测试集
diabetes_X_test对应的回归预测值,而测试集的x取值范围不包含0(diabetes数据集的特征已做标准化处理,测试集x的最小值约为-0.08)。你看到的“视觉截距”其实是直线在测试集x最小值处的y值,而非回归方程定义的x=0时的y截距。 - 回归方程的真实截距验证:回归方程为
y = coef * x + intercept,打印回归系数regr.coef_会得到约949的结果。代入测试集的最小x值(如-0.08),计算得y = 949*(-0.08) + 152.9 ≈ 77,和图表显示的数值一致,说明模型计算的截距是正确的,只是图表没有展示x=0处的直线部分。 - 解决方法:若要在图表中显示真实的y截距,可修改绘图代码,让x轴范围包含0,例如:
这样绘制的完整直线会穿过x=0、y≈153的位置,和模型输出的截距完全一致。# 生成包含0的x范围 x_full = np.linspace(diabetes_X.min(), diabetes_X.max(), 100) y_full_pred = regr.predict(x_full[:, np.newaxis]) plt.plot(x_full, y_full_pred, color="blue", linewidth=3)
内容的提问来源于stack exchange,提问作者nicomp
相关产品推荐
相关产品推荐

