ElasticNet回归及机器学习正则化(linear_model.ElasticNetCV)
要想理解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) * ||y - 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))
参考网页: