如何从Scikit-learn训练的线性回归模型中获取斜率与截距
解决单变量线性回归中斜率/截距获取异常的问题
嘿,我一眼就看出问题出在哪了——你给模型的输入数据格式完全不符合sklearn的要求,才导致intercept_返回了一个大型数组。咱们一步步来修正:
问题根源
sklearn.linear_model.LinearRegression.fit()方法对输入格式有明确要求:
- 特征数据
X必须是二维数组,形状为(样本数量, 特征数量) - 目标数据
y必须是一维数组,形状为(样本数量,)
你写的regr.fit([x], [y])相当于把整个x数组当成了1个样本的97个特征,把整个y数组当成了这个样本对应的目标值。模型训练的是97个特征的多变量回归,自然intercept_会是长度为97的数组,这完全不是你想要的单变量线性回归结果。
修正后的代码
只需要把x转换成符合要求的二维数组,再重新训练模型即可:
from sklearn import linear_model import numpy as np # 你的原始数据 x =[6.1101, 5.5277, 8.5186, 7.0032, 5.8598, 8.3829, 7.4764, 8.5781, 6.4862, 5.0546, 5.7107, 14.164, 5.734, 8.4084, 5.6407, 5.3794, 6.3654, 5.1301, 6.4296, 7.0708, 6.1891, 20.27, 5.4901, 6.3261, 5.5649, 18.945, 12.828, 10.957, 13.176, 22.203, 5.2524, 6.5894, 9.2482, 5.8918, 8.2111, 7.9334, 8.0959, 5.6063, 12.836, 6.3534, 5.4069, 6.8825, 11.708, 5.7737, 7.8247, 7.0931, 5.0702, 5.8014, 11.7, 5.5416, 7.5402, 5.3077, 7.4239, 7.6031, 6.3328, 6.3589, 6.2742, 5.6397, 9.3102, 9.4536, 8.8254, 5.1793, 21.279, 14.908, 18.959, 7.2182, 8.2951, 10.236, 5.4994, 20.341, 10.136, 7.3345, 6.0062, 7.2259, 5.0269, 6.5479, 7.5386, 5.0365, 10.274, 5.1077, 5.7292, 5.1884, 6.3557, 9.7687, 6.5159, 8.5172, 9.1802, 6.002, 5.5204, 5.0594, 5.7077, 7.6366, 5.8707, 5.3054, 8.2934, 13.394, 5.4369] y = [17.592, 9.1302, 13.662, 11.854, 6.8233, 11.886, 4.3483, 12, 6.5987, 3.8166, 3.2522, 15.505, 3.1551, 7.2258, 0.71618, 3.5129, 5.3048, 0.56077, 3.6518, 5.3893, 3.1386, 21.767, 4.263, 5.1875, 3.0825, 22.638, 13.501, 7.0467, 14.692, 24.147, -1.22, 5.9966, 12.134, 1.8495, 6.5426, 4.5623, 4.1164, 3.3928, 10.117, 5.4974, 0.55657, 3.9115, 5.3854, 2.4406, 6.7318, 1.0463, 5.1337, 1.844, 8.0043, 1.0179, 6.7504, 1.8396, 4.2885, 4.9981, 1.4233, -1.4211, 2.4756, 4.6042, 3.9624, 5.4141, 5.1694, -0.74279, 17.929, 12.054, 17.054, 4.8852, 5.7442, 7.7754, 1.0173, 20.992, 6.6799, 4.0259, 1.2784, 3.3411, -2.6807, 0.29678, 3.8845, 5.7014, 6.7526, 2.0576, 0.47953, 0.20421, 0.67861, 7.5435, 5.3436, 4.2415, 6.7981, 0.92695, 0.152, 2.8214, 1.8451, 4.2959, 7.2029, 1.9869, 0.14454, 9.0551, 0.61705] # 将一维x转换为二维数组:97个样本,每个样本1个特征 X = np.array(x).reshape(-1, 1) # y转换为一维numpy数组(可选,但更规范) Y = np.array(y) # 创建并训练模型 regr = linear_model.LinearRegression() regr.fit(X, Y) # 获取斜率和截距 slope = regr.coef_[0] # 单变量回归,coef_是长度为1的数组,取第一个元素 intercept = regr.intercept_ print(f"回归直线斜率: {slope:.4f}") print(f"回归直线截距: {intercept:.4f}")
关键说明
reshape(-1,1)是个小技巧:-1表示让numpy自动计算行数(这里就是样本数97),1表示列数为1,刚好符合单特征回归的要求。- 训练完成后,
regr.coef_会是一个长度为1的数组(对应唯一的特征),regr.intercept_会是一个单一的浮点数,这就是你需要的截距。
内容的提问来源于stack exchange,提问作者Sami Al-Subhi
相关产品推荐
相关产品推荐

