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

发布时间:2026/8/5 23:55:05
【机器学习入门】多元线性回归超详细教程 —— 从原理到 sklearn 代码全实现 文章目录前言一、线性回归是什么二、数据集介绍三、sklearn LinearRegression API 详解3.1 构造函数参数3.2 常用属性3.3 常用方法四、代码案例多元线性回归预测血压五、结果分析5.1 回归方程5.2 系数解读5.3 模型评估六、避坑指南那些年我们踩过的坑❌ 坑1normalize 参数已经被移除了❌ 坑2fit 方法没有 n_jobs 参数❌ 坑3CSV 文件编码问题七、总结前言大家好今天咱们来聊聊机器学习里最经典、最基础的算法——线性回归。别小看它虽然简单但它是几乎所有机器学习算法的敲门砖搞懂了线性回归后面学逻辑回归、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​β1​x1​β2​x2​⋯βn​xn​ϵ其中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年龄岁血压收缩mmHg76.05012091.52014185.52012482.53012679.03011780.55012574.56012379.05012585.04013276.55512382.04013295.04015592.520147数据说明本组数据为机器学习入门教学用的示例数据仅用于演示线性回归算法的建模流程。数据集保存为 CSV 格式注意编码是GBK中文编码读取的时候要指定encodinggbk否则会乱码。三、sklearn LinearRegression API 详解sklearn全称 scikit-learn是 Python 里最常用的机器学习库线性回归的实现就在sklearn.linear_model.LinearRegression里。3.1 构造函数参数LinearRegression(*,fit_interceptTrue,copy_XTrue,n_jobsNone,positiveFalse)参数名类型默认值说明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_weightNone)训练模型。X 是特征矩阵y 是目标值predict(X)用训练好的模型做预测返回预测值数组score(X, y, sample_weightNone)计算模型的R 2 R^2R2得分决定系数越接近 1 说明拟合效果越好四、代码案例多元线性回归预测血压话不多说直接上代码这是一个完整的可运行示例# 导入所需库importpandasaspdfromsklearn.linear_modelimportLinearRegression# 1. 读取数据 # 注意CSV文件是GBK编码必须指定encodinggbk否则中文列名会乱码datapd.read_csv(多元线性回归.csv,encodinggbk,enginepython)print( 数据预览 )print(data.head())print(f\n数据形状{data.shape})# (13, 3) 13条数据3列# 2. 准备特征和目标 Xdata[[体重,年龄]]# 自变量体重、年龄ydata[血压收缩]# 因变量血压收缩压# 3. 创建并训练模型 lr_modelLinearRegression()# 创建线性回归模型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_scorelr_model.score(X,y)print(f\n 模型评估 )print(fR²得分{r2_score:.4f})# 6. 预测示例 y_predlr_model.predict(X)print(\n 预测结果对比前5条 )print(f{序号:4}{实际值:8}{预测值:8}{误差:8})print(-*30)foriinrange(5):errory.iloc[i]-y_pred[i]print(f{i1: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.962.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.9461R20.9461这个分数非常高说明在本组示例数据中模型能解释 94.6% 的血压变化拟合效果非常好。注意R 2 R^2R2高不一定代表模型就一定好特别是数据量小的时候。实际项目中还要做交叉验证、残差分析等这里只是入门示例~六、避坑指南那些年我们踩过的坑在整理资料的过程中我发现了一些网上常见教程里的错误和过时信息这里统一给大家指出来避免踩坑❌ 坑1normalize参数已经被移除了很多老教程里会写LinearRegression(normalizeTrue)但这个参数在sklearn 1.0 版本就被弃用了在1.2 版本正式移除如果你用的是新版 sklearn比如 1.4传normalize参数会直接报错TypeError: LinearRegression.__init__() got an unexpected keyword argument normalize正确做法用StandardScaler做标准化fromsklearn.preprocessingimportStandardScaler scalerStandardScaler()X_scaledscaler.fit_transform(X)lr_modelLinearRegression()lr_model.fit(X_scaled,y)❌ 坑2fit方法没有n_jobs参数有些文档说fit(X, y, n_jobs-1)这是错误的n_jobs是构造函数的参数不是fit方法的参数。正确写法# 正确 ✅lr_modelLinearRegression(n_jobs-1)lr_model.fit(X,y)# 错误 ❌lr_modelLinearRegression()lr_model.fit(X,y,n_jobs-1)# 会报错❌ 坑3CSV 文件编码问题如果 CSV 文件里有中文列名直接用pd.read_csv()可能会乱码。要注意文件的编码格式GBK 编码 →encodinggbkUTF-8 编码 →encodingutf-8默认不确定编码的话可以用记事本打开文件另存为时看一下编码。七、总结今天咱们从零开始学习了多元线性回归回顾一下重点线性回归是用线性方程拟合数据、做预测的算法sklearn LinearRegression用起来很简单核心就三步创建模型 → fit → predictR 2 R^2R2得分是评估回归模型的常用指标越接近 1 越好注意避坑normalize参数已移除、n_jobs在构造函数里、CSV 编码问题线性回归虽然简单但它的思想——找最优参数让误差最小——是几乎所有机器学习算法的核心。把这个搞懂了后面学更复杂的算法会事半功倍。如果这篇文章对你有帮助别忘了点赞收藏~ 有问题欢迎在评论区交流