机器学习笔记(三)线性回归原理与损失函数详解

在这里插入图片描述

一、什么是线性回归

1.1 案例引入:体重预测血压

假设我们有这样一组数据:体重越重,血压收缩值往往越高。如果来了一个体重 88kg 的人,你能预测他的血压吗?

体重7685918295
收缩压120124141126155

线性回归要做的,就是把这个趋势用一条"最优直线"画出来。

import matplotlib.pyplot as plt
plt.rcParams["font.family"] = ["SimHei"]
plt.rcParams["axes.unicode_minus"] = False

weight = [76, 85, 91, 82, 95]
sbp = [120, 124, 141, 126, 155]

plt.figure(figsize=(8, 5))
plt.scatter(weight, sbp, color='steelblue', s=80, alpha=0.8)
plt.title('体重与收缩压关系散点图', fontsize=14, pad=15)
plt.xlabel('体重', fontsize=12)
plt.ylabel('收缩压', fontsize=12)
plt.grid(True, linestyle='--', alpha=0.5)
plt.show()

1.2 线性回归的定义

线性回归是利用线性函数对一个或多个自变量(特征值)和因变量(目标值)之间关系进行建模的一种分析方式,用于预测连续值,是一种监督学习算法。

1.3 一元 vs 多元

类型公式特征数场景
一元线性回归y = wx + b1 个体重预测血压
多元线性回归y = w1x1 + w2x2 + ... + wnxn + b多个广告投入预测销售额

核心要点:权重 w 越大,说明该特征对预测值影响越大。线性回归的本质就是从数据中学习权重系数。

在这里插入图片描述

1.4 为什么选择线性回归

  • 模型简单:结构清晰、数学推导成熟、易理解与实现
  • 可解释性强:权重大小可直接反映特征对目标的影响程度
  • 适用广泛:可作为各类预测任务的基础模型,速度快、资源消耗低
  • 数学可解:支持正规方程、梯度下降两种高效求解方式

1.5 应用场景

场景输入特征预测目标
GDP 预测投资、消费、出口GDP 增长率
广告效果评估各渠道广告投入销售额
药物剂量研究药物剂量血压/血糖指标
气候变化建模工业排放量、森林覆盖率全球气温变化

二、线性回归 API 实操

2.1 快速上手:体重预测血压

from sklearn.linear_model import LinearRegression
import numpy as np

# 1. 准备数据
x_train = np.array([[76], [85], [91], [82], [95]])  # 特征:体重
y_train = np.array([120, 124, 141, 126, 155])        # 标签:收缩压
x_test = np.array([[88]])                             # 预测:体重88kg

# 2. 创建模型
model = LinearRegression()

# 3. 训练
model.fit(x_train, y_train)

# 4. 查看参数
print(f'权重(斜率w): {model.coef_[0]:.4f}')
print(f'偏置(截距b): {model.intercept_:.4f}')

# 5. 预测
y_pre = model.predict(x_test)
print(f'体重88kg 对应的血压收缩预测值: {y_pre[0]:.2f} mmHg')

# 6. 评估
score = model.score(x_train, y_train)
print(f'决定系数 R2: {score:.4f}')

输出结果:

权重(斜率w): 1.8187
偏置(截距b): -22.8420
体重88kg 对应的血压收缩预测值: 137.01 mmHg
决定系数 R2: 0.8756

三、损失函数详解

3.1 为什么需要损失函数

模型训练时,线性回归算法如何选择最优的权重和截距?答案是设置一个评判标准——损失函数。

  • 误差:预测值 - 真实值
  • 损失函数:衡量每个样本预测值与真实值之间差异的函数

口诀:误差平方加一起,整体最小求最优。

3.2 三个核心评估指标

指标全称公式特点
MAE平均绝对误差mean(丨y-y_pred丨)直观易懂,对异常值不敏感
MSE均方误差mean((y - y_pred)^2)放大异常值影响,数学可导
RMSE均方根误差sqrt(MSE)量纲与原始数据一致
from sklearn.metrics import mean_absolute_error, mean_squared_error
import math

# MAE
mae = mean_absolute_error(y_test, y_predict)

# MSE
mse = mean_squared_error(y_test, y_predict)

# RMSE(sklearn 未直接提供,手算)
rmse = math.sqrt(mse)

思考题:为什么 sklearn 没有直接提供 RMSE 的 API?因为 RMSE 只是 MSE 开根号,一行代码即可实现,保持 API 精简。

3.3 损失函数公式推导

以体重预测血压为例,假设 y = kx + b,对 5 个样本计算误差平方和:

平方和 = (76k + b - 120)^2 + (85k + b - 124)^2 + (91k + b - 141)^2 
       + (82k + b - 126)^2 + (95k + b - 155)^2

为简化演示,假设 b = 120(实际需同时优化 w 和 b):

L(k) = 37031k^2 - 15416k + 2358

对损失函数求导数,令导数为 0,即可求出最优 k 值。

损失函数是开口向上的抛物线,什么时候值最小?斜率为 0 时。如何算斜率?必须求导!

在这里插入图片描述

3.4 手动实现正规方程求解

import math
from sklearn.metrics import mean_squared_error, mean_absolute_error

x = [76, 85, 91, 82, 95]
y_true = [120, 124, 141, 126, 155]
n = len(x)

# 正规方程公式
sum_x = sum(x)
sum_y = sum(y_true)
sum_xx = sum([xi**2 for xi in x])
sum_xy = sum([xi*yi for xi, yi in zip(x, y_true)])

k = (n * sum_xy - sum_x * sum_y) / (n * sum_xx - sum_x ** 2)
b = (sum_y - k * sum_x) / n

print(f"拟合直线:y = {k:.4f}x + {b:.4f}")

y_pred = [k * xi + b for xi in x]
print("真实值:", y_true)
print("预测值:", [round(v, 2) for v in y_pred])

mse_manual = sum([(yt - yp)**2 for yt, yp in zip(y_true, y_pred)]) / n
mae_manual = sum([abs(yt - yp) for yt, yp in zip(y_true, y_pred)]) / n
rmse_manual = math.sqrt(mse_manual)

print(f"MSE  = {mse_manual:.4f}")
print(f"MAE  = {mae_manual:.4f}")
print(f"RMSE = {rmse_manual:.4f}")

输出结果:

拟合直线:y = 1.8187x + -22.8420
真实值: [120, 124, 141, 126, 155]
预测值: [115.38, 131.75, 142.66, 126.29, 149.93]
MSE  = 21.9749
MAE  = 3.8765
RMSE = 4.6877

四、正规方程法的局限性

4.1 三大局限

问题说明解决方案
多重共线性特征间存在严格线性关系(如身高 cm 和 m)回去做特征工程
特征数 > 样本数方程数不够,无法求解梯度下降、岭回归、降维
计算复杂度爆炸复杂度 O(n^3),高维不可用梯度下降

4.2 选择口诀

  • 特征少(<100)、数据小 → 用正规方程
  • 特征多、数据大 → 用梯度下降

五、小结

  • 线性回归用最朴素的线性方程捕捉数据间的关联,是机器学习的入门基石
  • 损失函数(MSE)是衡量模型好坏的标尺,通过最小化损失找到最优参数
  • 正规方程一步到位但受限于特征规模,梯度下降更具普适性
  • MAE、MSE、RMSE 三个指标各有侧重,实际项目中按需选择
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值