要想理解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))
 
  参考网页: 
    
京公网安备 11010502036488号