scikit-learn : LARS[通俗易懂]

scikit-learn : LARS[通俗易懂]LARS正则化斯坦福大学的BradleyEfron,TrevorHastie,IainJohnstone和RobertTibshirani发现了LARS(LeastAngleRegression,最小角回归)它借用了威廉·吉尔伯特·斯特朗(WilliamGilbertStrang)介绍过的高斯消元法(Gaussianelimination)的灵感。背景LARS是一种回归手段,适

大家好,又见面了,我是你们的朋友全栈君。

LARS正则化

斯坦福大学的Bradley Efron, Trevor Hastie, Iain Johnstone和Robert Tibshirani发现了LARS(Least Angle Regression,最小角回归)它借用了威廉·吉尔伯特·斯特朗(William Gilbert Strang)介绍过的高斯消元法(Gaussian elimination)的灵感。

背景

LARS是一种回归手段,适用于解决高维问题,也就是 p>>n 的情况,其中 p 表示列或者特征变量,

n
表示样本数量。
样本数量远远小于特征数量

准备模拟数据

这里我们用的数据集是200个数据,500个特征。还设置了一个低噪声,和少量提供信息的(informative)特征:

import numpy as np
from sklearn.datasets import make_regression
reg_data, reg_target = make_regression(n_samples=200,n_features=500, n_informative=10, noise=2)

由于我们用了10个信息特征,因此我们还要为LARS设置10个非0的相关系数,也就是说10个影响target的自变量。在实际中,我们事先可能不知道信息特征的准确数量,但是出于试验的目的,我们先设计模拟数据的时候,先把信息特征的数量确定,然后用正则化算法挑选特征,看是否能准备的做特征选择:

from sklearn.linear_model import Lars
lars = Lars(n_nonzero_coefs=10)
lars.fit(reg_data, reg_target)
Lars(copy_X=True, eps=2.2204460492503131e-16, fit_intercept=True,
   fit_path=True, n_nonzero_coefs=10, normalize=True, positive=False,
   precompute='auto', verbose=False)

我们可以检验一下看看LARS的非0相关系数的和:

np.sum(lars.coef_ != 0)
10

问题在于为什么少量的特征反而变得更加有效。要证明这一点,让我们用一半数量来训练两个LARS模型,一个用12个非零相关系数,另一个非零相关系数用默认值。这里用12个是因为我们对重要特征的数量有个估计,但是可能无法确定准确的数量:

train_n = 100
lars_12 = Lars(n_nonzero_coefs=12)
lars_12.fit(reg_data[:train_n], reg_target[:train_n])
Lars(copy_X=True, eps=2.2204460492503131e-16, fit_intercept=True,
   fit_path=True, n_nonzero_coefs=12, normalize=True, positive=False,
   precompute='auto', verbose=False)
lars_500 = Lars() #默认就是500
lars_500.fit(reg_data[:train_n], reg_target[:train_n])
Lars(copy_X=True, eps=2.2204460492503131e-16, fit_intercept=True,
   fit_path=True, n_nonzero_coefs=500, normalize=True, positive=False,
   precompute='auto', verbose=False)

现在,让我们看看拟合数据的效果如何,如下所示:

np.mean(np.power(reg_target[train_n:] - lars.predict(reg_data[train_n:]), 2))
14.134164604831474
np.mean(np.power(reg_target[train_n:] - lars_12.predict(reg_data[train_n:]), 2))
2903.791854216995
np.mean(np.power(reg_target[train_n:] - lars_500.predict(reg_data[train_n:]), 2))
8.5745410020833916e+30

仔细看看这组结果;测试集的误差明显高很多。高维数据集问题就在于此;通常面对大量的特征时,想找出一个对训练集拟合很好的模型并不难,但是拟合过度却是更大的问题。

LARS原理

LARS通过重复选择与残存变化相关的特征。从图上看,相关性实际上就是特征与残差之间的最小角度;这就是LARS名称的由来。

选择第一个特征之后,LARS会继续沿着最小角的方向移动,直到另一个特征与残差有同样数量的相关性。然后,LARS会沿着两个特征组合的角度移动。如下图所示:

%matplotlib inline
import matplotlib.pyplot as plt
def unit(*args):
    squared = map(lambda x: x**2, args)
    distance = sum(squared) ** (.5)
    return map(lambda x: x / distance, args)

f, ax = plt.subplots(nrows=3, figsize=(5, 10))
plt.tight_layout()
ax[0].set_ylim(0, 1.1)
ax[0].set_xlim(0, 1.1)

x, y = unit(1, 0.02)
ax[0].arrow(0, 0, x, y, edgecolor='black', facecolor='black')
ax[0].text(x + .05, y + .05, r"$x_1$")

x, y = unit(.5, 1)
ax[0].arrow(0, 0, x, y, edgecolor='black', facecolor='black')
ax[0].text(x + .05, y + .05, r"$x_2$")

x, y = unit(1, .45)
ax[0].arrow(0, 0, x, y, edgecolor='black', facecolor='black')
ax[0].text(x + .05, y + .05, r"$y$")

ax[0].set_title("No steps")

#step 1
ax[1].set_title("Step 1")
ax[1].set_ylim(0, 1.1)
ax[1].set_xlim(0, 1.1)

x, y = unit(1, 0.02)
ax[1].arrow(0, 0, x, y, edgecolor='black', facecolor='black')
ax[1].text(x + .05, y + .05, r"$x_1$")

x, y = unit(.5, 1)
ax[1].arrow(0, 0, x, y, edgecolor='black', facecolor='black')
ax[1].text(x + .05, y + .05, r"$x_2$")

x, y = unit(.5, 1)
ax[1].arrow(.5, 0.01, x, y, ls='dashed', edgecolor='black', facecolor='black')
ax[1].text(x + .5 + .05, y + .01 + .05, r"$x_2$")

ax[1].arrow(0, 0, .47, .01, width=.0015, edgecolor='black', facecolor='black')
ax[1].text(.47-.15, .01 + .03, "Step 1")

x, y = unit(1, .45)
ax[1].arrow(0, 0, x, y, edgecolor='black', facecolor='black')
ax[1].text(x + .05, y + .05, r"$y$")

#step 2
ax[2].set_title("Step 2")
ax[2].set_ylim(0, 1.1)
ax[2].set_xlim(0, 1.1)

x, y = unit(1, 0.02)
ax[2].arrow(0, 0, x, y, edgecolor='black', facecolor='black')
ax[2].text(x + .05, y + .05, r"$x_1$")

x, y = unit(.5, 1)
ax[2].arrow(0, 0, x, y, edgecolor='black', facecolor='black')
ax[2].text(x + .05, y + .05, r"$x_2$")

x, y = unit(.5, 1)
ax[2].arrow(.5, 0.01, x, y, ls='dashed', edgecolor='black', facecolor='black')
ax[2].text(x + .5 + .05, y + .01 + .05, r"$x_2$")

ax[2].arrow(0, 0, .47, .01, width=.0015, edgecolor='black', facecolor='black')
ax[2].text(.47-.15, .01 + .03, "Step 1")

## step 2
x, y = unit(1, .45)
ax[2].arrow(.5, .02, .4, .35, width=.0015, edgecolor='black', facecolor='black')
ax[2].text(x, y - .1, "Step 2")

x, y = unit(1, .45)
ax[2].arrow(0, 0, x, y, edgecolor='black', facecolor='black')
ax[2].text(x + .05, y + .05, r"$y$");

这里写图片描述

具体过程是,我们把 x2 沿着 x1 方向移动到一个位置,再沿着 x1 x2 夹角的一半的方向移动。

LARS交叉验证

和我们前面用交叉检验来优化领回归模型一样,我们可以对LARS做交叉检验:

from sklearn.linear_model import LarsCV
lcv = LarsCV()
lcv.fit(reg_data, reg_target)

C:\Anaconda2\lib\site-packages\sklearn\linear_model\least_angle.py:309: ConvergenceWarning: Regressors in active set degenerate. Dropping a regressor, after 177 iterations, i.e. alpha=1.269e-01, with an active set of 133 regressors, and the smallest cholesky pivot element being 6.580e-08
ConvergenceWarning)

LarsCV(copy_X=True, cv=None, eps=2.2204460492503131e-16, fit_intercept=True,
    max_iter=500, max_n_alphas=1000, n_jobs=1, normalize=True,
    positive=False, precompute='auto', verbose=False)

用交叉检验可以帮助我们确定需要使用的非零相关系数的最佳数量。验证如下所示:

np.sum(lcv.coef_ != 0)
21

LARS论文

[1] Efron, Bradley; Hastie, Trevor; Johnstone, Iain and Tibshirani, Robert(2004). “Least Angle Regression“. Annals of Statistics 32(2): pp. 407–499.doi:10.1214/009053604000000067. MR 2060166.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/149159.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • mysql聚集索引和覆盖索引_索引快速全扫描

    mysql聚集索引和覆盖索引_索引快速全扫描查询优化:索引覆盖扫描——当索引中的列包含所有查询中要使用的列的时候,就会用到覆盖索引,效率比较高。因为尽量使select后面的字段是where中的索引字段。…

    2022年10月21日
    2
  • mysql 前缀索引_MySQL前缀索引

    mysql 前缀索引_MySQL前缀索引有时候需要索引很长的字符字段列,这会增加索引的存储空间以及降低索引的查询效率,一种策略是可以使用哈希索引,还有一种就是使用前缀索引。前缀索引是选择字符列的前n个字符作为索引,这样可以大大节约索引空间,从而提高索引效率。前缀索引的选择性使用前缀索引,在一些场景下可能使得重复的索引值变多,索引的选择性变低,查找时需要过滤更多的行,因此建立前缀索引也要考虑前缀的索引选择性不能太低。Tips:主键索引和唯…

    2022年5月10日
    41
  • futex简介_fut是什么牌子

    futex简介_fut是什么牌子找到一篇很好的文章,讲得深入浅出;貌似原网站也很不错。转载自http://linuxperf.com/?p=23futex(fastuserspacemutex)是Linux的一个基础构件,可以用来构建各种更高级别的同步机制,比如锁或者信号量等等,POSIX信号量就是基于futex构建的。大多数时候编写应用程序并不需要直接使用futex,一般用基于它所实现的系统库就够了。futex的性能非常优异,它是怎样做到的呢?这要从它的设计思想谈起。传统的SystemVIPC(interproces

    2022年9月21日
    1
  • listagg小记录[通俗易懂]

    listagg小记录[通俗易懂]listagg的作用是将分组范围内的所有行特定列的记录加以合并成行。函数签名中的measure_expr为分组中每个列的表达式,而delimiter为合并分割符。如果delimiter不设置的话,就表示无分割符。  中间withingroup后面的order_by_clause表示的是进行合并中要遵守的排序顺序。而后面的over子句表明listagg是具有分析函数analyze

    2025年9月6日
    5
  • eXtremeDB XML[通俗易懂]

    eXtremeDB XML[通俗易懂]ForC/C++applicationstheeXtremeDBschemacompileroption“–x”causes mcocomptogenerateinterfacefunctionstoretrieve,createandreplace(update) thecontentsofanobjectwiththecontent

    2022年10月14日
    1
  • 生活角色主要包括哪些内容_简要介绍眼睛是的体位分类

    生活角色主要包括哪些内容_简要介绍眼睛是的体位分类ILSVRC2012数据集(分类部分)简要介绍和初步处理简介即大名鼎鼎ImageNet2012竞赛的数据集,在图像分类数据集中属于最常用的跑分数据集和预训练数据集。主要内容可以参考ILSVRC2012_devkit_t12.gz的readme.txt和中文翻译版内容详解下载的文件主要包括以下几个文件:ILSVRC2012_img_train.tarILSVRC2012_img_val.tarILSVRC2012_img_test.tarILSVRC2012_devkit

    2022年10月21日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号