机器学习-模型正则化(岭回归,LASSO,弹性网)


前言

解决模型中方差太大的主要方式:模型正则化(Regularization)
模型正则化主要是限制系数的参数
如多项式回归中方差太大,主要是由于模型太复杂,样本特征前的参数太大


一、岭回归

1、概念

示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
在这里插入图片描述

alpha是一个参数,即加入模型正则化的程度,若alpha等于0,则损失函数仍和之前的相同,相当于没有加入模型正则化,若alpha=无穷大,则相当于只考虑了theta的值,此时让损失函数尽可能的小,即此时alpha全为0,此时构造出来的模型去预测值应该是一个 常数。

注意:这里的alpha从1开始,因为theta0并不影响曲线的复杂程度,他只是影响曲线的高低

2、使用sklearn中的岭回归

alpha来调节正则化程度

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

x=np.random.uniform(-3.0,3.0,size=100)
X=x.reshape(-1,1)
y=0.5*x**2+x+2+np.random.normal(0,1,size=100)
x_train,x_test,y_train,y_test=train_test_split(X,y,random_state=10)
from sklearn.linear_model import Ridge
#定义岭回归的管道
def ridgeregression(degree,alpha):
    return Pipeline([
    ("poly",PolynomialFeatures(degree=degree)),
    ("sca_std",StandardScaler()),
    ("reg",Ridge(alpha=alpha))
])
#多项式回归的管道
def polyregressin(degree):
    return Pipeline([
    ("poly",PolynomialFeatures(degree=degree)),
    ("sca_std",StandardScaler()),
    ("reg",LinearRegression())
])
#绘制当前模型的曲线图
def plot_model(model):
    x1=np.linspace(-3,3,100).reshape(100,1)
    y1=model.predict(x1)
    plt.scatter(x,y)
    plt.plot(x1[:,0],y1,color='r')
    plt.axis([-3,3,0,6])
    plt.show()

1、多项式回归 完全没有正则化

pip_reg=polyregressin(degree=20)
pip_reg.fit(x_train,y_train)
y_predict=pip_reg10.predict(x_test)
plot_model(pip_reg10)
mean_squared_error(y_test,y_predict)

在这里插入图片描述

2、岭回归 degree=20,alpha=0.001

#让degree=20,alpha=0.001
ridge1_reg=ridgeregression(20,0.001)
ridge1_reg.fit(x_train,y_train)
y1_predict=ridge1_reg.predict(x_test)

plot_model(ridge1_reg)
mean_squared_error(y_test,y1_predict)

在这里插入图片描述

3、degree=20,aplha=1

ridge2_reg=ridgeregression(20,1)
ridge2_reg.fit(x_train,y_train)
y2_predict=ridge2_reg.predict(x_test)

plot_model(ridge2_reg)
mean_squared_error(y_test,y2_predict)

在这里插入图片描述

4、degree=20,alpha=10

ridge3_reg=ridgeregression(20,10)
ridge3_reg.fit(x_train,y_train)
y3_predict=ridge3_reg.predict(x_test)

plot_model(ridge3_reg)
mean_squared_error(y_test,y3_predict)

在这里插入图片描述

5、degree=20,alpha=100

ridge3_reg=ridgeregression(20,100)
ridge3_reg.fit(x_train,y_train)
y3_predict=ridge3_reg.predict(x_test)

plot_model(ridge3_reg)
mean_squared_error(y_test,y3_predict)

在这里插入图片描述

6、degree=20,alpha=10000 一条直线 则正则化过头

ridge4_reg=ridgeregression(20,100000)
ridge4_reg.fit(x_train,y_train)
y4_predict=ridge4_reg.predict(x_test)

plot_model(ridge4_reg)
mean_squared_error(y_test,y4_predict)

在这里插入图片描述

3、总结:

	通过上述例子,我们可以发现,单只使用多项式回归时,当degree较大时,
	方差太大,曲线太复杂,泛化能力弱,此时的mse较大。
	当使用岭回归时,不同的alpha值得到的曲线也不同,所以对于不同的数据
	我们要测试alpha值来得到更好的模型。
	当alpha=较大时,此时theta基本等于0,曲线接近一条直线。

二、LASSO Regularization

1.Lasso正则化

在这里插入图片描述

2、代码实现:

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
import numpy as np
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics import mean_squared_error
import matplotlib.pyplot as plt

x=np.random.uniform(-3.0,3.0,size=100)
X=x.reshape(-1,1)
y=0.5*x**2+x+2+np.random.normal(0,1,size=100)
x_train,x_test,y_train,y_test=train_test_split(X,y,random_state=10)
#多项式回归的管道
def polyregressin(degree):
    return Pipeline([
    ("poly",PolynomialFeatures(degree=degree)),
    ("sca_std",StandardScaler()),
    ("reg",LinearRegression())
])
#绘制当前模型的曲线图
def plot_model(model):
    x1=np.linspace(-3,3,100).reshape(100,1)
    y1=model.predict(x1)
    plt.scatter(x,y)
    plt.plot(x1[:,0],y1,color='r')
    plt.axis([-3,3,0,6])
    plt.show()
from sklearn.linear_model import Lasso
#定义岭回归的管道
def lassoregression(degree,alpha):
    return Pipeline([
    ("poly",PolynomialFeatures(degree=degree)),
    ("sca_std",StandardScaler()),
    ("reg",Lasso(alpha=alpha))
])
pip_reg=polyregressin(degree=20)
pip_reg.fit(x_train,y_train)
y_predict=pip_reg10.predict(x_test)
plot_model(pip_reg10)
mean_squared_error(y_test,y_predict)

在这里插入图片描述

1、degree=20,alpha=0.01

lasso1_reg=lassoregression(degree=20,alpha=0.01)
lasso1_reg.fit(x_train,y_train)
y1_predict=lasso1_reg.predict(x_test)
plot_model(lasso1_reg)
mean_squared_error(y_test,y1_predict)

在这里插入图片描述

2、degree=20,alpha=1.3

lasso2_reg=lassoregression(degree=20,alpha=1.3)
lasso2_reg.fit(x_train,y_train)
y2_predict=lasso2_reg.predict(x_test)
plot_model(lasso2_reg)
mean_squared_error(y_test,y2_predict)

在这里插入图片描述

3、degree=20,alpha=10

lasso3_reg=lassoregression(degree=20,alpha=10)
lasso3_reg.fit(x_train,y_train)
y3_predict=lasso3_reg.predict(x_test)
plot_model(lasso3_reg)
mean_squared_error(y_test,y3_predict)

在这里插入图片描述

三、两者比较

1、区别:

在这里插入图片描述
在这里插入图片描述

		我们可以发现岭回归与lasso的区别:
		当degree都为20时
		岭回归alpha=100时,它的曲线仍带有弧度但是却没那么复杂了,这证明系数都有在减小。
		在lasso中,当alpha=1.3时,虽然去曲线仍然是倾斜的,但是却接近于一条倾斜直线,这证明一部分系数已经变成了0.
		具体原因见下方

2、原因:

	看其梯度算法,看其是如何变为0求最小值的便可得知。

在这里插入图片描述

岭回归:theta是一起减小之后变为0的

在这里插入图片描述

	lasso是:挑选部分不重要的样本特征使其theta变为0 ,有减少样本特征的作用。

4、进一步拓展

1、

在这里插入图片描述

通过岭回归与lasso的比较,我们可以回顾之前的机器学习对应的指标
可以发现,虽然机器学习中有很多名词,但是其基本形式都是类似的

2、LP范数

在这里插入图片描述
在这里插入图片描述

当然也有L0范数,但是L0范数是在mse的基础上求非0theta的最小值,是一个NP问题,多项式复杂程度的非确定性问题,如果theta值很多,则计算很复杂
L0正则可以用L1来取代,因为L1是让有更多的theta为0,可以作为特征选择
在这里插入图片描述

3、弹性网

在这里插入图片描述

弹性网是结合了lasso正则与岭回归的优点,岭回归是让theta都变小,但是lasso是尽快的让theta的某些值变小,一般来说,优先使用岭回归,但是当系数太多时,岭回归计算时间长,但是lasso让某些系数变为0,若这些样本特征是有用的,那么就会造成极大误差,但是lasso计算时间比岭回归短。

弹性网结合了这两者的有点。

### 回答1: 可以通过使用 L1 或 L2 正则化或者 Dropout 来进行模型正则化。L1 正则化会导致权重中很多变为0,从而实现特征选择的目的;L2 正则化则自然地惩罚了大的权重值,从而使得所有参数都接近0。Dropout 则是一种在训练过程中随机忽略一部分神经元的技术,从而减少过拟合。 ### 回答2: 模型正则化是一种用于防止过拟合问题的技术,它通过在模型的损失函数中引入一项正则化项来限制模型的复杂度。在Python中,我们可以使用不同的正则化方法来实现模型正则化。 一种常用的正则化方法是L1正则化,也称为Lasso正则化。在Python中,我们可以使用Scikit-learn库中的Lasso模型来实现L1正则化Lasso模型通过最小化带有L1惩罚项的损失函数来拟合数据,该惩罚项是模型权重的绝对值之和乘以一个正则化参数。 另一种常用的正则化方法是L2正则化,也称为Ridge正则化。在Python中,我们可以使用Scikit-learn库中的Ridge模型来实现L2正则化。Ridge模型通过最小化带有L2惩罚项的损失函数来拟合数据,该惩罚项是模型权重的平方和乘以一个正则化参数。 除了L1和L2正则化,还有一种称为弹性络的正则化方法。在Python中,我们可以使用Scikit-learn库中的ElasticNet模型来实现弹性正则化弹性正则化结合了L1和L2惩罚项,通过最小化带有L1和L2惩罚项的损失函数来拟合数据。 总之,模型正则化是一种有效的防止过拟合问题的方法。在Python中,我们可以使用Scikit-learn库中的Lasso、Ridge和ElasticNet模型来实现不同类型的正则化。通过合理选择正则化参数,我们可以调整模型的复杂度,提高模型的泛化能力。 ### 回答3: 模型正则化是一种在机器学习中用来控制和减少模型复杂度的技术。它主要通过在模型的损失函数中添加一个正则化项来实现。 正则化的目的是避免过拟合,提高模型的泛化能力。过拟合是指模型在训练数据上表现良好,但在新数据上表现差的现象。过拟合通常是由于模型过于复杂,用于训练的数据量不足或特征选择有问题等原因导致的。 在Python中,常见的模型正则化方法有L1正则化和L2正则化。L1正则化是指在损失函数中添加模型参数的绝对值之和乘以一个系数λ,即λ * ||w||1。L1正则化可以使得一些模型参数变为0,从而实现特征选择和稀疏化。L2正则化是指在损失函数中添加模型参数的平方和乘以一个系数λ,即λ * ||w||2^2。L2正则化可以防止模型参数过大,使得模型更加稳定。 在Python中,我们可以使用scikit-learn库中的正则化方法来实现模型正则化。例如,对于逻辑回归模型,可以使用逻辑回归类中的penalty参数来选择L1或L2正则化方法,并使用C参数来控制正则化强度。另外,还可以使用正则化的线性回归模型,如岭回归LASSO回归模型正则化是一种常用且有效的方法,可以提高模型的泛化能力和稳定性。它在机器学习领域具有广泛的应用,尤其在高维特征和小样本问题中。在使用模型正则化时,需要根据具体问题选择合适的正则化方法和参数,以达到最佳的性能和健壮性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值