解决模型高方差(过拟合)的问题,所谓高方差,就是模型建立受数据变动敏感。
比如在线性回归中,为了拟合某些数据(degree设置的很大),某些系数变得非常大,正则化就是用惩罚系数来防止那些特别巨大的系数出现的。
岭回归
目标是使 ,也就是系数thtea下的预测之与真实值的差距尽可能小
但又要解决高方差的问题,使某些系数不要太大,所以加入了模型正则化,使得尽可能小。即每一个theta的平方和与(一个常数)的乘积尽可能小。这样就既要考虑mse(低偏差),又要考虑后半部分公式(低方差),即theta不能太大。这个二分之一是为了梯度下降时求导方便。
sklearn岭回归
from sklearn.linear_model import Ridge,Lasso # 添加惩罚系数的多项式回归
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.mertics import mean_squared_error
def RidgeRegression(degree, alpha):
return Pipeline({
("poly",PolynomialFeatures(degree=degree)),
("std_scaler", StandardScaler()), # 归一化是为了让梯度下降时效率更高
("ridge_reg",Ridge(alpha=alpha)) # 公式上的惩罚系数alpha的大小
})
ridge1_reg = RidgeRegression(20, 0.0001)
ridge1_reg.fit(X_train, y_teain)
y1_predict = ridge1_reg.predict(X_test)
mean_squared_error(y_test,y1_predict)
Lasso回归
类似于岭回归,只是公式不一样
由于公式的变化,相较于岭回归alpha的惩罚系数可以相对设置的大一些
lasso模型趋向于把一部分theta变成0,所以可以作为特征选择使用,但是可能删除有用的特征。
正则
,当p等于1的时候,相当于从零点到这个向量的曼哈顿距离。
这个叫做Lp范数,比如p=1时,叫做L1范数。
L0正则项,没有数学表达式,theta数量越小越好,很少使用,np难问题(无法用数学表达数或梯度下降法实现,只能用穷举的方法),通常使用L1代替。
L1正则项
L2正则项,按照公式是需要开根号的,但是这样写比较简单,alpha取小点效果是一样的
Ln正则项,通常不会用。
把均方误差加上正则项就是岭回归和lasso回归了。
弹性网(Elastic Net)
使用俩个正则项形成损失函数,并且添加新系数r用来表示俩个正则项的比例。在上述式子中分别为r和1-r
同时结合了岭回归和lasso回归的优势,既有岭回归的精确性,又有lasso的特征选择。
提一嘴模型泛化的意思
由此及彼的能力,也就是根据已有数据训练的模型的预测能力。