对模型参数进行限制或者规范化能将一些参数朝着0收缩(shrink)。使用收缩的方法的效果提升是相当好的,岭回归(ridge regression,后续以ridge代称),lasso和弹性网络(elastic net)是常用的变量选择的一般化版本。弹性网络实际上是结合了岭回归和lasso的特点。

Lasso和Ridge比较

  • Lasso的目标函数:

  • Ridge的目标函数:

  • ridge的正则化因子使用二阶范数,虽然ridge可以将参数估计值向0收缩,但对于任何调优后的参数值,它都无法将某些参数值变为严格的0,尽管某些参数估计值变得非常小以至于可以忽略,但实际上它并没有进行变量选择。所以L1范数和L2范数正则化都有助于降低过拟合风险,但L1范数还带来一个额外的好处,它比L2范数更易于获得“稀疏(sparse)”解,即它所求的w会有更少的非零分量。
  • 为何ridge到lasso,从L2范数变成L1范数,lasso就能够把参数估计收缩为0而ridge就不行呢?对于Lasso而言,优化下面两个方程是等价的:



    也就是说,对每个超参λ,都存在相应的s值,使得上面两个方程优化后得到的参数估计相同。

    类似的,对于Ridge,下面两个方程等价:



    当参数维度p=2时,lasso的参数估计是在|β1|+|β2|<=s条件下,β1和β2最小化RSS的。ridge的参数估计是在β1222<=s的参数取值中最小化RSS的。当s很大时,限制条件几乎是无效的,lasso和ridge退化为最小二乘法,相反,如果s很小时,那么可能的参数取值范围就非常有限。



    红线是平方误差项RSS的等值线,左侧青绿色的正方形是L1范数约束下的(β12)的取值空间,右侧青绿色的圆形是L2范数约束下的(β12)的取值空间。上面两个方程组的解要在平方误差项RSS和正则化项之间折中,及出现在图中平方误差项等值线与正则化项等值线相交处。从上图可以看出,使用L1范数时平方误差项等值线与正则化等值线的交点常常出现在坐标轴上,即w1或者w2为0,而在采用L2范数时,两者交点往往出现在某个象限中,即w1或者w2均非0,也就是说,L1范数比L2范数更易得到稀疏解。

弹性网络ElasticNet

弹性网络的目标函数:



弹性网络则是同时使用了L1和L2作为正则化项,ElasticNet在sklearn的地址:ElasticNet

  • 参数中l1_ratio为L1范数惩罚项所占比例,0 <= l1_ratio <= 1。若l1_ratio =0时,弹性网络退化为ridge(只剩L2范数的惩罚项)。

  • 参数中alpha即为上式中的α,越大对参数惩罚越大,越不容易过拟合。

    使用样例:

     import numpy as np
    from sklearn import linear_model ###############################################################################
    # Generate sample data
    n_samples_train, n_samples_test, n_features = 75, 150, 500
    np.random.seed(0)
    coef = np.random.randn(n_features)
    coef[50:] = 0.0 # only the top 10 features are impacting the model
    X = np.random.randn(n_samples_train + n_samples_test, n_features)
    y = np.dot(X, coef) # Split train and test data
    X_train, X_test = X[:n_samples_train], X[n_samples_train:]
    y_train, y_test = y[:n_samples_train], y[n_samples_train:] ###############################################################################
    # Compute train and test errors
    alphas = np.logspace(-5, 1, 60)
    enet = linear_model.ElasticNet(l1_ratio=0.7)
    train_errors = list()
    test_errors = list()
    for alpha in alphas:
    enet.set_params(alpha=alpha)
    enet.fit(X_train, y_train)
    train_errors.append(enet.score(X_train, y_train))
    test_errors.append(enet.score(X_test, y_test)) i_alpha_optim = np.argmax(test_errors)
    alpha_optim = alphas[i_alpha_optim]
    print("Optimal regularization parameter : %s" % alpha_optim) # Estimate the coef_ on full data with optimal regularization parameter
    enet.set_params(alpha=alpha_optim)
    coef_ = enet.fit(X, y).coef_ ###############################################################################
    # Plot results functions import matplotlib.pyplot as plt
    plt.subplot(2, 1, 1)
    plt.semilogx(alphas, train_errors, label='Train')
    plt.semilogx(alphas, test_errors, label='Test')
    plt.vlines(alpha_optim, plt.ylim()[0], np.max(test_errors), color='k',
    linewidth=3, label='Optimum on test')
    plt.legend(loc='lower left')
    plt.ylim([0, 1.2])
    plt.xlabel('Regularization parameter')
    plt.ylabel('Performance') # Show estimated coef_ vs true coef
    plt.subplot(2, 1, 2)
    plt.plot(coef, label='True coef')
    plt.plot(coef_, label='Estimated coef')
    plt.legend()
    plt.subplots_adjust(0.09, 0.04, 0.94, 0.94, 0.26, 0.26)
    plt.show()

周志华:机器学习

http://www4.stat.ncsu.edu/~post/josh/LASSO_Ridge_Elastic_Net_-_Examples.html

http://blog.csdn.net/qq_21904665/article/details/52315642

http://blog.peachdata.org/2017/02/07/Lasso-Ridge.html

变量的选择——Lasso&Ridge&ElasticNet的更多相关文章

  1. 《机器学习_01_线性模型_线性回归_正则化(Lasso,Ridge,ElasticNet)》

    一.过拟合 建模的目的是让模型学习到数据的一般性规律,但有时候可能会学过头,学到一些噪声数据的特性,虽然模型可以在训练集上取得好的表现,但在测试集上结果往往会变差,这时称模型陷入了过拟合,接下来造一些 ...

  2. 【机器学习】Linear least squares, Lasso,ridge regression有何本质区别?

    Linear least squares, Lasso,ridge regression有何本质区别? Linear least squares, Lasso,ridge regression有何本质 ...

  3. L1,L2范数和正则化 到lasso ridge regression

    一.范数 L1.L2这种在机器学习方面叫做正则化,统计学领域的人喊她惩罚项,数学界会喊她范数. L0范数  表示向量xx中非零元素的个数. L1范数  表示向量中非零元素的绝对值之和. L2范数  表 ...

  4. php变量双击选择无法选择$符号

    创建/Data/Packages/User/PHP.sublime-settings文件,内容为 {     "word_separators": "./\\()\&qu ...

  5. [Scikit-learn] 1.5 Generalized Linear Models - SGD for Regression

    梯度下降 一.亲手实现“梯度下降” 以下内容其实就是<手动实现简单的梯度下降>. 神经网络的实践笔记,主要包括: Logistic分类函数 反向传播相关内容 Link: http://pe ...

  6. 转载:线性回归建模–变量选择和正则化(1):R包glmnet

    2013-07-15 21:41:04   #本文的目的在于介绍回归建模时变量选择和正则化所用的R包,如glmnet,ridge,lars等.算法的细节尽量给文献,这个坑太大,hold不住啊. 1.变 ...

  7. 再谈Lasso回归 | elastic net | Ridge Regression

    前文:Lasso linear model实例 | Proliferation index | 评估单细胞的增殖指数 参考:LASSO回歸在生物醫學資料中的簡單實例 - 生信技能树 Linear le ...

  8. spss如何选择需要的变量?

    spss如何选择需要的变量? 今天一位网友问我,spss如何在许多字段(变量)中选择我需要的字段,而不显示其他的字段呢? 这个问题问的很好,在实际的数据分析或者挖掘的过程中,都需要用这个来找出对商业问 ...

  9. ISLR系列:(4.1)模型选择 Subset Selection

    Linear Model Selection and Regularization 此博文是 An Introduction to Statistical Learning with Applicat ...

随机推荐

  1. AR Drone系列之:使用ROS catkin创建package并使用cv_bridge实现对ar drone摄像头数据的处理

    1 开发环境 Ubuntu 12.04 ROS Hydro 2 前提 可參考这篇blog:http://blog.csdn.net/yake827/article/details/44564057 b ...

  2. 分布式服务网关(Web Api)

    分布式服务网关(Web Api) kmp算法又称“看毛片”算法,是一个效率非常高的字符串匹配算法.不过由于其难以理解,所以在很长的一段时间内一直没有搞懂.虽然网上有很多资料,但是鲜见好的博客能简单明了 ...

  3. Matlab使用鼠标标注图像位置并返回坐标(标注图像ROI)

    代码 function ROI=LabelBox(filename) Mat=imread(filename); imshow(Mat); mouse=imrect; pos=getPosition( ...

  4. 科学的解决Http Token拦截器TokenInterceptor实现

    1.写在前面 在做项目的时候,有时对接口要求比较严谨.先介绍下情况. 我这边Http 方式采用的是 OKhttp+Retrofit 后台一共分为三种token,分别是实名token(accessTok ...

  5. android4.4系统解决“ERRORcouldn&#39;t find native method”方法

    android4.4系统解决"ERRORcouldn't find native method"方法 今天笔者在移植一个tv模块从android4.2到android4.4系统的设 ...

  6. WPF: FishEyePanel/FanPanel - 自定义Panel

    原文:WPF: FishEyePanel/FanPanel - 自定义Panel 原文来自CodeProject,主要介绍如何创建自定义的Panel,如同Grid和StackPanel. 1) Int ...

  7. js仿黑客帝国文字数字雨效果

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  8. WPF实用指南一:在WPF窗体的边框中添加搜索框和按钮

    原文:WPF实用指南一:在WPF窗体的边框中添加搜索框和按钮 在边框中加入一些元素,在应用程序的界面设计中,已经开始流行起来.特别是在浏览器(Crome,IE,Firefox,Opera)中都有应用. ...

  9. ubuntu 16.04快速安装ceph集群

    准备工作 假设集群: 选一台作管理机 注意: ceph集群引用hostname,而非ip. 172.17.4.16 test16 #hostname必须是test16 172.17.4.17 test ...

  10. 测试WPF绑定bug

    1.低级错误:有没有绑错2.去属性那里打断点,get.set有没有进3.xaml加上twoway,UpdateSourceTrigger=PropertyChanged