ElasticNet回归及机器学习正则化

来源:互联网 发布:淘宝男装潜力卖家入口 编辑:程序博客网 时间:2024/06/09 21:25
今晚在练习kaggle时遇到了弹性网络回归,花了些时间简单查了一些资料,算是稍微理解了些。
要想理解ElasticNet回归,正则化是必须要首先知道的,其次是岭回归和Lasso回归,知道了这些,弹性网回归自然也就明白了。
首先来看正则化:
假设我们都知道利用最小二乘法来做线性回归,最小二乘法回归成功的条件是(我得承认以下的所有图都是我盗的):

即上面这个函数(损失函数,目前也是目标函数)达到最小值,可得到最优的拟合参数(即θ )。
但是存在这样一种情况,如果我们用来拟合的自变量过多(或者说特征变量过多),而且特征变量之前存在很高的相关关系,比如下面这种情况:

以上两个函数都可以很好的拟合数据,但右边的函数显然有过拟合的嫌疑,为了避免这种情况,有两种方法:1、舍掉x^3和x^4这两个变量(这就是所谓的特征选择,舍弃无用的特征变量。可以人工选择,也可以利用算法来做。但有些时候我们可能并不希望舍弃数据,一方面特征选择有一定的不确定性,另一方面这个过程是比较繁琐的,这种时候我们可以采用第二种方法来解决这一问题。);2、减小θ3和θ4的值(即正则化,保留所有特征变量,但减少变量参数的值)。
要减小θ3和θ4的值,我们可以在损失函数的后面加上(1000*θ3^2+1000*θ4^2) , :

如此一来在最小化目标函数时,因为θ3和θ4前面乘了1000这样大的数字,导致θ3和θ4的值会非常的小,目标达成。
上面我们有选择的让θ3和θ4的值变小,实际情况中,我们很难判断哪些特征变量需要正则化,所以一般情况下,我们是对所有的参数都正则化处理:

即目标函数设为J(θ),其中:

是正则项,lambda为正则参数。需要注意的是,j是从1开始的,这意味着函数的常数项(θ0)并没有被正则化。所以lambda不能设的太大,否则会导致除了常数项外,所有的参数值都很小,因变量近似等于常数项,出现欠拟合现象。

OK, 正则化介绍到此为止,来看看岭回归和Lasso回归:
岭回归的目标函数就是上面介绍的J(θ):

如果矩阵化的话,也写成:

即最小化loss函数+penalty函数,其中β就是θ(懒得编写公式,直接盗的图)
Lasso回归和岭回归的区别在于惩罚项的不同:

Lasso回归的惩罚项用的是绝对值(也称为L1正则化),而不是岭回归中的平方(L2正则化)。

再来看看ElasticNet回归,目标函数为:

也就是岭回归和Lasso回归的组合。

Python实现ElasticNet回归,有sklearn.linear_model.ElasticNetCV和sklearn.linear_model.ElasticNet两个函数可供选择,前者可以通过迭代选择最佳的lambda1和lambda2(当然你可以指定一组值),后者需要你指定lambda1和lambda2的值。
因为目标函数的形式是:
1 / (2 * n_samples) * ||- Xw||^2_2+ alpha * l1_ratio * ||w||_1+ 0.5 * alpha * (1 - l1_ratio) * ||w||^2_2
所以lambda1和lambda2的指定是通过l1_ratio和alpha来完成
附上代码:
from sklearn import linear_model#得到拟合模型,其中x_train,y_train为训练集ENSTest = linear_model.ElasticNetCV(alphas=[0.0001, 0.0005, 0.001, 0.01, 0.1, 1, 10], l1_ratio=[.01, .1, .5, .9, .99],  max_iter=5000).fit(x_train, y_train)#利用模型预测,x_test为测试集特征变量y_prediction = ENSTest.predict(x_test))

参考网页:
1、http://www.cnblogs.com/jianxinzhou/p/4083921.html
2、http://www.jianshu.com/p/15dd20f8d02c
3、http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNetCV.html
4、http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.ElasticNet.html#sklearn.linear_model.ElasticNet
0 0