1. Ridge Regression
上图的公式 +后面是惩罚项,用来保证泛化能力的;+ 前面是我们的损失函数,用来保证我们的拟合效果的,而α是一个参数,用来让你决定更看重正确性还是泛化性,|| | |这个代表加和,即w0+w1+…
对于泛化性和正确性的评估:
当我们有数据时,把它分为两部分,训练集和测试集,一般训练集比较多
正确性:通过模型对训练集里的数据求一下正确性,看拟合程度怎么样
泛化性:通过模型对测试集里的数据来看正确性怎么样,
代码实现1:
官网:https://scikit-learn.org/stable/modules/linear_model.html#ridge-regression
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import SGDRegressorX = 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]]))
print(ridge_reg.intercept_)
print(ridge_reg.coef_)
我们来看一下Ridge的参数:
alpha:就是惩罚项里的参数,用来决定更看重正确性还是泛化性
fit_intercept :截距,如果为true,则会产生w0
normalize: 是否归一化
max_inter:最大迭代次数
tol:阈值,就是用来控制梯度的,当梯度小于阈值后就收敛停止了,当到达最大迭代次数后,不管有没有小于阈值都会认为收敛了,停止了
solver:用什么方法
auto:根据你的数据自动为你选择最优的方法
svd:就是之前讲过的通过线性代数把答案解出来
sag:随机梯度下降
…还有几个方法,自己去看
结果:
从结果我们发现,这次没有x0,但是它还是把w0算出来了,这就是因为上面说的fit_intercept=True的作用
代码2:
import numpy as np
from sklearn.linear_model import Ridge
from sklearn.linear_model import SGDRegressorX = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
ridge_reg = SGDRegressor(penalty='l2')
ridge_reg.fit(X, y.ravel())
print(ridge_reg.predict([[1.5]]))
print(ridge_reg.intercept_)
print(ridge_reg.coef_)
我们来看一下SGDRegressor的参数:
loss=“squared_loss” 平方均值损失
SGDRegressor的方法可以做到和Ridge一样,只要指定penalty=" l2 ",它还可以做另三种,自己取源码中看啊
y.ravel()把列向量拉平变成行向量
结果:
2. Lasso
代码实现:也是有两种方法
import numpy as np
from sklearn.linear_model import Lasso
from sklearn.linear_model import SGDRegressorX = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)ridge_reg = Lasso(alpha=0.15)
ridge_reg.fit(X, y)
print(ridge_reg.predict([[1.5]]))
print(ridge_reg.intercept_)
print(ridge_reg.coef_)
ridge_reg = SGDRegressor(penalty='l1')
ridge_reg.fit(X, y.ravel())
print(ridge_reg.predict([[1.5]]))
print(ridge_reg.intercept_)
print(ridge_reg.coef_)
3. Elastic-Net
它就是一个模型,既包含l1,又包含l2,当你不知道用里正则化还是l2的时候可以用Elastic Net,实际上用l1还是l2取决于你的需求。
有个有意思的特点:l1 会使w有的接近于0,有的接近于1;l2使w整体偏小
上图的公式我们也能看出来它结合了Ridge 和 Lasso两个公式,其中ap决定 l1 的权重,a(1-p)/2 决定l2 的权重
代码实现:
import numpy as np
from sklearn.linear_model import ElasticNet
from sklearn.linear_model import SGDRegressorX = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)elastic_net = ElasticNet(alpha=0.0001, l1_ratio=0.15)
elastic_net.fit(X, y)
print(elastic_net.predict([[1.5]]))ridge_reg = SGDRegressor(penalty='elasticnet', n_iter=1000)
ridge_reg.fit(X, y.ravel())
print(ridge_reg.predict([[1.5]]))
4. 总结