微信号:QunarTL

介绍:Qunar技术沙龙是去哪儿网工程师小伙伴以及业界小伙伴们的学习交流平台.我们会分享Qunar和业界最前沿的热门技术趋势和话题;为中高端技术同学提供一个自由的技术交流和学习分享平台.

机器学习之 scikit-learn 开发入门(4)

2018-10-10 08:00 曹华

机器学习之 scikit-learn 开发入门 - 

监督学习 - Lasso 回归介绍


曹华


个人介绍:曹华,2018 年加入去哪儿网技术团队。目前在火车票事业部/技术部小组。个人对图像处理、数据挖掘、图论、VR 等有浓厚兴趣。

一、概要

本文主要讲解 Lasso 回归的实践与原理,主要内容包括:

  1. Lasso 回归的介绍

  2. Lasso 回归算法类库介绍

  3. Lasso 回归应用示例

  4. Lasso 回归的原理

  5. 总结

通过文本的介绍,希望大家可以掌握 Lasso 回归的使用,了解 Lasso 回归的原理。

二、Lasso 回归的介绍

上一篇介绍了 L2 正则化方案,Lasso 属于 L1 正则化方案,它对于数据要求低,所以应用比较广;除此之外,Lasso 还能对变量进行筛选和降低模型的复杂程度。它会通过一系列参数控制模型的复杂度,从而避免过度拟合。

三、scikit-learn Lasso 回归算法类库介绍

scikit-learn 逻辑回归算法类库对应的是 Lasso。下面就对 Lasso 的重要参数做一个总结。

参数名称 参数类型 参数默认值 说明
alpha float 1.0 当 alpha 为 0 时算法等同于普通最小二乘法
max_iter int 1000 最大循环次数
warm_start bool False 为 True 时, 重复使用上一次学习作为初始化,否则直接清除上次方案

四、Lasso 回归应用示例

4.1 导入头文件

 
           
  1. #coding=utf-8

  2. import pandas as pd

  3. from sklearn.cross_validation import train_test_split

  4. from sklearn.linear_model import Lasso,LassoCV

  5. from sklearn import metrics

  6. import numpy as np

  7. import matplotlib.pyplot as plt

4.2 样本数据

 
           
  1. data = pd.read_csv('D:\\hua.cao\\python\\20180606\\Folds5x2_pp.csv')

  2. X = data[['AT', 'V', 'AP', 'RH']]

  3. Y = data[['PE']]

  4. X_TRAIN, X_TEST, Y_TRAIN, Y_TEST = train_test_split(X, Y, random_state=1)

4.3 训练模型

 
           
  1. lasso = Lasso(alpha=0.01)

  2. lasso.fit(X_TRAIN, Y_TRAIN)

4.4 预测验证

 
           
  1. Y_PRED = lasso.predict(X_TEST)

4.5 训练得到的 Lasso 模型

 
           
  1. print lasso.coef_

  2. print lasso.intercept_

[[-1.96862642 -0.23930532 0.05685793 -0.15860993]] [460.04983649]

可知 Lasso 模型为:

PE = -1.96872703 * AT + -0.23925451 * V + 0.05655576 * AP + -0.15856511 * RH + 460.35193481

4.6 交叉验证

 
           
  1. X1 = data[['AT', 'V', 'AP', 'RH']]

  2. Y1 = data[['PE']]

  3. lassocv = LassoCV()

  4. lassocv.fit(X1, Y1)

  5. //获得最优alpha的值

  6. print lassocv.alpha_

  7. //获得每个维度上的权重值

  8. print lassocv.coef_

  9. //获得权重值不为零的维度个数

  10. print np.sum(lassocv.coef_ != 0)

4.7 画出预测值与真实值的线形图

 
           
  1. fig, ax = plt.subplots()

  2. ax.scatter(Y_TEST, Y_PRED)

  3. ax.plot([Y_TEST.min(), Y_TEST.max()], [Y_TEST.min(), Y_TEST.max()], 'k--', lw=4)

  4. ax.set_xlabel('Measured')

  5. ax.set_ylabel('Predicted')

  6. plt.show()

五、Lasso 回归的原理

首先我们回顾下线性回归的标准方程:

我们需要求得 w 和 b 的值。在线性回归中我们利用最小二乘法求得 w 和 b,但是最小二乘法没有对特征的罚分机制,很容易过拟合,所以 Lasso 在线性回归的基础上修改了损失函数,加入了正则化项。

其中 n 为样本个数,α 为常数系数,需要进行调优。||θ||1 为 L1 范数。这里的 α 近似于应用示例中的 alpha。 在这里 sklearn 使用了坐标轴下降法求损失函数的极值。坐标轴下降法的数学依据是:一个可微的凸函数 J(θ),其中 θ 是 nx1 的向量,即有 n 个维度。如果在某一点 i,使得 J(θ) 在每一个坐标轴上都是最小值,那么 J(i) 就是一个全局的最小值。于是我们的优化目标就是在 θ 的 n 个坐标轴上对损失函数做迭代的下降,当所有的坐标轴上的 θi(i = 1,2,...n) 都达到收敛时,我们的损失函数最小,此时的 θ 即为我们要求的结果。

算法流程如下:

1. 首先,我们把 θ 向量随机取一个初值。记为 θ(0),括号里面的数字代表我们迭代的轮数,当前初始轮数为 0。

2. 对于第 k 轮的迭代。我们从 θ1(k) 开始,到 θn(k) 为止,依次求得 θi(k)。 θi(k) 的表达式如下:

3. 检查 θ(k) 向量和 θ(k−1) 向量在各个维度上的变化情况,如果在所有维度上变化都足够小,那么 θ(k) 即为最终结果,否则转入 2,继续第 k+1 轮的迭代。

六、总结

Lasso 回归可以使得一些特征的系数变小,甚至还是一些绝对值较小的系数直接变为 0。增强模型的泛化能力。为什么会变为 0 可以参考机器学习中的范数规则化之(一)L0、L1 与 L2 范数:

https://blog.csdn.net/zouxy09/article/details/24971995

岭回归与 Lasso 回归最大的区别在于岭回归引入的是 L2 范数惩罚项,Lasso 回归引入的是 L1 范数惩罚项,Lasso 回归能够使得损失函数中的许多 θ 均变成 0,这点要优于岭回归,因为岭回归是要所有的 θ 均存在的,这样计算量 Lasso 回归将远远小于岭回归。

因此 Lasso 是压缩传感领域的基础(参见压缩感知 http://scikit-learn.org/stable/auto_examples/applications/plot_tomography_l1_reconstruction.html#sphx-glr-auto-examples-applications-plot-tomography-l1-reconstruction-py)。

 
Qunar技术沙龙 更多文章 机器学习之 scikit-learn 开发入门(3) 一百行 python 代码告诉你国庆哪些景点爆满 AJAX 跨域请求方案详细介绍 第四届 Hackathon 大赛 CodeCode 小组 JSON java 泛型解析
猜您喜欢 7点见|阿里砸1000亿搞科研;腾讯称王者荣耀员工年终奖100个月工资太离谱;共享储物柜现身高校 金融壹账通移动技术周报(第五十四期) 唠唠功能测试 关于JAVA 辟谣 | 腾讯在支付大战中撤退?进击的步伐根本停不下来!