一、问题由来
1、线性回归过拟合(房价预测)
由上图可看,
第一个模型是一个线性模型,欠拟合,不能很好地适应我们的训练集;
第三个模型是一个四次方的模型,过于强调拟合原始数据,而丢失了算法的本质:预测新数据;
中间的模型似乎最合适。
2、逻辑回归过拟合(分类问题)
就以多项式理解,x的次数越高,拟合的越好,但相应的预测的能力就可能变差。
二、L2正则化
在事例中看出,由于那些高次项导致了过拟合的产生,所以如果我们让这些高次项的系数接近于 0 的话,我们就能很好的拟合了。
所以我们要做的就是在一定程度上减小这些参数 θ 的值,这就是正则化的基本方法。
θ0不参与其中的任何一个正则化。
1、正则化线性回归
正则化线性回归的代价函数为
由于没有对θ(0)进行正则化,梯度下降算法分为两种情形:
正则化线性回归的梯度下降算法的变化在于,每次都在原有算法更新规则的基础上令θ值减少了一个额外的值,减少参数θ的大小。
2、正则化逻辑回归
逻辑回归的代价函数为
要最小化该代价函数,通过求导,得出梯度下降算法为:
虽然正则化的逻辑回归中的梯度下降和正则化的线性回归中的表达式看起来一样,但
由于两者的 h(x)不同所以还是有很大差别。
三、python代码实现(逻辑回归为例)
1、代价函数
#代价函数后加了个正则化项
def costFunc(h,y,R):
m = len(y)
J = -(1/m)*np.sum(y*np.log(h)+(1-y)*np.log(1-h))+R
return J
2、梯度下降 参数更新后多减额外的正则化项
def graDesc(x,y,alpha=0.15,lamda=1.5,iter_num=6000):
m,n = x.shape
theta = np.zeros((n,1))
J_history = []
for i in range(iter_num):
h = model(x,theta)
#初始化θ
theta_r = theta.copy()
#由于θ(0)不参与更新 因此每次循环初始化θ(0)为0
theta_r[0] = 0
#加入正则化项R
R = lamda/(2*m)*np.sum(np.square(theta_r))
J_history.append(costFunc(h,y,R))
#正则化项对θ求导
deltaTheta = 1.0/m*(np.dot(x.T,h-y)+lamda*theta_r)
theta -= alpha*deltaTheta
return J_history,theta