【机器学习入门】多元线性回归超详细教程 —— 从原理到 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.0 | 50 | 120 |
| 91.5 | 20 | 141 |
| 85.5 | 20 | 124 |
| 82.5 | 30 | 126 |
| 79.0 | 30 | 117 |
| 80.5 | 50 | 125 |
| 74.5 | 60 | 123 |
| 79.0 | 50 | 125 |
| 85.0 | 40 | 132 |
| 76.5 | 55 | 123 |
| 82.0 | 40 | 132 |
| 95.0 | 40 | 155 |
| 92.5 | 20 | 147 |
数据说明:本组数据为机器学习入门教学用的示例数据,仅用于演示线性回归算法的建模流程。
数据集保存为 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_intercept | bool | True | 是否计算截距项。如果设为False,则回归线过原点(不推荐,除非你确定数据已经中心化) |
copy_X | bool | True | 是否复制特征矩阵 X。如果设为False,会直接在原数据上操作,可能覆盖原始数据 |
n_jobs | int | None | 并行计算的 CPU 核心数。设为-1表示使用所有核心。对大规模多目标回归有加速效果 |
positive | bool | False | 是否强制回归系数为正数。如果设为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'(默认)
不确定编码的话,可以用记事本打开文件,另存为时看一下编码。
七、总结
今天咱们从零开始学习了多元线性回归,回顾一下重点:
- 线性回归是用线性方程拟合数据、做预测的算法
- sklearn LinearRegression用起来很简单,核心就三步:创建模型 → fit → predict
- R 2 R^2R2得分是评估回归模型的常用指标,越接近 1 越好
- 注意避坑:
normalize参数已移除、n_jobs在构造函数里、CSV 编码问题
线性回归虽然简单,但它的思想——找最优参数让误差最小——是几乎所有机器学习算法的核心。把这个搞懂了,后面学更复杂的算法会事半功倍。
如果这篇文章对你有帮助,别忘了点赞收藏~ 有问题欢迎在评论区交流!
