ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

【机器学习入门】多元线性回归超详细教程 —— 从原理到 sklearn 代码全实现

2026/8/5 23:59:00 拓冰建站 浏览量
【机器学习入门】多元线性回归超详细教程 —— 从原理到 sklearn 代码全实现

文章目录

    • 前言
    • 一、线性回归是什么?
    • 二、数据集介绍
    • 三、sklearn LinearRegression API 详解
      • 3.1 构造函数参数
      • 3.2 常用属性
      • 3.3 常用方法
    • 四、代码案例:多元线性回归预测血压
    • 五、结果分析
      • 5.1 回归方程
      • 5.2 系数解读
      • 5.3 模型评估
    • 六、避坑指南:那些年我们踩过的坑
      • ❌ 坑1:`normalize` 参数已经被移除了
      • ❌ 坑2:`fit` 方法没有 `n_jobs` 参数
      • ❌ 坑3:CSV 文件编码问题
    • 七、总结

前言

大家好!今天咱们来聊聊机器学习里最经典、最基础的算法——线性回归。别小看它,虽然简单,但它是几乎所有机器学习算法的"敲门砖",搞懂了线性回归,后面学逻辑回归、SVM、神经网络都会轻松很多。

这篇文章我会带大家从原理到代码实战一条龙走一遍,用的是 sklearn 库,新手也能直接跑通!文末我还会指出一些网上常见教程里的错误和过时信息,帮大家避坑~


一、线性回归是什么?

简单来说,线性回归就是用一条直线(或超平面)去拟合数据点的分布规律,然后用这条线去做预测。

举个最简单的例子:你想根据一个人的体重年龄来预测他的血压收缩压。这就是一个典型的多元线性回归问题——有两个自变量(体重、年龄),一个因变量(血压收缩)。

数学公式长这样:

y = β 0 + β 1 x 1 + β 2 x 2 + ⋯ + β n x n + ϵ y = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \dots + \beta_n x_n + \epsilony=β0+β1x1+β2x2++βnxn+ϵ

其中:

  • y yy是因变量(我们要预测的值)
  • x 1 , x 2 , … , x n x_1, x_2, \dots, x_nx1,x2,,xn是自变量(特征)
  • β 0 \beta_0β0是截距(常数项)
  • β 1 , β 2 , … , β n \beta_1, \beta_2, \dots, \beta_nβ1,β2,,βn是回归系数(每个特征的权重)
  • ϵ \epsilonϵ是误差项

线性回归的目标就是找到一组最优的β \betaβ值,让预测值和真实值之间的误差最小。常用的方法是最小二乘法,说白了就是让所有样本的预测误差平方和最小。


二、数据集介绍

今天咱们用的是一组教学示例数据集,一共 13 条数据,3 个字段:

体重(kg)年龄(岁)血压收缩(mmHg)
76.050120
91.520141
85.520124
82.530126
79.030117
80.550125
74.560123
79.050125
85.040132
76.555123
82.040132
95.040155
92.520147

数据说明:本组数据为机器学习入门教学用的示例数据,仅用于演示线性回归算法的建模流程。

数据集保存为 CSV 格式,注意编码是GBK(中文编码),读取的时候要指定encoding='gbk',否则会乱码。


三、sklearn LinearRegression API 详解

sklearn(全称 scikit-learn)是 Python 里最常用的机器学习库,线性回归的实现就在sklearn.linear_model.LinearRegression里。

3.1 构造函数参数

LinearRegression(*,fit_intercept=True,copy_X=True,n_jobs=None,positive=False)
参数名类型默认值说明
fit_interceptboolTrue是否计算截距项。如果设为False,则回归线过原点(不推荐,除非你确定数据已经中心化)
copy_XboolTrue是否复制特征矩阵 X。如果设为False,会直接在原数据上操作,可能覆盖原始数据
n_jobsintNone并行计算的 CPU 核心数。设为-1表示使用所有核心。对大规模多目标回归有加速效果
positiveboolFalse是否强制回归系数为正数。如果设为True,所有 coef_ 都会 ≥ 0(某些业务场景会用到)

3.2 常用属性

训练完模型后,可以通过以下属性查看模型参数:

属性名说明
coef_回归系数数组,形状为(n_features,)。每个特征对应一个系数,系数越大说明该特征对结果影响越大
intercept_截距项(常数项),一个浮点数

3.3 常用方法

方法说明
fit(X, y, sample_weight=None)训练模型。X 是特征矩阵,y 是目标值
predict(X)用训练好的模型做预测,返回预测值数组
score(X, y, sample_weight=None)计算模型的R 2 R^2R2得分(决定系数),越接近 1 说明拟合效果越好

四、代码案例:多元线性回归预测血压

话不多说,直接上代码!这是一个完整的可运行示例:

# 导入所需库importpandasaspdfromsklearn.linear_modelimportLinearRegression# ========== 1. 读取数据 ==========# 注意:CSV文件是GBK编码,必须指定encoding='gbk',否则中文列名会乱码data=pd.read_csv('多元线性回归.csv',encoding='gbk',engine='python')print("===== 数据预览 =====")print(data.head())print(f"\n数据形状:{data.shape}")# (13, 3) 13条数据,3列# ========== 2. 准备特征和目标 ==========X=data[['体重','年龄']]# 自变量:体重、年龄y=data['血压收缩']# 因变量:血压收缩压# ========== 3. 创建并训练模型 ==========lr_model=LinearRegression()# 创建线性回归模型lr_model.fit(X,y)# 训练模型# ========== 4. 查看模型参数 ==========print("\n===== 模型参数 =====")print(f"回归系数(coef_):{lr_model.coef_}")print(f"截距(intercept_):{lr_model.intercept_:.4f}")# 把系数和特征对应起来看更直观print("\n各特征对应的系数:")forfeature,coefinzip(X.columns,lr_model.coef_):print(f"{feature}:{coef:.4f}")# ========== 5. 模型评估 ==========r2_score=lr_model.score(X,y)print(f"\n===== 模型评估 =====")print(f"R²得分:{r2_score:.4f}")# ========== 6. 预测示例 ==========y_pred=lr_model.predict(X)print("\n===== 预测结果对比(前5条) =====")print(f"{'序号':<4}{'实际值':<8}{'预测值':<8}{'误差':<8}")print("-"*30)foriinrange(5):error=y.iloc[i]-y_pred[i]print(f"{i+1:<4}{y.iloc[i]:<8}{y_pred[i]:<8.2f}{error:<8.2f}")

运行结果

===== 数据预览 ===== 体重 年龄 血压收缩 0 76.0 50 120 1 91.5 20 141 2 85.5 20 124 3 82.5 30 126 4 79.0 30 117 数据形状:(13, 3) ===== 模型参数 ===== 回归系数(coef_):[2.13655814 0.40021615] 截距(intercept_):-62.9634 各特征对应的系数: 体重: 2.1366 年龄: 0.4002 ===== 模型评估 ===== R²得分:0.9461 ===== 预测结果对比(前5条) ===== 序号 实际值 预测值 误差 ------------------------------ 1 120 119.43 0.57 2 141 140.54 0.46 3 124 127.72 -3.72 4 126 125.31 0.69 5 117 117.83 -0.83

五、结果分析

5.1 回归方程

根据训练结果,我们可以写出回归方程:

血压收缩 = − 62.96 + 2.14 × 体重 + 0.40 × 年龄 \text{血压收缩} = -62.96 + 2.14 \times \text{体重} + 0.40 \times \text{年龄}血压收缩=62.96+2.14×体重+0.40×年龄

5.2 系数解读

  • 体重系数 2.14:在年龄不变的情况下,体重每增加 1kg,模型预测的血压收缩压平均升高约 2.14 mmHg
  • 年龄系数 0.40:在体重不变的情况下,年龄每增加 1 岁,模型预测的血压收缩压平均升高约 0.40 mmHg

结论:体重对血压的影响比年龄更大!

5.3 模型评估

R 2 = 0.9461 R^2 = 0.9461R2=0.9461,这个分数非常高!说明在本组示例数据中,模型能解释 94.6% 的血压变化,拟合效果非常好。

注意R 2 R^2R2高不一定代表模型就一定好,特别是数据量小的时候。实际项目中还要做交叉验证、残差分析等,这里只是入门示例~


六、避坑指南:那些年我们踩过的坑

在整理资料的过程中,我发现了一些网上常见教程里的错误和过时信息,这里统一给大家指出来,避免踩坑:

❌ 坑1:normalize参数已经被移除了

很多老教程里会写LinearRegression(normalize=True),但这个参数在sklearn 1.0 版本就被弃用了,在1.2 版本正式移除

如果你用的是新版 sklearn(比如 1.4),传normalize参数会直接报错:

TypeError: LinearRegression.__init__() got an unexpected keyword argument 'normalize'

正确做法:用StandardScaler做标准化:

fromsklearn.preprocessingimportStandardScaler scaler=StandardScaler()X_scaled=scaler.fit_transform(X)lr_model=LinearRegression()lr_model.fit(X_scaled,y)

❌ 坑2:fit方法没有n_jobs参数

有些文档说fit(X, y, n_jobs=-1),这是错误的

n_jobs构造函数的参数,不是fit方法的参数。正确写法:

# 正确 ✅lr_model=LinearRegression(n_jobs=-1)lr_model.fit(X,y)# 错误 ❌lr_model=LinearRegression()lr_model.fit(X,y,n_jobs=-1)# 会报错!

❌ 坑3:CSV 文件编码问题

如果 CSV 文件里有中文列名,直接用pd.read_csv()可能会乱码。要注意文件的编码格式:

  • GBK 编码 →encoding='gbk'
  • UTF-8 编码 →encoding='utf-8'(默认)

不确定编码的话,可以用记事本打开文件,另存为时看一下编码。


七、总结

今天咱们从零开始学习了多元线性回归,回顾一下重点:

  1. 线性回归是用线性方程拟合数据、做预测的算法
  2. sklearn LinearRegression用起来很简单,核心就三步:创建模型 → fit → predict
  3. R 2 R^2R2得分是评估回归模型的常用指标,越接近 1 越好
  4. 注意避坑normalize参数已移除、n_jobs在构造函数里、CSV 编码问题

线性回归虽然简单,但它的思想——找最优参数让误差最小——是几乎所有机器学习算法的核心。把这个搞懂了,后面学更复杂的算法会事半功倍。

如果这篇文章对你有帮助,别忘了点赞收藏~ 有问题欢迎在评论区交流!