Bootstrap

机器学习篇(02)

目录

1. 逻辑回归(分类问题中的算法)

1.1 分类问题

1.1.1 定义与示例

①任务目标

②典型场景

1.1.2 线性回归的局限性

1.2 逻辑回归的核心思想

1.2.1 逻辑回归的定义

1.2.2 逻辑回归的假设函数

1.2.3 Sigmoid 函数

1.2.4 逻辑回归的假设函数

1.3 判定边界

1.3.1 判定边界的定义

1.3.2 线性判定边界

1.3.3 非线性判定边界

1.3.4 判定边界的灵活性

1.3.5 补充(决策边界不是训练集的属性,而是假设本身及其参数的属性 解释这句话)

①核心概念拆解

② 为什么决策边界属于假设和参数?

③训练集 vs 假设与参数

④ 总结

1.4 代价函数

1.4.1 逻辑回归代价函数的必要性

1.4.2 代价函数定义

1.4.3 直观理解

1.4.4 Python 代码实现

1.5 梯度下降

1.5.1 梯度下降算法

1.5.2 与线性回归对比

1.5.3 实现步骤

1.5.4 关键注意事项

1.5.5 类比

1.5.6 代码示例

1.6  高级优化

1.6.1 为什么需要高级优化?

1.6.2 高级优化算法原理

①共轭梯度法(Conjugate Gradient)

② BFGS(变尺度法)

③L-BFGS(限制变尺度法)

1.6.3 使用步骤详解

①编写代价函数与梯度计算代码

②调用优化库函数

1.6.4 关键注意事项

①特征缩放

②代码细节

③算法选择

1.6.5 直观理解:梯度下降 vs 高级优化

1.7 多类别分类:一对多

1.7.1 多类别分类问题概述

1.7.2 一对多方法的核心思想

1.7.3 实现步骤

1.7.4 预测方法

1.7.5 注意事项与总结

1.7.6 总结

2. 正则化(Regularization)

2.1 过拟合问题

2.1.1 过拟合的定义与示例

2.1.2 过拟合的直观表现

2.1.3 解决过拟合的方法

2.2 正则化

2.2.1 正则化项的引入

2.2.2 正则化的作用

2.2.3 正则化类型

2.2.4 正则化参数的计算方法

①为什么 无法直接计算?

②选择  的通用方法

(1) 交叉验证(Cross-Validation)

(2) 学习曲线分析

③调整 的实用技巧

④不同正则化类型的 选择

⑤示例:不同的影响

2.3 具体示例:正则化参数 如何抑制无关参数

2.3.1 问题设定

2.3.2 计算误差项与参数更新

2.3.3 分析参数变化

2.3.4 多轮迭代后的结果

2.3.5 不同 的影响对比

2.3.6 结论

2.4 代价函数

2.4.1 正则化的核心思想

2.4.2 正则化代价函数的定义

2.4.3 正则化的作用原理

2.4.4 正则化参数  的影响

2.5 正则化线性回归

2.5.1 梯度下降法

2.5.2 正规方程法

2.5.3 对比与总结

2.6正则化的逻辑回归模型

2.6.1 正则化后的代价函数

2.6.2 梯度下降更新规则

2.6.3 Python 代码实现

2.6.4 与线性回归正则化的区别

2.6.5 正则化参数 的选择


1. 逻辑回归(分类问题中的算法)

1.1 分类问题

1.1.1 定义与示例

①任务目标

预测离散类别标签 y∈{0,1},其中:y=0 表示负向类(如良性肿瘤、正常邮件),y=1 表示正向类(如恶性肿瘤、垃圾邮件)。

②典型场景
  • 垃圾邮件检测(是/否)。
  • 金融欺诈识别(正常交易/欺诈交易)。

1.1.2 线性回归的局限性

线性回归的假设函数h_\theta(x) = \theta^T x 输出无界,可能远大于1或小于0。比如说,预测肿瘤恶性概率时,线性回归可能输出1.5或-0.3,不符合概率定义(0-1)。因此,线性回归不适用于分类问题。


1.2 逻辑回归的核心思想

1.2.1 逻辑回归的定义

  • 本质:一种分类算法,输出值严格限制在 [0, 1]区间,表示样本属于正向类的概率。
  • 关键改进:通过 Sigmoid 函数(逻辑函数)将线性组合 \theta^T映射到概率区间。

1.2.2 逻辑回归的假设函数

  • 定义h_\theta(x) = g(\theta^T x)
    • \theta^T:线性组合(如 \theta_0 + \theta_1 x_1 + \dots + \theta_n x_n​)。
    • g(z):Sigmoid 函数(逻辑函数),将线性结果映射到 [0,1] 区间。

1.2.3 Sigmoid 函数

  • 公式

    h_\theta(x) = \frac{1}{1 + e^{-\theta^T x}}
    • 输入:线性组合 \theta^T x = \theta_0 + \theta_1 x_1 + \dots + \theta_n x_n
    • 输出0 < h_\theta(x) < 1,表示 P(y=1 \mid x)

1.2.4 逻辑回归的假设函数

  • 概率解释h_\theta(x) = P(y=1 \mid x; \theta)
    • 表示在给定输入 x 和参数 \theta 时,y=1 的概率。
    • 示例:若 h_\theta(x) = 0.7,则有 70% 的概率属于正向类(如恶性肿瘤),30% 属于负向类。

1.3 判定边界

1.3.1 判定边界的定义

  • 核心概念:判定边界是模型将数据分为不同类别的分界线。
  • 数学表达:在逻辑回归中,判定边界由方程\theta^T x = 0 定义。
    • 当 \theta^T x \geq 0 时,预测 y=1。
    • 当 \theta^T x < 0 时,预测 y=0。

1.3.2 线性判定边界

  • 示例模型
    • 参数\theta = [-3, 1, 1]
    • 假设函数:h_\theta(x) = g(-3 + x_1 + x_2)
  • 判定边界方程-3 + x_1 + x_2 = 0 \quad \Rightarrow \quad x_1 + x_2 = 3
    • 几何解释:在二维平面上,这是一条直线,将区域分为两部分:
      • x_1 + x_2 \geq 3 时预测 y=1 。
      • x_1 + x_2 < 3时预测 y=0 。

1.3.3 非线性判定边界

  • 问题场景:当数据无法用直线分隔时(如环形分布),需引入多项式特征。
  • 示例模型
    • 参数\theta = [-1, 0, 0, 1, 1]
    • 假设函数:h_\theta(x) = g(-1 + x_1^2 + x_2^2)
  • 判定边界方程-1 + x_1^2 + x_2^2 = 0 \quad \Rightarrow \quad x_1^2 + x_2^2 = 1
    • 几何解释:这是一个以原点为中心、半径为1的圆,圆内预测 y=0,圆外预测 y=1。

1.3.4 判定边界的灵活性

  • 高阶特征的作用:通过添加高次项(如 x_1^2, x_2^2, x_1 x_2),可构造复杂的判定边界(如椭圆、抛物线)。
  • 示例
    • 若假设函数为 h_\theta(x) = g(\theta_0 + \theta_1 x_1 + \theta_2 x_2 + \theta_3 x_1^2 + \theta_4 x_2^2),可拟合圆形或椭圆形边界。

1.3.5 补充(决策边界不是训练集的属性,而是假设本身及其参数的属性 解释这句话)

①核心概念拆解
  • 决策边界(Decision Boundary):模型用来区分不同类别的分界线(如直线、曲线)。
  • 训练集(Training Set):用于训练模型的数据集合。
  • 假设(Hypothesis):模型的数学形式(如逻辑回归的h_\theta(x) = g(\theta^T x))。
  • 参数(Parameters):模型中的可调整变量(如 \theta_0, \theta_1, \theta_2​)。
② 为什么决策边界属于假设和参数?

(1) 决策边界的数学定义

  • 在逻辑回归中,决策边界由方程 \theta^T x = 0定义。
    • 示例:若 \theta = [-3, 1, 1],则决策边界为 -3 + x_1 + x_2 = 0
  • 关键点:边界的形式直接由参数\theta和模型假设(是否包含多项式项)决定。

(2) 训练集的作用

  • 训练集仅影响参数值:通过训练数据调整 \theta,使模型更好地拟合数据。
  • 不改变边界形式:无论数据如何分布,决策边界的形状(如直线、圆)由模型假设预先确定。
③训练集 vs 假设与参数
维度训练集假设与参数
影响内容决定参数\theta 的具体数值决定决策边界的形状(直线、圆等)
可变性不同训练集 → 不同 \theta固定假设 → 边界形式固定
示例数据分布影响直线的位置是否添加 x^2 项决定边界是直线还是圆
④ 总结
  • 决策边界的形状由模型假设(如是否包含多项式项)和参数 \theta共同决定。
  • 训练集的作用:仅通过调整参数\theta来优化边界的位置或大小,但无法改变边界的固有形式。

    类比

  • 假设和参数 → 模具的形状(如圆形、方形)。
  • 训练集 → 调整模具的大小和位置,但无法改变其基本形状。

1.4 代价函数

1.4.1 逻辑回归代价函数的必要性

  • 问题:直接使用线性回归的平方误差代价函数会导致非凸优化(存在多个局部最小值),难以找到全局最优解。
  • 核心改进:定义新的代价函数,使其为凸函数(单峰,无局部最优)。

1.4.2 代价函数定义

  • 单个样本的代价(y = 0  or 1 always !)

\text{Cost}(h_\theta(x), y) = \begin{cases} -\log(h_\theta(x)) & \text{if } y=1 \\ -\log(1 - h_\theta(x)) & \text{if } y=0 \end{cases}

  • 统一公式

\text{Cost}(h_\theta(x), y) = -y \log(h_\theta(x)) - (1-y) \log(1 - h_\theta(x))

  • 整体代价函数(所有训练样本的平均):

J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1-y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right]

1.4.3 直观理解

  • 当 y=1 时
    • 若预测h_\theta(x) \to 1,代价\to 0。(预测对了是应该的,没有奖励)
    • 若预测 h_\theta(x) \to 0,代价 \to +\infty(预测错了加大惩罚力度)。
  • 当 y=0 时
    • 若预测 h_\theta(x) \to 0,代价\to 0
    • 若预测 h_\theta(x) \to 1,代价\to +\infty

1.4.4 Python 代码实现

import numpy as np

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def cost(theta, X, y):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    h = sigmoid(X * theta.T)
    term1 = np.multiply(-y, np.log(h))
    term2 = np.multiply((1 - y), np.log(1 - h))
    return np.sum(term1 - term2) / len(X)

1.5 梯度下降

1.5.1 梯度下降算法

  • 目标:最小化 J(\theta),找到最优参数\theta
  • 参数更新规则

\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_j^{(i)}

1.5.2 与线性回归对比

维度线性回归逻辑回归
假设函数h_\theta(x) = \theta^T xh_\theta(x) = \frac{1}{1 + e^{-\theta^T x}}
代价函数均方误差(MSE)交叉熵损失(Cross-Entropy Loss)
梯度公式形式上相同,但假设函数不同形式上相同,但假设函数不同
  • 核心区别
    虽然梯度更新公式在数学形式上一致,但由于逻辑回归的假设函数引入了 Sigmoid 函数,实际计算中梯度方向不同。

1.5.3 实现步骤

  • 初始化参数
    • 设置\theta初始值(通常为全零向量)。
  • 计算假设函数h_\theta(x) = \frac{1}{1 + e^{-\theta^T x}}
  • 计算代价函数J(\theta) = -\frac{1}{m} \sum_{i=1}^m \left[ y^{(i)} \log(h_\theta(x^{(i)})) + (1-y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right]
  • 计算梯度并更新参数\theta_j := \theta_j - \alpha \frac{1}{m} \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_j^{(i)}
  • 重复迭代:直到代价函数收敛(最小化代价函数)或达到最大迭代次数。

1.5.4 关键注意事项

  • 特征缩放
    • 若特征范围差异大(如 x_1 \in [0, 1] ,x_2 \in [0, 1000]),需进行标准化(如 Z-Score 归一化),加速梯度下降收敛。
  • 学习率选择
    • 过大:可能跳过最优解;过小:收敛速度慢。建议尝试 \alpha = 0.01, 0.03, 0.1等。
  • 监控收敛
    • 绘制代价函数随迭代次数的变化曲线,确保其单调下降。

1.5.5 类比

  • 代价函数像“纠错老师”:预测越错,惩罚越大,推动模型快速修正参数。
  • 梯度下降像“下山”:每一步根据坡度(梯度)调整方向,逻辑回归的“山形”由 Sigmoid 函数塑造,与线性回归的“平缓山坡”不同
  • 收敛速度通常快于梯度下降。

1.5.6 代码示例

import numpy as np

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def compute_cost(theta, X, y):
    m = len(y)
    h = sigmoid(X.dot(theta))
    cost = (-y.dot(np.log(h)) - (1 - y).dot(np.log(1 - h))) / m
    return cost

def gradient_descent(X, y, theta, alpha, num_iters):
    m = len(y)
    cost_history = []
    for _ in range(num_iters):
        h = sigmoid(X.dot(theta))
        gradient = (X.T.dot(h - y)) / m
        theta -= alpha * gradient
        cost_history.append(compute_cost(theta, X, y))
    return theta, cost_history

1.6  高级优化

1.6.1 为什么需要高级优化?

  • 梯度下降的局限性
    • 需手动调整学习率 \alpha,选择不当会导致收敛慢或震荡。
    • 高维特征或大数据集时,计算效率低(如百万样本+千维特征)。
  • 高级优化的优势
    • 自动学习率:内置智能搜索(如线性搜索),动态调整步长。
    • 更快收敛:利用二阶导数信息(如曲率),减少迭代次数(从千次降至几十次)。

1.6.2 高级优化算法原理

①共轭梯度法(Conjugate Gradient)
  • 核心思想:迭代过程中选择共轭方向(相互正交的方向),避免重复搜索。
  • 优点:内存占用低,适合中等规模问题。
② BFGS(变尺度法)
  • 核心思想:通过近似Hessian矩阵(二阶导数矩阵)更新参数,加速收敛。
  • 优点:比梯度下降更快收敛,但需存储Hessian矩阵的近似值,内存消耗较高。
③L-BFGS(限制变尺度法)
  • 核心思想:BFGS的改进版,仅保存最近几步的更新信息,减少内存占用。
  • 优点:适合大规模数据(如特征维度超过1万)。

1.6.3 使用步骤详解

①编写代价函数与梯度计算代码
  • 代价函数:计算 J(\theta)
  • 梯度计算:计算 \frac{\partial J(\theta)}{\partial \theta_j}​。

Python代码示例

import numpy as np

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def compute_cost_and_gradient(theta, X, y):
    # 将theta转换为列向量(适配numpy矩阵运算)
    theta = theta.reshape(-1, 1)
    m = len(y)
    
    # 计算假设函数h_theta(x)
    h = sigmoid(X.dot(theta))
    
    # 计算代价函数J(theta)
    cost = (-y.T.dot(np.log(h)) - (1 - y).T.dot(np.log(1 - h))) / m
    
    # 计算梯度
    gradient = (X.T.dot(h - y)) / m
    # 将梯度展平为一维数组(适配优化库输入)
    gradient = gradient.flatten()
    
    return cost, gradient
②调用优化库函数

使用SciPy的minimize函数

from scipy.optimize import minimize

# 输入数据:X为特征矩阵(m×n),y为标签向量(m×1)
initial_theta = np.zeros(X.shape[1])  # 初始参数(全零向量)

# 调用L-BFGS算法优化
result = minimize(
    fun=compute_cost_and_gradient,  # 目标函数(返回代价和梯度)
    x0=initial_theta,               # 初始参数
    args=(X, y),                    # 额外参数(传递给fun)
    method='L-BFGS-B',              # 使用L-BFGS算法
    jac=True                        # fun同时返回梯度
)

# 提取最优参数
opt_theta = result.x

1.6.4 关键注意事项

①特征缩放
  • 即使使用高级算法,仍需对特征标准化(如Z-Score归一化),否则收敛速度可能受影响。
  • 示例:若特征x_1 \in [0, 1]x_2 \in [0, 1000],归一化后 x_2' = \frac{x_2 - \mu}{\sigma}
②代码细节
  • 参数形状theta需转换为列向量以适配矩阵乘法,梯度需展平为一维数组以适配优化库。
  • 返回值:代价函数返回标量值,梯度返回一维数组。
③算法选择
  • 小规模数据:BFGS或共轭梯度法。
  • 大规模数据:优先L-BFGS。

1.6.5 直观理解:梯度下降 vs 高级优化

  • 梯度下降:像“盲人下山”,每一步试探坡度(梯度),手动调整步长(学习率)。
  • 高级优化:像“自动驾驶汽车”,自动探测地形曲率(二阶导数),动态调整方向和步长。

    示例

  • 任务:拟合逻辑回归模型(10,000个特征,100,000个样本)。
  • 梯度下降:需手动调参,迭代10,000次,耗时数小时。
  • L-BFGS:自动调参,迭代100次,耗时几分钟。

1.7 多类别分类:一对多

1.7.1 多类别分类问题概述

  • 定义:预测离散类别标签 y \in \{1, 2, ..., K\},其中 K 为类别总数(K \geq 3)。
  • 示例
    • 邮件分类:工作(y=1)、朋友(y=2)、家人(y=3)、兴趣(y=4)。
    • 疾病诊断:健康(y=1)、感冒(y=2)、流感(y=3)。
    • 天气预测:晴天(y=1)、多云(y=2)、雨天(y=3)、雪天(y=4)。

1.7.2 一对多方法的核心思想

  • 核心策略:将多类别分类问题转化为多个二元分类问题。
  • 具体步骤
    • 对每个类别 i(i=1,2,...,K
      • 将类别 i 标记为正类(y=1)。
      • 其余所有类别标记为负类(y=0)。
    • 训练 K 个二元分类器:每个分类器 h_\theta^{(i)}(x) 学习区分类别 i 与其他类别。

1.7.3 实现步骤

  • 构建伪训练集

    • 示例:训练分类器 h_\theta^{(1)}(x) 时,将类别1的样本标记为1,其他类别标记为0。
    • 重复:对每个类别 i,构建对应的训练集并训练分类器。
  • 训练分类器

    • 模型假设h_\theta^{(i)}(x) = P(y=i \mid x; \theta) = \frac{1}{1 + e^{-\theta^T x}}
    • 目标:分类器h_\theta^{(i)}(x) 输出样本属于类别 i 的概率。

1.7.4 预测方法

  • 预测规则:对于新样本 x,选择所有分类器中概率最高的类别:

\text{Predicted Class} = \arg\max_{i} h_\theta^{(i)}(x)

  • 示例
    • 若 h_\theta^{(1)}(x)=0.8h_\theta^{(2)}(x)=0.5h_\theta^{(3)}(x)=0.3,则预测 y=1。

1.7.5 注意事项与总结

  • 标签索引无关性:类别标签可从0或1开始编号,不影响算法逻辑。
  • 适用性
    • 适用于类别数 K 较大的场景(如10个类别)。
    • 每个分类器独立训练,可并行化加速。
  • 潜在问题
    • 类别不平衡:若某类别样本数远多于其他类别,分类器可能偏向多数类。
    • 计算成本:需训练 K 个分类器,时间和资源消耗随 K 增加而增长。

1.7.6 总结

  • 一对多方法:通过多次二元分类解决多类别问题,简单有效。
  • 核心公式h_\theta^{(i)}(x) = \frac{1}{1 + e^{-\theta^T x}}(第 i 个分类器)
  • 预测准则\text{Type of projection} = \arg\max_{i} h_\theta^{(i)}(x)

    类比:一对多方法像“轮流考试”:每个分类器只回答“是否属于某个特定类别”,最终选择得分最      高的答案。


2. 正则化(Regularization)

2.1 过拟合问题

2.1.1 过拟合的定义与示例

  • 定义:模型在训练集上表现极好(如代价函数接近零),但在新数据上泛化能力差。
  • 根本原因:模型复杂度过高,过度拟合训练数据中的噪声或细节。

2.1.2 过拟合的直观表现

  • 回归问题示例

    • 欠拟合(高偏差):模型过于简单(如线性模型),无法捕捉数据趋势。例如,用直线拟合抛物线分布的数据,预测误差较大。
    • 适度拟合:模型复杂度适中(如二次多项式),既能拟合数据趋势,又保持对新数据的预测能力。
    • 过拟合(高方差):模型过于复杂(如四次多项式),完美拟合训练数据但无法预测新样本。例如,高阶多项式曲线穿过所有训练点,但对新输入的预测可能剧烈波动。
  • 分类问题示例

    • 欠拟合:决策边界过于简单(如直线),无法区分类别。例如,用直线分隔明显呈圆形分布的两类数据。
    • 过拟合:决策边界复杂(如高阶多项式),对训练数据中的噪声敏感。例如,分类边界扭曲以贴合个别异常点,导致新样本分类错误。

2.1.3 解决过拟合的方法

  • 减少特征数量

    • 手动选择:手动选择保留关键特征,剔除冗余或噪声特征。例如,在房价预测中,仅保留面积和房间数,忽略无关特征。
    • 自动选择:使用算法(如PCA、递归特征消除)筛选特征。
  • 正则化(Regularization)(推荐)

    • 核心思想:保留所有特征,但限制模型参数的大小,防止模型过度依赖某些特征。

2.2 正则化

2.2.1 正则化项的引入

  • 线性回归的代价函数(未正则化)

J(\theta) = \frac{1}{2m} \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right)^2

  • 正则化后的代价函数(L2正则化)

J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right)^2 + \lambda \sum_{j=1}^n \theta_j^2 \right]

 \lambda:正则化参数,控制惩罚力度。\sum_{j=1}^n \theta_j^2​:正则化项,惩罚所有参数(通常不惩罚 \theta_0)。

2.2.2 正则化的作用

  • 抑制参数值:通过增大 \lambda,迫使参数 \theta_j 趋近于零,降低模型复杂度。
  • 平衡偏差与方差
    • \lambda 过小:正则化效果弱,可能过拟合。
    • \lambda 过大:模型过于简单,可能欠拟合。

2.2.3 正则化类型

  • L2正则化(岭回归)
    • 正则化项为 \lambda \sum \theta_j^2​,倾向于让参数接近零但非零。
  • L1正则化(Lasso回归)
    • 正则化项为\lambda \sum |\theta_j|,可产生稀疏参数(部分参数精确为零)。

2.2.4 正则化参数\lambda的计算方法

正则化参数\lambda不是通过公式直接计算得到的,而是通过实验和交叉验证选择的超参数。

①为什么 \lambda无法直接计算?
  • 模型依赖性\lambda的合理取值与数据分布、特征数量、模型复杂度等因素密切相关。
  • 目标平衡\lambda需要在偏差(欠拟合)和方差(过拟合)之间找到平衡,这需要通过实验验证。
②选择 \lambda 的通用方法
(1) 交叉验证(Cross-Validation)
  • 步骤

    • 将数据集分为训练集和验证集(或使用 K 折交叉验证)。
    • \lambda 定义一个候选范围(如 0.001, 0.01, 0.1, 1, 10, 1002.)。
    • 对每个\lambda 值训练模型,并计算验证集上的性能(如均方误差、准确率)。
    • 选择验证集性能最佳的 \lambda
from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV

# 定义候选 λ 值(注意:sklearn 中参数名为 alpha)
param_grid = {'alpha': [0.001, 0.01, 0.1, 1, 10, 100]}

# 使用网格搜索和交叉验证
ridge = Ridge()
grid_search = GridSearchCV(ridge, param_grid, cv=5)
grid_search.fit(X_train, y_train)

# 最佳 λ 值
best_lambda = grid_search.best_params_['alpha']
(2) 学习曲线分析
  • 绘制训练集和验证集误差随 \lambda的变化曲线
    • 若验证误差随 \lambda增大先减小后增大,最佳\lambda位于最低点。
    • 若验证误差持续上升,说明模型可能始终欠拟合或过拟合,需调整候选范围。
③调整 \lambda的实用技巧
  • 初始范围建议
    • 对数尺度尝试(如 10^{-5}, 10^{-4}, ..., 10^{2})。
    • 对于小数据集,从较小的\lambda 开始(如 0.01)。
  • 迭代优化
    1. 先粗调(大范围搜索),再细调(小范围微调)。
    2. 观察模型在验证集上的表现,避免陷入局部最优。
④不同正则化类型的 \lambda选择
  • L1 正则化(Lasso)
    • \lambda越大,稀疏性越强(更多参数被压缩为零)。
    • 适用于特征选择场景。
  • L2 正则化(Ridge)
    • \lambda 越大,参数整体缩小幅度越大。
    • 适用于共线性较强的特征。
⑤示例:不同\lambda的影响
\lambda模型行为训练集误差验证集误差
0.001接近无正则化,可能过拟合
0.1适度正则化,平衡偏差与方差最低
10强正则化,模型简单,可能欠拟合

2.3 具体示例:正则化参数\lambda 如何抑制无关参数

我们通过一个简单的线性回归模型和手动计算,展示正则化如何抑制无关参数。

2.3.1 问题设定

  • 数据集:3个样本,每个样本包含两个特征 x_1​(重要特征)和 x_2(无关噪声)。
    样本x_1x_2y(真实值)
    120.14
    230.26
    340.38
  • 模型h_\theta(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2​。
  • 真实关系y = 2x_1(与 x_2​ 无关)。
  • 初始参数\theta_0 = 0\theta_1 = 1\theta_2 = 1
  • 学习率\alpha = 0.1,正则化参数 \lambda = 0.1

2.3.2 计算误差项与参数更新

步骤1:计算初始预测值

样本预测值h_\theta(x)
10 + 1 \times 2 + 1 \times 0.1 = 2.1
20 + 1 \times 3 + 1 \times 0.2 = 3.2
30 + 1 \times 4 + 1 \times 0.3 = 4.3

步骤2:计算误差项(对\theta_1\theta_2​)

  • 误差项公式\text{error term}_j = \frac{1}{m} \sum_{i=1}^m (h_\theta(x^{(i)}) - y^{(i)}) x_j^{(i)}
  1. \theta_1

    \text{error term}_1 = \frac{1}{3} \left[ (2.1-4) \times 2 + (3.2-6) \times 3 + (4.3-8) \times 4 \right] = \frac{1}{3} \left[ (-3.8) + (-8.4) + (-14.8) \right] = -9.0
  2. 对 \theta_2

    \text{error term}_2 = \frac{1}{3} \left[ (2.1-4) \times 0.1 + (3.2-6) \times 0.2 + (4.3-8) \times 0.3 \right] = \frac{1}{3} \left[ (-0.19) + (-0.56) + (-1.11) \right] = -0.62

步骤3:参数更新(加入正则化)

  • 更新公式\theta_j := \theta_j \left( 1 - \alpha \frac{\lambda}{m} \right) - \alpha \cdot \text{error term}_j,​其中 m=3\lambda = 0.1, \alpha = 0.1
  1. 更新 \theta_1

    \theta_1 := 1 \times \left( 1 - 0.1 \times \frac{0.1}{3} \right) - 0.1 \times (-9.0) = 1 \times 0.9967 + 0.9 = 1.8967
  2. 更新\theta_2

    \theta_2 := 1 \times \left( 1 - 0.1 \times \frac{0.1}{3} \right) - 0.1 \times (-0.62) = 1 \times 0.9967 + 0.062 = 1.0587

2.3.3 分析参数变化

  • \theta_1(重要参数):

    • 误差项为 -9.0(绝对值大),推动 \theta_1显著增大。
    • 正则化轻微压缩(乘以 0.9967),但误差项主导,最终 \theta_1​ 从 1 → 1.8967。
  • \theta_2(无关参数):

    • 误差项为 -0.62(绝对值小),正则化压缩效果更明显。
    • 最终 \theta_2从 1 → 1.0587,增长幅度远小于 \theta_1​。

2.3.4 多轮迭代后的结果

假设继续迭代 10 轮(简化计算,假设误差项保持不变):

迭代轮数\theta_1\theta_2
初始值1.01.0
第1轮1.89671.0587
第2轮2.69231.1121
.........
第10轮接近真实值 2.0接近 0.0(被抑制)
  • 重要参数\theta_1:误差项持续推动其向真实值 2.0 靠近。
  • 无关参数 \theta_2:正则化逐步压缩,最终趋近于 0。

2.3.5 不同 \lambda的影响对比

\lambda\theta_1​ 结果\theta_2 结果模型表现
0(无正则化)2.00.5(过拟合噪声)过拟合
0.1(适中)2.00.01泛化能力好
1(过大)1.50.0欠拟合(忽略特征)

2.3.6 结论

  • \lambda 的作用机制
    • 通过压缩项 (1 - \alpha \frac{\lambda}{m}) \theta_j 抑制所有参数。
    • 重要参数:误差项大,抵消压缩效果,保留合理值。
    • 无关参数:误差项小,压缩效果主导,趋近于零。

     类比:正则化像“智能过滤器”:允许重要特征(误差项大)通过,抑制无关特征(误差项小)。

     \lambda 控制过滤器的“严格程度”。


2.4 代价函数

2.4.1 正则化的核心思想

  • 问题背景:当模型包含高阶项(如 x^3, x^4)时,容易导致过拟合。
  • 解决思路:通过修改代价函数,对高次项的系数(如\theta_3, \theta_4​)施加惩罚,迫使这些参数趋近于零,从而简化模型。

2.4.2 正则化代价函数的定义

假设原始模型为:

h_\theta(x) = \theta_0 + \theta_1 x_1 + \theta_2 x_2^2 + \theta_3 x_3^3 + \theta_4 x_4^4

修改后的代价函数

J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right)^2 + \lambda \sum_{j=1}^n \theta_j^2 \right]

  • 第一项:原始均方误差(MSE),衡量模型对训练数据的拟合程度。
  • 第二项:正则化项(L2正则化),惩罚所有参数 \theta_jj \geq 1)的大小。
  • 正则化参数 \lambda:控制惩罚力度。
    • \lambda 越大,参数 \theta_j 被压缩得越小,模型越简单。
    • \lambda 过大会导致欠拟合(如所有 \theta_j \approx 0,模型退化为常数 \theta_0​)。

2.4.3 正则化的作用原理

  • 抑制过拟合

    • 通过惩罚高阶项(如 \theta_3, \theta_4​),减少模型对噪声的敏感度。
    • 例如,若 \lambda = 1000,则 \theta_3和 \theta_4​ 会被显著压缩,削弱高阶项的影响。
  • 自动特征选择

    • 对所有参数(除 \theta_0​)施加惩罚,让算法自动决定哪些特征需要保留或弱化。

2.4.4 正则化参数 \lambda 的影响

场景影响结果
\lambda = 0无正则化,模型可能过拟合。高方差,低偏差
\lambda适中平衡拟合与泛化,参数适度减小。模型复杂度适中
\lambda过大所有参数 \theta_jj \geq 1)趋近于零,模型退化为 h_\theta(x) = \theta_0高偏差,欠拟合

2.5 正则化线性回归

2.5.1 梯度下降法

正则化线性回归的代价函数为:

J(\theta) = \frac{1}{2m} \left[ \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right)^2 + \lambda \sum_{j=1}^n \theta_j^2 \right]

其中 \theta_0不参与正则化,仅对 \theta_1, \theta_2, ..., \theta_n 施加惩罚。

参数更新规则

  • 对 \theta_0(无正则化):\theta_0 := \theta_0 - \alpha \frac{1}{m} \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_0^{(i)}
  • 对 \theta_jj \geq 1(含正则化):\theta_j := \theta_j \left( 1 - \alpha \frac{\lambda}{m} \right) - \alpha \frac{1}{m} \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_j^{(i)}

关键点

  • 每次更新时,\theta_j会额外乘以\left( 1 - \alpha \frac{\lambda}{m} \right),逐步压缩其值。
  • \lambda越大,参数缩小幅度越大,模型越简单。

2.5.2 正规方程法

正则化后的正规方程通过修改矩阵运算直接求解最优参数:

\theta = \left( X^T X + \lambda M \right)^{-1} X^T y

其中:

  • X 是 m \times (n+1)的设计矩阵(包含全1列x_0 = 1)。
  • M 是 (n+1) \times (n+1)的对角矩阵M,第一行第一列为0(不惩罚 \theta_0),其余对角线元素为1。

​​​​​​​​​​​​​​M = \begin{bmatrix} 0 & 0 & \cdots & 0 \\ 0 & 1 & \cdots & 0 \\ \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & \cdots & 1 \end{bmatrix}​​​​​​​

优势

  • 避免 X^T X不可逆的问题(即使特征间存在多重共线性)。
  • 显式加入正则化项,直接控制模型复杂度。

2.5.3 对比与总结

方法梯度下降正规方程
适用场景数据量大(如 m > 10,000)数据量小(如 m \leq 10,000)
计算复杂度O(mn)每次迭代O(n^3)(矩阵求逆)
正则化实现通过修改参数更新规则,逐步压缩参数值通过修改矩阵运算,直接加入正则化项
优点适合大规模数据,内存需求低无需选择学习率,一步求解最优解

2.6正则化的逻辑回归模型

2.6.1 正则化后的代价函数

正则化逻辑回归的代价函数在原始对数损失函数基础上添加 L2 正则项

J(\theta) = \frac{1}{m} \sum_{i=1}^m \left[ -y^{(i)} \log(h_\theta(x^{(i)})) - (1 - y^{(i)}) \log(1 - h_\theta(x^{(i)})) \right]+ \frac{\lambda}{2m} \sum_{j=1}^n \theta_j^2

  • 核心项
    • 对数损失函数(衡量模型拟合能力)。
    • L2 正则化项(抑制参数大小,防止过拟合)。
  • 注意:正则化项 不包含截距项 \theta_0

2.6.2 梯度下降更新规则

梯度下降的更新分为两部分:

  • \theta_0(无正则化)

​​​​​​​\theta_0 := \theta_0 - \alpha \cdot \frac{1}{m} \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_0^{(i)}

  • 对 \theta_j( j \geq 1(含正则化)

​​​​​​​​​​​​​​\theta_j := \theta_j \left( 1 - \alpha \frac{\lambda}{m} \right) - \alpha \cdot \frac{1}{m} \sum_{i=1}^m \left( h_\theta(x^{(i)}) - y^{(i)} \right) x_j^{(i)}

关键点

  • 正则化通过压缩项 \left( 1 - \alpha \frac{\lambda}{m} \right)逐步缩小参数值。
  • 仅对j \geq 1 的参数施加正则化,\theta_0 始终自由更新。

2.6.3 Python 代码实现

import numpy as np

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

def cost_reg(theta, X, y, lambda_):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    
    # 计算对数损失
    h = sigmoid(X * theta.T)
    term1 = np.multiply(-y, np.log(h))
    term2 = np.multiply((1 - y), np.log(1 - h))
    loss = np.sum(term1 - term2) / len(X)
    
    # 计算正则化项(排除 theta_0)
    reg = (lambda_ / (2 * len(X))) * np.sum(np.power(theta[:, 1:], 2))  # theta[:,1:] 表示 j≥1 的参数
    
    return loss + reg

def gradient_reg(theta, X, y, lambda_):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    
    # 计算梯度
    h = sigmoid(X * theta.T)
    grad = (1 / len(X)) * X.T * (h - y)  # 原始梯度
    
    # 对 j≥1 的参数添加正则化项
    grad[1:] += (lambda_ / len(X)) * theta[:, 1:].T  # 注意索引从1开始
    
    return grad.flatten()

2.6.4 与线性回归正则化的区别

尽管梯度下降公式形式相似,但二者本质不同:

差异点逻辑回归线性回归
假设函数h_\theta(x) = \frac{1}{1 + e^{-\theta^T x}}(Sigmoid 函数)h_\theta(x) = \theta^T x(线性)
损失函数对数损失(Log Loss)均方误差(MSE)
梯度计算梯度中包含 Sigmoid 函数的导数项梯度为线性组合

2.6.5 正则化参数\lambda 的选择

交叉验证:通过网格搜索(如 GridSearchCV)选择最佳 \lambda

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV

# 定义候选 λ 值(注意:sklearn 中参数名为 C,且 C = 1/λ)
param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100]}  # C 越小,正则化越强

# 使用网格搜索
model = LogisticRegression(penalty='l2', solver='liblinear')
grid_search = GridSearchCV(model, param_grid, cv=5)
grid_search.fit(X_train, y_train)

best_lambda = 1 / grid_search.best_params_['C']  # 转换为 λ
;