本站原创文章,转载请说明来自《老饼讲解-机器学习》www.bbbdata.com
正则化可以抑制系数过大,是防止过拟合的常用手段之一
本文通过讲解正则化应用于逻辑回归的实际例子,进一步具体掌握正则化的使用
本节介绍逻辑回归正则化后的损失函数
以及逻辑回归正则化后用梯度下降算法求解时的梯度公式
逻辑回归应用正则化
正则化就是在损失函数中加入正则项,
对于逻辑回归而言,如下
逻辑回归原始损失函数
逻辑回归正则化后的损失函数
正则化逻辑回归的梯度求解方法
梯度下降算法只要初始化解,然后将解不断往负梯度方法调整即可,
由于其中需要用到损失函数的梯度,因此正则化后的梯度公式也需要进行调整
逻辑回归原始梯度公式
逻辑回归加入正则项后的梯度公式
✍️备注
正则化后的梯度公式也就在原始公式上再加上正则部分的梯度即可
正则部分的梯度的推导如下:
先对单个求偏导,有:
则对整体有:
本节用代码实现梯度下降算法求解正则化后的逻辑回归
并对正则化与没有正则化两种情况得到的结果进行比较
代码实现
代码只需在第二课《【实例】逻辑回归实例讲解》中的代码进行小修改,
将原来第21行 w = w - 0.01*(xt.T@(p-y)) 改为 w = w - 0.01*(xt.T@(p-y)+2*lamb*w)
修改后的代码如下:
# -*- coding: utf-8 -*-
"""
梯度下降求解逻辑回归(加入正则项)
"""
from sklearn.datasets import load_breast_cancer
import numpy as np
#----数据加载------
data = load_breast_cancer()
X = data.data[:,4:8]
y = data.target
#-----给x增加一列1---------
xt = np.insert(X, X.shape[1], 1, axis=1)
#-----梯度下降求解w---------------
np.random.seed(888) # 设定随机种子,以确保每次程序结果一次
lamb = 1 # 设置正则项的lambda
w = np.random.rand(xt.shape[1]) # 初始化
for i in range(10000):
p = 1/(1+np.exp(-xt@w)) # 计算p
w = w - 0.01*(xt.T@(p-y)+2*lamb*w) # 往负梯度方向更新w
p = 1/(1+np.exp(-xt@w)) # 最终的预测结果
print("参数w:"+str(w))
运行结果及结果解说
运行结果
当lamb设为0时(相当没有正则项),得到的结果为:
参数w:[ 7.16 , 14.98, -16.84 ,-73.92,3.38]
当lamb设为1时,得到的结果为:
参数w:[-0.26, -2.35, -4.54, -2.70 , 1.33]
结果解说
从上述结果可以看到,
正则项系数设为0时(相当于没有正则化),求得的系数有些偏大
而正则项系数设为1后,就不再有过大的系数了
通过以上的对比,可以看到,正则化是有效的
End