人工智能-机器学习(三)——线性回归

一、学习目标

  1. 基础认知:理解线性回归的定义、一元与多元回归的区别及典型应用场景;
  1. 技能掌握:熟练使用 sklearn 线性回归 API,掌握损失函数(MAE/MSE/RMSE)的应用,理解正规方程与梯度下降的原理;
  1. 实战能力:能独立完成数据预处理、模型训练、评估,并通过波士顿房价案例落地线性回归技术。

二、目录

  1. 第一章 线性回归简介

1.1 概念与直观案例

1.2 线性回归的分类

1.3 典型应用场景

  1. 第二章 线性回归 API 快速入门

2.1 一元回归案例:身高预测体重

2.2 API 核心步骤

2.3 完整代码实现

  1. 第三章 线性回归的核心原理

3.1 损失函数的作用

3.2 常见损失函数(LS/MSE/MAE)

3.3 数学基础:导数与偏导

3.4 数学基础:矩阵与向量

  1. 第四章 线性回归的求解方法

4.1 正规方程法(闭式解)

4.2 梯度下降算法(迭代解)

4.3 两种方法的对比

  1. 第五章 回归模型评估方法

5.1 评估指标定义与公式

5.2 评估 API 调用

5.3 指标选择原则

  1. 第六章 API 详解与波士顿房价实战

6.1 核心 API 参数与属性

6.2 波士顿房价预测完整流程

  1. 第七章 整体总结

第一章 线性回归简介

1.1 概念与直观案例

线性回归是用回归方程(线性函数)对自变量(特征)和因变量(目标值)的关系建模的分析方法,核心是找到最优线性函数,使预测值与真实值的误差最小。

案例:根据身高预测体重

已知 5 组身高 - 体重数据,预测身高 176 对应的体重:

编号

身高(X,cm)

体重(Y,kg)

1

160

56.3

2

166

60.6

3

172

65.1

4

174

68.5

5

180

75

6

176

思路:从已知数据中拟合线性关系 Y = kX + b(k = 斜率,b = 截距),再代入 X=176 预测 Y。

1.2 线性回归的分类

根据自变量(特征)的数量,线性回归分为两类:

类型

定义

公式

案例场景

一元线性回归

目标值仅与 1 个特征相关

y = wx + b

身高→体重、温度→冰销量

多元线性回归

目标值与多个特征相关

y = w_1x_1 + w_2x_2 + ... + w_nx_n + b

面积 + 位置 + 楼层→房价、GDP + 人口→消费额

矩阵表示统一:无论一元 / 多元,均可表示为 \( h(w) = w^T X + b \),其中:

  • w = \begin{bmatrix} w_1 \\ w_2 \\ ... \\ w_n \end{bmatrix}(权重向量),X = \begin{bmatrix} x_1 \\ x_2 \\ ... \\ x_n \end{bmatrix}(特征向量);
  • 若将b融入权重(新增特征x_0=1),则公式简化为h(w) = w^T Xw = \begin{bmatrix} b \\ w_1 \\ ... \\ w_n \end{bmatrix}

1.3 典型应用场景

线性回归是机器学习中最基础的预测模型,适用于目标值为连续型数据的场景,例如:

  1. 物理领域:钢轨伸缩长度与温度的关系建模;
  1. 环境领域:昆虫鸣叫次数与气温 / 湿度的关联预测;
  1. 经济领域:国内 GDP 与双十一销售额的趋势分析;
  1. 生活领域:房屋面积、地段、房龄与房价的预测。

第二章 线性回归 API 快速入门

2.1 一元线性回归案例:身高预测体重

需求:基于 5 组身高 - 体重数据,预测身高 176cm 对应的体重。

核心工具:sklearn.linear_model.LinearRegression(基于正规方程实现,适合小数据集)。

2.2 API 使用步骤

线性回归 API 遵循 “导包→备数据→实例化→训练→预测” 的固定流程:

  1. 导包:导入线性回归模型类;
  1. 备数据:特征(X)需为二维数组(),目标值(y)为一维数组;
  1. 实例化:创建模型对象,默认计算偏置(fit_intercept=True);
  1. 训练:调用 fit(X, y) 拟合数据,学习线性关系;
  1. 预测:调用 predict(X_test) 生成预测结果;
  1. 查参数:通过 coef_(权重 / 斜率)和 intercept_(偏置 / 截距)查看模型学到的线性关系。

2.3 完整代码实现

# 1. 导包

from sklearn.linear_model import LinearRegression

# 2. 定义预测函数

def predict_weight_by_height():

# 准备数据:X为身高(二维数组),y为体重(一维数组)

X = [[160], [166], [172], [174], [180]] # 5个样本,1个特征

y = [56.3, 60.6, 65.1, 68.5, 75] # 对应5个样本的目标值

# 3. 实例化模型

estimator = LinearRegression() # 默认计算偏置(fit_intercept=True)

# 4. 训练模型:学习身高与体重的线性关系

estimator.fit(X, y)

# 查看模型参数(线性方程 Y = kX + b 中的 k 和 b)

print("斜率(k):", estimator.coef_[0]) # coef_是数组,取第0个元素(仅1个特征)

print("截距(b):", estimator.intercept_) # 偏置项

# 5. 预测身高176cm对应的体重

X_test = [[176]] # 预测数据需与训练数据格式一致(二维数组)

y_pred = estimator.predict(X_test)

print(f"身高176cm对应的预测体重:{y_pred[0]:.2f}kg")

# 执行函数

if __name__ == "__main__":

predict_weight_by_height()

运行结果示例

 

斜率(k):0.875

截距(b):-83.7

身高176cm对应的预测体重:60.30kg

第三章 线性回归的核心原理

3.1 为什么需要损失函数?

线性回归的目标是 “找到最优的 w 和 b,使预测值与真实值的误差最小”。但 “误差最小” 需要量化标准—— 损失函数就是这个标准,它衡量模型预测结果与真实结果的 “差距”,是模型优化的 “指南针”。

3.2 常见损失函数

损失函数类型

定义与公式

特点与适用场景

最小二乘法(LS)

误差平方和:LS = \sum_{i=1}^m (h(w^{(i)}) - y^{(i)})^2

直观反映总误差,易求导,适用于无异常值场景

均方误差(MSE)

误差平方的平均值:( MSE = \frac{1}{m} \sum_{i=1}^m (h(w^{(i)}) - y^{(i)})^2

消除样本数量影响,放大异常值误差,常用作训练损失

平均绝对误差(MAE)

误差绝对值的平均值: MAE = \frac{1}{m} \sum_{i=1}^m |h(w^{(i)}) - y^{(i)}| 

对异常值鲁棒(不放大误差),适用于异常值较多的场景

注:h(w^{(i)})是第 i 个样本的预测值,y^{(i)} 是第 i 个样本的真实值,m 是样本总数。

3.3 数学基础:导数与偏导

3.3.1 导数的定义与作用
  • 定义:描述函数在某一点的瞬时变化率(几何意义:函数在该点的切线斜率);
  • 核心作用:求函数极值 —— 当导数为 0 时,函数可能达到极大值或极小值(线性回归需找损失函数的极小值)。
3.3.2 偏导的定义(多元函数)
  • 定义:对多元函数中的某一个变量求导,其他变量固定不变;
  • :对f(x_1, x_2) = x_1^2 + 2x_1x_2 求偏导:
    • x_1 偏导:\frac{\partial f}{\partial x_1} = 2x_1 + 2x_2(固定x_2);
    • x_2偏导:\frac{\partial f}{\partial x_2} = 2x_1(固定x_1)。
3.3.3 复合函数求导(关键)
  • 规则:外函数求导 × 内函数求导;
  • :求y = (x^2 + 2x)^2的导数:
    • 外函数:y = u^2, u = x² + 2x,外导:y'_u = 2u
    • 内函数u = x² + 2x,内导:u'_x = 2x + 2
    • 总导数:y'_x = 2u \times (2x + 2) = 2(x² + 2x)(2x + 2)

3.4 数学基础:矩阵与向量

3.4.1 核心概念(机器学习常用)

类型

定义

示例

标量(scalar)

单个数值(无方向)

身高 176cm、体重 60kg

向量(vector)

一维有序数组(列向量为主)

成绩向量:\vec{x} = \begin{bmatrix} 70 \\ 80 \\ 90 \end{bmatrix} \in R^3

矩阵(matrix)

二维数组(m 行 ×n 列)

2 人 3 科成绩:X = \begin{bmatrix} 70&80&90 \\ 75&85&95 \end{bmatrix} \in R^{2×3}

张量(tensor)

多维数组(矩阵的推广)

3 个 2×3 矩阵:T \in R^{3×2×3}

3.4.2 核心运算规则
  1. 矩阵乘法
    • 条件:左矩阵列数 = 右矩阵行数(如 A \in R^{m×n}B \in R^{n×k},则A@B \in R^{m×k});
    • 计算:左矩阵行 × 右矩阵列,元素相乘求和;
    • 例:A = \begin{bmatrix} 1&2 \\ 3&4 \end{bmatrix}B = \begin{bmatrix} 5 \\ 6 \end{bmatrix},则A@B = \begin{bmatrix} 1×5 + 2×6 \\ 3×5 + 4×6 \end{bmatrix} = \begin{bmatrix} 17 \\ 39 \end{bmatrix}
  1. 矩阵转置
    • 规则:行变列、列变行(记为A^T);
    • 例:A = \begin{bmatrix} 1&2 \\ 3&4 \end{bmatrix}A^T = \begin{bmatrix} 1&3 \\ 2&4 \end{bmatrix}
  1. 单位矩阵
    • 定义:主对角线为 1,其余为 0 的方阵(记为 I);
    • 性质:A@I = I@A = A(如I_3 = \begin{bmatrix} 1&0&0 \\ 0&1&0 \\ 0&0&1 \end{bmatrix})。

第四章 线性回归的求解方法

4.1 正规方程法(闭式解)

4.1.1 核心公式

使 MSE 损失函数最小的权重 \( w \) 满足:w = (X^T X)^{-1} X^T y

  • X:特征矩阵(shape=(m, n+1),n 为特征数,新增x_0=1融入偏置);
  • y:目标值向量(shape=(m, 1));
  • (X^T X)^{-1}X^T X的逆矩阵(需保证可逆)。
4.1.2 优缺点

优点

缺点

无需选择学习率,操作简单

特征数 n 较大(如 n>10000)时,计算(X^T X)^{-1}耗时极长

无需迭代,一次求解

X^T X不可逆(如特征线性相关、样本数 < 特征数),无法求解

无需特征标准化

对异常值敏感

4.2 梯度下降算法(迭代解)

4.2.1 核心思想

类比 “下山”:从初始位置出发,沿梯度负方向(损失函数下降最快的方向)逐步移动,直到损失函数收敛到极小值。

4.2.2 核心公式(权重更新)

w_{new} = w_{old} - \alpha \times \nabla J(w)

  • w_{old}:当前权重,w_{new}:更新后权重;
  • \alpha:学习率(步长,推荐 0.001~0.01),控制每步移动距离;
  • \nabla J(w):损失函数 J(w)对 w 的梯度(多元函数时为偏导向量)。
4.2.3 算法分类

类型

特点

适用场景

全梯度下降(FGD)

用全部样本计算梯度,稳定但训练慢

小数据集

随机梯度下降(SGD)

用单个样本计算梯度,速度快但震荡大,易陷局部最优

大数据集、需快速迭代场景

小批量梯度下降(Mini-Batch)

用小批量样本(如 32/64/128 个)计算梯度,兼顾速度与稳定性

绝大多数工业场景(主流选择)

4.2.4 学习率的影响
  • 学习率太小:下降慢,迭代次数多;
  • 学习率太大:易越过极小值,导致震荡甚至梯度爆炸(损失函数发散)。

4.3 两种方法对比

对比维度

正规方程法

梯度下降法

求解方式

闭式解(一次计算)

迭代解(多次更新)

学习率依赖

有(需调参)

特征数适应性

适合 n 小(n<10000)

适合 n 大(如 n>10000、深度学习)

异常值敏感性

敏感

较鲁棒(迭代中逐步调整)

特征标准化

无需

需(避免不同量纲影响梯度方向)

第五章 回归模型评估方法

5.1 评估指标定义与公式

指标

公式

含义与特点

MAE(平均绝对误差)

MAE = \frac{1}{m} \sum_{i=1}^m |y^{(i)} - \hat{y}^{(i)}|

反映 “真实平均误差”,对异常值鲁棒

MSE(均方误差)

MSE = \frac{1}{m} \sum_{i=1}^m (y^{(i)} - \hat{y}^{(i)})^2

放大异常值误差,无实际物理意义

RMSE(均方根误差)

RMSE = \sqrt{\frac{1}{m} \sum_{i=1}^m (y^{(i)} - \hat{y}^{(i)})^2} 

与目标值同量纲,直观反映误差大小

注:y^{(i)}为真实值,\hat{y}^{(i)}为预测值,m 为测试集样本数。

5.2 API 调用(sklearn.metrics)

from sklearn.metrics import mean_absolute_error, mean_squared_error

import numpy as np

# 示例:真实值与预测值

y_true = [75, 68.5, 65.1] # 真实体重

y_pred = [74.2, 69.1, 64.8]# 预测体重

# 计算指标

mae = mean_absolute_error(y_true, y_pred)

mse = mean_squared_error(y_true, y_pred)

rmse = np.sqrt(mse) # RMSE需手动计算(sklearn无直接API)

print(f"MAE: {mae:.2f}")

print(f"MSE: {mse:.2f}")

print(f"RMSE: {rmse:.2f}")

5.3 指标对比与选择

指标

优点

缺点

适用场景

MAE

对异常值鲁棒,计算简单

无法区分大误差的影响

数据含较多异常值(如房价数据)

MSE

对大误差敏感(优化重点)

无物理意义,受量纲平方影响

模型训练损失(优化目标)

RMSE

与目标值同量纲,直观

对异常值敏感

最终评估报告(如 “平均误差 ±2kg”)

第六章 线性回归 API 详解与实战

6.1 核心 API 参数与属性

sklearn 提供两种线性回归 API,分别对应正规方程和梯度下降:

6.1.1 正规方程 API:LinearRegression
 
from sklearn.linear_model import LinearRegression

# 实例化参数

estimator = LinearRegression(

fit_intercept=True, # 是否计算偏置(默认True,建议保留)

copy_X=True, # 是否复制特征矩阵(默认True,避免修改原数据)

n_jobs=None # 并行计算数(默认None,仅1个CPU核心)

)

# 核心属性(训练后可用)

estimator.coef_ # 权重向量(shape=(n_features,))

estimator.intercept_ # 偏置项(标量)

6.1.2 梯度下降 API:SGDRegressor
 
from sklearn.linear_model import SGDRegressor

# 实例化参数

estimator = SGDRegressor(

loss="squared_loss", # 损失函数(默认"squared_loss"=MSE,适合线性回归)

fit_intercept=True, # 是否计算偏置(默认True)

learning_rate="invscaling", # 学习率策略(默认"invscaling"=随迭代减小)

eta0=0.01, # 初始学习率(默认0.01,需配合learning_rate调整)

max_iter=1000, # 最大迭代次数(默认1000)

tol=1e-3 # 收敛阈值(损失下降小于tol则停止,默认1e-3)

)

# 核心属性(训练后可用)

estimator.coef_ # 权重向量

estimator.intercept_ # 偏置项

6.2 波士顿房价预测完整流程

6.2.1 案例背景
  • 数据来源:sklearn 内置数据集,包含 506 个波士顿房屋样本,13 个特征(如犯罪率、平均房间数、距离市中心距离等),目标值为房屋均价(单位:千美元)。
  • 核心任务:用线性回归模型根据 13 个特征预测房屋均价。
6.2.2 完整代码(含正规方程与梯度下降)
# 1. 导入所需库

from sklearn.datasets import load_boston

from sklearn.preprocessing import StandardScaler

from sklearn.model_selection import train_test_split

from sklearn.linear_model import LinearRegression, SGDRegressor

from sklearn.metrics import mean_squared_error

import numpy as np

# 2. 加载并预处理数据

def load_and_preprocess_data():

# 加载数据

boston = load_boston()

X = boston.data # 特征矩阵(506, 13)

y = boston.target # 目标值(506,)

# 划分训练集与测试集(8:2)

X_train, X_test, y_train, y_test = train_test_split(

X, y, test_size=0.2, random_state=22 # random_state固定划分结果

)

# 特征标准化(梯度下降必需,消除量纲影响)

scaler = StandardScaler()

X_train_scaled = scaler.fit_transform(X_train) # 训练集:拟合+转换

X_test_scaled = scaler.transform(X_test) # 测试集:仅用训练集参数转换

return X_train_scaled, X_test_scaled, y_train, y_test, scaler

# 3. 正规方程法建模

def linear_reg_normal():

X_train, X_test, y_train, y_test, _ = load_and_preprocess_data()

# 实例化并训练模型

estimator = LinearRegression()

estimator.fit(X_train, y_train)

# 预测与评估

y_pred = estimator.predict(X_test)

mse = mean_squared_error(y_test, y_pred)

rmse = np.sqrt(mse)

# 输出结果

print("="*50)

print("【正规方程法结果】")

print(f"模型权重(前5个特征):{estimator.coef_[:5]}") # 仅展示前5个特征的权重

print(f"模型偏置:{estimator.intercept_:.2f}")

print(f"测试集 MSE:{mse:.2f}")

print(f"测试集 RMSE:{rmse:.2f}")

print("="*50)

# 4. 梯度下降法建模

def linear_reg_sgd():

X_train, X_test, y_train, y_test, _ = load_and_preprocess_data()

# 实例化并训练模型

estimator = SGDRegressor(

loss="squared_loss",

learning_rate="invscaling",

eta0=0.01,

max_iter=1000,

tol=1e-3,

random_state=22

)

estimator.fit(X_train, y_train)

# 预测与评估

y_pred = estimator.predict(X_test)

mse = mean_squared_error(y_test, y_pred)

rmse = np.sqrt(mse)

# 输出结果

print("\n" + "="*50)

print("【梯度下降法结果】")

print(f"模型权重(前5个特征):{estimator.coef_[:5]}")

print(f"模型偏置:{estimator.intercept_[0]:.2f}") # SGDRegressor.intercept_是数组

print(f"测试集 MSE:{mse:.2f}")

print(f"测试集 RMSE:{rmse:.2f}")

print("="*50)

# 5. 执行建模

if __name__ == "__main__":

linear_reg_normal()

linear_reg_sgd()
6.2.3 结果分析
  • 两种方法的 RMSE 接近(约 4.5~5.0),说明模型效果一致;
  • 正规方程法无需标准化,但梯度下降法必需(否则因特征量纲差异导致梯度方向异常);
  • 当特征数增加(如超过 1000)时,梯度下降法的速度优势会更明显。

第七章 整体总结

  1. 线性回归核心:用线性函数 \( h(w) = w^T X + b \) 拟合特征与连续目标值的关系,通过最小化损失函数找到最优权重;
  1. API 选择:小数据集用 LinearRegression(正规方程),大数据集用 SGDRegressor(梯度下降);
  1. 关键步骤:数据预处理(尤其是标准化,梯度下降必需)→ 模型训练 → 指标评估(优先 RMSE/MAE);
  1. 原理重点:损失函数是优化目标,导数 / 偏导是求极值的工具,矩阵是高维数据的表示方式;
  1. 实战技巧:学习率需调参(从 0.001 开始尝试),评估指标需结合业务场景选择(异常值多用电 MAE,需直观性用 RMSE)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值