逻辑回归正则化

逻辑回归正则化在处理具有多个特征且特征可能共线性(即特征之间高度相关)的数据集特别有用。

下面用一个例子说明什么是正则化:

假设你在厨房准备一顿饭,你的目标是做出美味又不过分油腻的菜肴。

没有正则化的情况:

假设你没有任何限制地使用所有的调料,包括大量的盐和油。这可能会使得某些菜肴在尝起来非常美味(模型在训练数据上表现得很好),但对健康并不好(模型泛化能力差,即在未知数据上表现不佳)。这就好比一个过拟合的模型,它在训练集上学到了太多不必要的复杂性,以至于不能很好地推广到新的情况。

加入正则化:

正则化就好比是在你的烹饪过程中有意识地限制油和盐的使用。你不完全禁止它们------因为它们对于菜肴的味道很重要------但你会谨慎地使用它们,以确保菜肴既美味又健康。这就是正则化在模型中的作用:它不是完全消除模型中的特征(调料),而是限制这些特征的权重,使模型保持适度。

正则化的强度(λ):

正则化参数λ就像是你控制调料使用的规则。如果你设置得太严格(λ太高),那么菜肴可能会变得清淡无味(模型过于简化,可能导致欠拟合)。如果你设置得太宽松(λ太低),菜肴可能仍然过于油腻(模型过拟合)。

L1与L2正则化:

对于正则化通常有两种做法,L1和L2

L1 正则化倾向于创建更稀疏的模型,这意味着它会鼓励模型在某些特征上的权重变为零,类似于完全不使用某些调料。

L2 正则化则倾向于让所有特征的权重都较小但不为零,这类似于减少所有调料的使用量,但保留它们的存在。

总结:正则化实际上是对模型参数(例如逻辑回归中的权重)的调整。通过对这些参数添加额外的限制(例如,通过惩罚项),正则化减少模型的复杂度,从而帮助防止过拟合。这意味着模型在学习数据时不会过分依赖任何一个特征,从而提高其在新数据上的泛化能力。简单说:正则化通过调整模型参数的权重,来提高模型在新数据上预测目标(y)的泛化能力。

在逻辑回归中,我们通过在代价函数中增加一个正则化项来减少过拟合的风险: J ( θ ) = − 1 / m [ ∑ i = 1 m y ( i ) l o g ( h θ ( x ( i ) ) ) + ( 1 − y ( i ) ) l o g ( 1 − h θ ( x ( i ) ) ) ] + λ / 2 m ∑ j = 1 n θ j 2 J(θ) = -1/m [∑{i=1}^m y^{(i)} log(h_θ(x^{(i)})) + (1 - y^{(i)}) log(1 - h_θ(x^{(i)}))] + λ/2m ∑{j=1}^n θ_j^2 J(θ)=−1/m[i=1∑my(i)log(hθ(x(i)))+(1−y(i))log(1−hθ(x(i)))]+λ/2mj=1∑nθj2

在这个公式中:
第一部分是未正则化的代价第二部分是正则化项

  • J ( θ ) J(θ) J(θ)是正则化后的代价函数。
  • m m m是训练样本的数量。
  • y ( i ) y^{(i)} y(i)是第 i 个训练样本的目标值。
  • h θ ( x ( i ) ) h_θ(x^{(i)}) hθ(x(i))是模型的预测,即 sigmoid(Xθ)。
  • λ λ λ是正则化参数,它控制了正则化的强度。
  • θ j θ_j θj是模型参数。
  • n n n是参数的数量。

正则化项 λ / 2 m ∑ j = 1 n θ j 2 λ/2m ∑_{j=1}^n θ_j^2 λ/2m∑j=1nθj2通常不包括偏置项 θ 0 θ_0 θ0

在代码中实现这个正则化代价函数:

# 定义正则化代价函数
def costReg(theta, X, y, learning_rate):
    theta = np.matrix(theta)
    first_term = np.multiply(-y, np.log(sigmoid(X * theta.T)))
    second_term = np.multiply((1 - y), np.log(1 - sigmoid(X * theta.T)))
    reg_term = (learning_rate / (2 * len(X))) * np.sum(np.power(theta[:,1:theta.shape[1]], 2))
    return np.sum(first_term - second_term) / len(X) + reg_term

在这个函数中,learning_rate 是 λ λ λ(正则化参数),用于控制正则化的强度。请注意,正则化项只作用于 θ \theta θ的第二个元素及之后的元素,因为我们通常不对偏置项进行正则化。

同样地,梯度函数也需要修改以包括正则化项:

# 定义正则化梯度函数
def gradientReg(theta, X, y, learning_rate):
    theta = np.matrix(theta)
    error = sigmoid(X * theta.T) - y
    grad = ((X.T * error) / len(X)).T + (learning_rate / len(X)) * theta
    # 不对偏置项θ_0进行正则化
    grad[0, 0] = np.sum(np.multiply(error, X[:,0])) / len(X)
    return grad

在这个函数中,我们对除了偏置项之外的所有权重应用正则化。这是通过在梯度计算中添加 (learning_rate / len(X)) * theta 来实现的。对于偏置项 theta[0, 0],我们使用原始的梯度计算方法。

如何选择合适的正则化参数 λ

选择合适的正则化参数 λ对于确保模型既不过拟合也不欠拟合非常重要。以下是一些常用的方法来选择合适的正则化参数,这里仅参考一下,后续再详细学习:

  • 交叉验证:最常见且有效的方法之一。可以使用 k 折交叉验证来评估不同 λ 值的性能。具体来说,将训练数据集分为 k 个小子集;对于每个 λ 值,将其中一个子集作为验证集,其余作为训练集。计算在这 k 个验证集上的平均性能,并选择表现最佳的 λ 值。

  • 网格搜索:与交叉验证结合使用。在一个预定义的范围内(如从 0.01 到 100),为 λ 尝试多个值。通常这些值是在对数尺度上均匀分布的。然后使用交叉验证来评估每个 λ 值的性能,并选择最佳的一个。

  • AIC/BIC 准则:这些准则衡量的是模型的好坏,同时惩罚模型的复杂度。它们可以用于自动选择 λ 值,尤其在统计建模中比较常用。

  • 验证曲线:通过绘制不同 λ 值的模型性能(比如,准确率或错误率)来直观地展示其影响。观察这些曲线,可以帮助选择一个使得模型既不过拟合也不欠拟合的 λ 值。

  • 学习曲线:通过分析训练和验证误差随训练集大小变化的曲线,可以帮助判断更大或更小的 λ 值是否有助于提高模型性能。

  • 启发式方法:在某些情况下,可以根据领域知识或以往经验来选择 λ 值。例如,在处理类似的数据集或问题时,先前有效的 λ 值可能会是一个不错的起点。

  • 自动化方法:有些算法和库提供了自动化选择正则化参数的选项。例如,一些机器学习框架中的正则化路径算法可以自动搜索并选择最佳的 λ 值。

相关推荐
yuanbenshidiaos5 分钟前
C++----------函数的调用机制
java·c++·算法
唐叔在学习9 分钟前
【唐叔学算法】第21天:超越比较-计数排序、桶排序与基数排序的Java实践及性能剖析
数据结构·算法·排序算法
ALISHENGYA28 分钟前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(switch语句)
数据结构·算法
chengooooooo30 分钟前
代码随想录训练营第二十七天| 贪心理论基础 455.分发饼干 376. 摆动序列 53. 最大子序和
算法·leetcode·职场和发展
jackiendsc37 分钟前
Java的垃圾回收机制介绍、工作原理、算法及分析调优
java·开发语言·算法
游是水里的游2 小时前
【算法day20】回溯:子集与全排列问题
算法
yoyobravery2 小时前
c语言大一期末复习
c语言·开发语言·算法
Jiude2 小时前
算法题题解记录——双变量问题的 “枚举右,维护左”
python·算法·面试
被AI抢饭碗的人2 小时前
算法题(13):异或变换
算法
nuyoah♂3 小时前
DAY36|动态规划Part04|LeetCode:1049. 最后一块石头的重量 II、494. 目标和、474.一和零
算法·leetcode·动态规划