楼主: 时光人
2803 1

python机器学习: lasso回归 [推广有奖]

  • 3关注
  • 34粉丝

已卖:165份资源

院士

23%

还不是VIP/贵宾

-

威望
1
论坛币
26913 个
通用积分
429.8724
学术水平
95 点
热心指数
109 点
信用等级
91 点
经验
39970 点
帖子
1630
精华
3
在线时间
580 小时
注册时间
2019-2-25
最后登录
2025-5-6

楼主
时光人 学生认证  发表于 2019-9-10 13:32:08 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币

CDA数据分析:数据科学、人工智能从业者的在线大学。
数据科学(Python/R/Julia)数据分析、机器学习、深度学习


上节我们介绍了线性回归和Ridge回归,并介绍了两种回归的优缺点。本节我们重点学习下lasso回归的方法和优缺点。

和岭回归(Ridge)回归一样,lasso回归也是一种正则化的线性回归,且也是约束系数使其接近于0,不过其用到的方法不同,岭回归用到的是L2正则化,而lasso回归用到的是L1正则化(L1是通过稀疏参数(减少参数的数量)来降低复杂度,即L1正则化使参数为零,L2是通过减小参数值的大小来降低复杂度,即L2正则化项使得值最小时对应的参数变小)。

下面我们来看将lasso正则化运用到波士顿房价数据集上的效果,对应代码如下:

  1. import mglearn

  2. from sklearn.model_selection import train_test_split

  3. import matplotlib.pyplot as plt

  4. x, y = mglearn.datasets.load_extended_boston

  5. x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0)

  6. from sklearn.linear_model import Lasso

  7. lasso = Lasso.fit(x_train, y_train)

  8. print("Training set score: {:.2f}".format(lasso.score(x_train, y_train)))

  9. print("Test set score: {:.2f}".format(lasso.score(x_test, y_test)))

  10. print("Number of features used: {}".format(np.sum(lasso.coef_!=0)))

  11. #我们增大max_iter的值,否则模型会警告我们,应该增大max_iter

  12. #下面代码则是打印各种alpha参数下的预测分数

  13. lasso01 = Lasso(alpha=0.1, max_iter=100000).fit(x_train, y_train)

  14. lasso001 = Lasso(alpha=0.01, max_iter=100000).fit(x_train, y_train)

  15. print("training set score: {:.2f}".format(lasso001.score(x_train, y_train)))

  16. print("Test set score: {:.2f}".format(lasso001.score(x_test, y_test)))

  17. print("Number of features used: {}".format(np.sum(lasso001.coef_!=0)))

  18. lasso00001 = Lasso(alpha=0.0001, max_iter=100000).fit(x_train, y_train)

  19. print("training set score: {:.2f}".format(lasso00001.score(x_train, y_train)))

  20. print("Test set score: {:.2f}".format(lasso00001.score(x_test, y_test)))

  21. print("Number of features used: {}".format(np.sum(lasso00001.coef_!=0)))

  22. #绘制对应的图形

  23. plt.plot(lasso.coef_, 's', label="Lasso alpha=1")

  24. plt.plot(lasso001.coef_, '^', label="Lasso alpha=0.01")

  25. plt.plot(lasso00001.coef_, 'v', label="Lasso alpha=0.0001")

  26. plt.plot(lasso01.coef_, 'v', label="Ridge alpha=0.1")

  27. plt.legend(ncol=2, loc=(0, 1.05))

  28. plt.ylim(-25, 25)

  29. plt.xlabel("Coefficient index")

  30. plt.ylabel("Cofficient magnitude")
复制代码

上述代码运行结果如下:

不同alpha值得lasso和岭回归(ridge)的系数比较

由上述代码我们可以看出,当使用特征数比较少时,lasso的训练集和测试集表现都很差,这表示存在欠拟合。通过调整alpha值,可以控制系数趋向于0的强度。当我们将alpha值变小,我们可以拟合一个比较复杂的模型,此时,训练集和测试集反而表现得更好,当我们将特征值从4个上升到33个是,训练集和测试集已经表现得比较好了。不过,如果将alpha值设置得太小的时候,训练集就会远大于测试集了,这是就出现了过拟合的情况。

在实践中,岭回归(Ridge)和lasso我们首选岭回归。不过如果特征数过多,但是其中只有几个特征是重要的,则选择lasso效果会更好。同时,lasso由于其模型更加便于理解(因为它只选择一部分输入特征),所以有时候用lasso回归效果也不错。当然,如果我们能够将两者进行优势互补,则会达到更佳的效果,在scikit-learn中提过了ElasticNet类,就是结合了这两种回归的惩罚项。在实践中效果会更好,不过需要同时调节L1和L2正则化参数,在以后章节中我们会介绍到。


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:python LASSO 机器学习 scikit-learn coefficient

回帖推荐

tmdxyz 发表于2楼  查看完整内容

谢谢好贴!
已有 1 人评分经验 收起 理由
yunnandlg + 20 精彩帖子

总评分: 经验 + 20   查看全部评分

沙发
tmdxyz 发表于 2019-9-11 01:27:56
谢谢好贴!

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-21 15:37