前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【机器学习】--鲁棒性调优之L1正则,L2正则

【机器学习】--鲁棒性调优之L1正则,L2正则

作者头像
LhWorld哥陪你聊算法
发布2018-09-13 15:06:55
1.2K0
发布2018-09-13 15:06:55
举报

一、前述

鲁棒性调优就是让模型有更好的泛化能力和推广力。

二、具体原理

1、背景

第一个更好,因为当把测试集带入到这个模型里去。如果测试集本来是100,带入的时候变成101,则第二个模型结果偏差很大,而第一个模型偏差不是很大。

2、目的

鲁棒性就是为了让w参数也就是模型变小,但不是很小。所以引出了 L1和L2正则。

 L1和L2的使用就是让w参数减小的使用就是让w参数减小。

L1正则,L2正则的出现原因是为了推广模型的泛化能力。相当于一个惩罚系数。

3、具体使用

L1正则:Lasso Regression

L2正则:Ridge Regression

总结:

经验值 MSE前系数为1 ,L1 , L2正则前面系数一般为0.4~0.5 更看重的是准确性。

L2正则会整体的把w变小。

L1正则会倾向于使得w要么取1,要么取0 ,稀疏矩阵 ,可以达到降维的角度。

ElasticNet函数(把L1正则和L2正则联合一起):

总结:

1.默认情况下选用L2正则。

2.如若认为少数特征有用,可以用L1正则。

3.如若认为少数特征有用,但特征数大于样本数,则选择ElasticNet函数。

4、在保证正确率的情况下加上正则。

5、如果把lamda设置成0,就只看准确率。

6、如果把lamda设置大些,就看中推广能力。

7、L1倾向于使得w要么取1,要么取0 稀疏编码 可以降维

8、L2倾向于使得w整体偏小 岭回归 首选

 4、图示

左边是L1正则+基本损失函数

右边是L2正则+基本损失函数

中间部分是圆心,损失函数最小,与正则函数相交,则既要满足基本函数,也要满足L1,L2正则,则损失函数增大了。

w1,w2等等与基本函数相交,则w1,w2都在[0,1]之间。

三、代码演示

代码一:L1正则

# L1正则
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.linear_model import SGDRegressor


X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

lasso_reg = Lasso(alpha=0.15)
lasso_reg.fit(X, y)
print(lasso_reg.predict(1.5))

sgd_reg = SGDRegressor(penalty='l1')
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))

代码二:L2正则

# L2正则
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import SGDRegressor



X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

#两种方式第一种岭回归
ridge_reg = Ridge(alpha=1, solver='auto')
ridge_reg.fit(X, y)
print(ridge_reg.predict(1.5))#预测1.5的值
#第二种 使用随机梯度下降中L2正则
sgd_reg = SGDRegressor(penalty='l2')
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))

代码三:Elastic_Net函数

# elastic_net函数
import numpy as np
from sklearn.linear_model import ElasticNet
from sklearn.linear_model import SGDRegressor


X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
#两种方式实现Elastic_net
elastic_net = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic_net.fit(X, y)
print(elastic_net.predict(1.5))

sgd_reg = SGDRegressor(penalty='elasticnet')
sgd_reg.fit(X, y.ravel())
print(sgd_reg.predict(1.5))
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-03-31 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档