对模型参数进行限制或者规范化能将一些参数朝着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. erlang数字转字符串

    http://fengmm521.blog.163.com/blog/static/2509135820147922355273/ 如果有一个数字,你想要转换成字符串这个在Erlang中是怎么操作的, ...

  2. scala 加载与保存xml文档

    package scala_enhance.xml import scala.xml.XML import scala.io.Source import jdk.internal.org.xml.sa ...

  3. 带你轻松看源代码---AsyncTask(异步任务)

    本文出自博客Vander丶CSDN博客,如需转载请标明出处,尊重原创谢谢 博客地址:http://blog.csdn.net/l540675759/article/details/62893318 写 ...

  4. 在JS中var、let和const的区别

    var有变量提升 x = 4; // 变量 x 设置为 4 console.log(x)  //输出 4 var x; // 声明 x 上面代码相当于下面的 var x; // 声明 xx = 4;  ...

  5. 看看是不是你想要的:pycharm永久激活!!!

    pycharm是很强大的开发工具,但是每次注册着实让人头疼.网络上很多注册码.注册服务器等等.但都只是一年或者不能用:为次有如下解决方案.亲测有效!!! 如果想让pycharm永久被激活,比如截止日到 ...

  6. 如何解决-bash: jstack: command not found,Linux安装jstack

    不少朋友在刚接触jvm的时候,通常在Linux中经常要使用jstack命令,新手经常会遇到如下问题: -bash: jstack: command not found 不用慌张,该命令位于Java/b ...

  7. Java背景

    Java语言是美国Sun公司(Stanford University Network),在1995年推出的高级编程语言 2009年Oracle甲骨文公司收购Sun公司

  8. C#之Linq、where()、FindAll()的区别

    原地址 C#之Linq.where().FindAll()的区别 对于实现了IEnumerable接口的类.类型.集合可以使用Linq.Linq的扩展方法where().FindAll()来查询符合谓 ...

  9. linux下安装sqlite3

    1.介绍:sqlite3是linux上的小巧的数据库,一个文件就是一个数据库.2.安装:  要安装sqlite3,可以在终端提示符后运行下列命令:  sudo apt-get install sqli ...

  10. CUDA流(Stream)

    CUDA流表示一个GPU操作队列,该队列中的操作将以添加到流中的先后顺序而依次执行.可以将一个流看做是GPU上的一个任务,不同任务可以并行执行.使用CUDA流,首先要选择一个支持设备重叠(Device ...