逻辑回归正则化在处理具有多个特征且特征可能共线性(即特征之间高度相关)的数据集特别有用。
下面用一个例子说明什么是正则化:
假设你在厨房准备一顿饭,你的目标是做出美味又不过分油腻的菜肴。
没有正则化的情况:
假设你没有任何限制地使用所有的调料,包括大量的盐和油。这可能会使得某些菜肴在尝起来非常美味(模型在训练数据上表现得很好),但对健康并不好(模型泛化能力差,即在未知数据上表现不佳)。这就好比一个过拟合的模型,它在训练集上学到了太多不必要的复杂性,以至于不能很好地推广到新的情况。
加入正则化:
正则化就好比是在你的烹饪过程中有意识地限制油和盐的使用。你不完全禁止它们------因为它们对于菜肴的味道很重要------但你会谨慎地使用它们,以确保菜肴既美味又健康。这就是正则化在模型中的作用:它不是完全消除模型中的特征(调料),而是限制这些特征的权重,使模型保持适度。
正则化的强度(λ):
正则化参数λ就像是你控制调料使用的规则。如果你设置得太严格(λ太高),那么菜肴可能会变得清淡无味(模型过于简化,可能导致欠拟合)。如果你设置得太宽松(λ太低),菜肴可能仍然过于油腻(模型过拟合)。
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 准则:这些准则衡量的是模型的好坏,同时惩罚模型的复杂度。它们可以用于自动选择 λ 值,尤其在统计建模中比较常用。
-
验证曲线:通过绘制不同 λ 值的模型性能(比如,准确率或错误率)来直观地展示其影响。观察这些曲线,可以帮助选择一个使得模型既不过拟合也不欠拟合的 λ 值。
-
学习曲线:通过分析训练和验证误差随训练集大小变化的曲线,可以帮助判断更大或更小的 λ 值是否有助于提高模型性能。
-
启发式方法:在某些情况下,可以根据领域知识或以往经验来选择 λ 值。例如,在处理类似的数据集或问题时,先前有效的 λ 值可能会是一个不错的起点。
-
自动化方法:有些算法和库提供了自动化选择正则化参数的选项。例如,一些机器学习框架中的正则化路径算法可以自动搜索并选择最佳的 λ 值。