机器学习“傻瓜式”理解(11)模型泛化

上一节我们了解到,我们在机器学习领域要解决的主要问题便是高方差的问题,主要的解决的办法便是模型泛化,其功能的概括来说便是通过限制超参数的大小,来解决过拟合或者模型含有巨大的方差误差这样的问题。

岭回归(Ridge Regression)

岭回归也是模型正则化一种方式,通过加入模型正则化的方式来更好的解决模型过拟合的线性的产生。
目标函数
根数数学的常识,我们拟合住的模型的上下抖动的幅度主要受参数的影响,因此以多项式回归为例,我们加入的模型正则化正好可以平衡这一部分。
加入的模型正则化为:
在这里图片描述
解释:上面的阿尔法其实便是我们引入的超参数,主要的作用就是用来平衡新的目标损失函数的大小。如果阿尔法等于0,那么就相当于我们没有引入模型正则化,但是如果阿尔法等于无穷,相应地,为了平衡损失函数的大小,我们需要进行使得我们的theta的平方尽可能的小才可以。
实例查看
模拟数据集进行查看:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split

np.random.seed(666)
x = np.random.uniform(-3,3,size = 100)
X = x.reshape(-1,1)
y = 0.5 * x + 3. + np.random.normal(0, 1, size=100)

X_train,X_test,y_train,y_test = train_test_split(X,y)

plt.scatter(x,y)
plt.show()

散点图显示:
在这里插入图片描述
使用岭回归以及多项式管道进行调参,来查看模型的泛化能力。
首先封装一个拟合住的模型曲线:

# 绘制模型曲线
def plot_curve(model):
    X_plot = np.linspace(-3,3,100).reshape(-1,1)
    y_plot = model.predict(X_plot)

    plt.scatter(x,y)
    plt.plot(X_plot[:,0],y_plot,color='r')
    plt.axis([-3,3,0,6])
    plt.show()

使用管道的方式

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import PolynomialFeatures
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge

def ridgeRegression(degree,alpha):
	return Pipeline([
		('poly',PolynomialFeatures(degree=degree)),
		('std',StandardScaler()),
		('ridge',Ridge(alpha=alpha))
	])

分情况讨论:degree=20,a = 0.0001

ridge1_reg = RidgeRegression(20, 0.0001)
ridge1_reg.fit(X_train, y_train)

y1_predict = ridge1_reg.predict(X_test)
mean_squared_error(y_test, y1_predict)
# 输出:1.323349275406402(均方误差)

plot_model(ridge1_reg)

在这里插入图片描述分情况讨论:degree=20,a= 1

ridge2_reg = RidgeRegression(20, 1)
ridge2_reg.fit(X_train, y_train)

y2_predict = ridge2_reg.predict(X_test)
mean_squared_error(y_test, y2_predict)
# 输出:1.1888759304218448(均方误差)

plot_model(ridge2_reg)

在这里插入图片描述
分情况讨论:degree=20、alpha=1000000(相当于无穷大)

ridge4_reg = RidgeRegression(20, 1000000)
ridge4_reg.fit(X_train, y_train)

y4_predict = ridge4_reg.predict(X_test)
mean_squared_error(y_test, y4_predict)
# 输出:1.8404103153255003

plot_model(ridge4_reg)

在这里插入图片描述
通过上图可以看出,当阿尔法无限大的时候,只有后面的模型正则化在起着作用,因为为了平衡,theta必须无限接近于0

LASSO回归

LASSO回归与岭回归相同,其主要的目的是主要是解决模型的过拟合问题或者模型含有巨大的方差的问题。
对于LASSO回归的实现原理,与岭回归实现的原理相同,只不过特殊点在于添加的代数式不同。
在这里插入图片描述
后续的实验与前面的岭回归实现的步骤相同,只需要将Ridge处修改为Lasso.并且超参数还是degree和alpha。
LASSO的特点: 趋向于使得一部分theta的值变为0,也就是说Lasso认为theta等于0的特征是完全没有用的,因此我们可以使用Lasso做特征选择用,但是有些时候也会导致不准确,如果我们想要追求准确程度,ridge回归更合适。

L1 & L2 & 弹性网络

由上面所讲的,两种回归的方式都用于解决模型的过拟合或者模型过度复杂的问题,但是通过下面的图片,我们可以知道很多东西背后的数学原理都是想通的。
在这里插入图片描述
因此,我们变引出了两种正则:
在这里插入图片描述
但是两种正则项互有利弊,于是弹性网络提出,它综合了两种正则项。
在这里插入图片描述
r是新添加的一个超参数,用来平衡两个正则项之间的比例。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章