上篇地址:机器学习正则化算法的总结,建议收藏。(上篇)-CSDN博客
.
.
.
.
.
.
.
.
.纯干货
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
-
L1 正则化
-
L2 正则化
-
弹性网络正则化
-
Dropout 正则化
-
贝叶斯Ridge和Lasso回归
-
早停法
-
数据增强
上篇讲了前五种,这篇记录后两种。
直接步入主题,
6、早停法(Ear
早停法(Early Stopping)是一种用于防止模型过拟合的正则化技术。它通过在训练过程中监测验证误差,并根据验证误差的变化来确定何时停止训练模型,以避免过拟合。
早停法采用以下步骤:
-
将数据集划分为训练集和验证集。
-
初始化模型参数。
-
在每个训练迭代中,计算训练误差并更新模型参数。
-
在每个训练迭代后,计算验证误差。
-
如果验证误差开始上升,则停止训练,并使用具有最低验证误差的模型参数作为最终模型。
公式:
早停法的目标是在验证误差开始上升之前找到最佳模型,即训练误差和验证误差同时达到较小值的点。
下面是一个Python实现的案例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
# 生成示例数据
np.random.seed(42)
X = np.linspace(-5, 5, num=100).reshape(-1, 1)
y = 2 * X + np.random.normal(0, 1, size=(100, 1))
# 划分训练集和验证集
X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建线性回归模型对象
model = LinearRegression()
# 记录训练误差和验证误差
train_errors = []
val_errors = []
# 拟合数据并记录误差
for i in range(1, len(X_train)):
model.fit(X_train[:i], y_train[:i])
y_train_pred = model.predict(X_train[:i])
y_val_pred = model.predict(X_val)
train_errors.append(np.mean((y_train_pred - y_train[:i]) ** 2))
val_errors.append(np.mean((y_val_pred - y_val) ** 2))
# 绘制优化复杂图形
fig, ax = plt.subplots()
ax.plot(train_errors, label="Train Error")
ax.plot(val_errors, label="Validation Error")
best_epoch = np.argmin(val_errors)
ax.axvline(x=best_epoch, linestyle="--", color="red", label="Early Stopping")
ax.set_xlabel("Epoch")
ax.set_ylabel("Mean Squared Error")
ax.set_title("Early Stopping")
ax.legend()
plt.show()
代码证,使用了线性回归模型,并在每个训练迭代中记录了训练误差和验证误差。通过绘制训练误差和验证误差的曲线,以及早停法的标记点,可以更加直观地观察到模型的优化过程和选择最佳模型时的判定点。
这样,使用优化复杂的图形可以更好地理解早停法算法模型的效果。
7、数据增强
数据增强正则化是一种常用的正则化技术,它通过对训练数据进行随机变换或扩充来增加数据集的多样性。这种方法可以帮助模型更好地泛化,并减轻过拟合问题。
数据增强正则化的步骤如下:
1、对训练数据进行一系列随机的变换操作,例如旋转、平移、缩放、裁剪等。
2、将变换后的样本添加到原始训练数据集中。
3、使用经过增强的数据集进行模型训练。
数据增强正则化的目标是通过增加数据集的多样性,使模型能够更好地适应不同的输入情况,并提高其泛化能力。
由于数据增强正则化是一种基于随机变换的方法,没有明确的公式表达。
代码示例:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.linear_model import LogisticRegression
# 生成示例数据集
np.random.seed(42)
X, y = make_moons(n_samples=200, noise=0.1)
# 创建Logistic回归模型对象
model = LogisticRegression()
# 绘制原始数据分布
fig, ax = plt.subplots()
ax.scatter(X[:, 0], X[:, 1], c=y, cmap="bwr", edgecolors='k')
ax.set_xlabel("X1")
ax.set_ylabel("X2")
ax.set_title("Original Data Distribution")
# 数据增强
n_transforms = 50
augmented_X = []
augmented_y = []
for i in range(n_transforms):
transformed_X = X + np.random.normal(0, 0.05, size=X.shape)
augmented_X.append(transformed_X)
augmented_y.append(y)
augmented_X = np.concatenate(augmented_X, axis=0)
augmented_y = np.concatenate(augmented_y, axis=0)
# 绘制经过数据增强后的数据分布
fig, ax = plt.subplots()
ax.scatter(augmented_X[:, 0], augmented_X[:, 1], c=augmented_y, cmap="bwr", edgecolors='k')
ax.set_xlabel("X1")
ax.set_ylabel("X2")
ax.set_title("Data Distribution after Augmentation")
# 使用经过增强的数据进行模型训练
model.fit(augmented_X, augmented_y)
# 绘制决策边界
x_min, x_max = X[:, 0].min() - 0.5, X[:, 0].max() + 0.5
y_min, y_max = X[:, 1].min() - 0.5, X[:, 1].max() + 0.5
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02),
np.arange(y_min, y_max, 0.02))
Z = model.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
fig, ax = plt.subplots()
ax.contourf(xx, yy, Z, alpha=0.8, cmap="bwr")
ax.scatter(X[:, 0], X[:, 1], c=y, cmap="bwr", edgecolors='k')
ax.set_xlabel("X1")
ax.set_ylabel("X2")
ax.set_title("Decision Boundary")
plt.show()
在代码示例中,我们使用了make_moons
函数生成了一个月亮形状的二分类数据集。然后,通过对原始数据进行随机的高斯扰动(np.random.normal
),生成了多个变换后的样本,并将这些样本添加到原始数据集中。最后,使用经过增强的数据集训练了Logistic回归模型,并绘制了决策边界。
通过增强后的数据集,模型能够更好地捕捉到数据的不同特征和变化,使得模型能够更好地区分两个类别。而绘制的决策边界显示了模型在增强后的数据上学到的决策规则。
这种可视化方法有助于理解数据增强正则化的作用,以及如何通过引入多样性来改善模型的泛化能力。
实际应用中可能需要根据具体情况进行调整或使用其他数据增强技术。同时,数据增强正则化算法模型有许多变体和技巧,可以根据具体任务和需求进行调整和改进。