什么是正则化
正则化(Regularization)是机器学习中常用的一种技术,用于解决过拟合(Overfitting)的问题。过拟合是指在训练集上表现良好,但在未知数据集上表现差的现象。正则化通过在目标函数中添加一个正则项,限制模型的复杂度,从而降低过拟合的风险。
如何应用正则化
在许多机器学习算法中,我们可以通过在损失函数中加入正则化项,来控制模型的复杂度。以线性回归为例,使用L2正则化的线性回归模型可以表示为:
[
\min_{\theta} J(\theta) = \frac{1}{2m} \sum_{i=1}^{m}(h_{\theta}(x^{(i)}) – y^{(i)})^2 + \lambda\sum_{j=1}^{n}\theta_j^2
]
其中,(h_{\theta}(x^{(i)}))是预测值与真实值的误差,(\lambda)是正则化参数,(\theta_j)是模型的参数。
正则化项 (\lambda\sum_{j=1}^{n}\theta_j^2) 通过引入平方和乘以正则化参数 (\lambda),对模型的参数进行惩罚。该正则化项在训练模型时,会使得参数的值尽量接近于零,从而使模型尽量简单。
算法原理
L2正则化(也称为岭回归)是一种常用的正则化方法。通过在损失函数中加入模型参数的平方和,L2正则化可以有效地控制模型的权重大小,从而降低过拟合的风险。
L2正则化的目标函数可以表示为:
[
\min_{\theta} J(\theta) = \frac{1}{2m} \sum_{i=1}^{m}(h_{\theta}(x^{(i)}) – y^{(i)})^2 + \lambda\sum_{j=1}^{n}\theta_j^2
]
其中,(h_{\theta}(x^{(i)}))是预测值与真实值的误差,(\lambda)是正则化参数,(\theta_j)是模型的参数。
对上述目标函数进行最优化,可以得到参数 (\theta) 的最优解。计算过程包括计算损失函数的梯度,使用梯度下降法或其他优化算法来更新参数。
公式推导
为了推导L2正则化的最优解,我们可以使用梯度下降法来最小化目标函数。首先,计算损失函数关于参数 (\theta_j) 的梯度:
[
\frac{\partial J(\theta)}{\partial \theta_j} = \frac{1}{m} \sum_{i=1}^{m}(h_{\theta}(x^{(i)}) – y^{(i)})x^{(i)}_j + \frac{\lambda}{m}\theta_j
]
然后,使用梯度下降法更新参数 (\theta_j):
[
\theta_j := \theta_j – \alpha \frac{\partial J(\theta)}{\partial \theta_j}
]
其中,(\alpha) 是学习率。
计算步骤
- 初始化参数 (\theta),学习率 (\alpha),正则化参数 (\lambda)。
- 迭代计算损失函数的梯度,更新参数 (\theta)。重复该步骤直到达到停止条件。
- 使用训练好的参数 (\theta) 进行预测。
Python代码示例
import numpy as np
# 生成虚拟数据
X = np.random.rand(100, 3)
y = np.dot(X, np.array([1, 2, 3])) + np.random.randn(100)
# 添加一列常数项
X = np.column_stack((np.ones(len(X)), X))
# 定义正则化参数
lambda_val = 0.1
# 初始化参数
theta = np.zeros(X.shape[1])
# 定义损失函数
def loss_function(X, y, theta, lambda_val):
m = len(y)
h_theta = np.dot(X, theta)
error = h_theta - y
loss = (1 / (2 * m)) * np.sum(np.square(error)) + (lambda_val / (2 * m)) * np.sum(np.square(theta[1:]))
return loss
# 定义梯度函数
def gradient(X, y, theta, lambda_val):
m = len(y)
h_theta = np.dot(X, theta)
error = h_theta - y
gradient = (1 / m) * np.dot(X.T, error) + (lambda_val / m) * np.concatenate(([0], theta[1:]))
return gradient
# 定义梯度下降函数
def gradient_descent(X, y, theta, alpha, lambda_val, num_iterations):
for _ in range(num_iterations):
gradient = gradient(X, y, theta, lambda_val)
theta = theta - alpha * gradient
return theta
# 使用梯度下降法训练模型
alpha = 0.01
num_iterations = 1000
theta = gradient_descent(X, y, theta, alpha, lambda_val, num_iterations)
# 进行预测
X_test = np.random.rand(10, 3)
X_test = np.column_stack((np.ones(len(X_test)), X_test))
y_pred = np.dot(X_test, theta)
print("预测值:", y_pred)
代码解释:
- 生成100个样本,每个样本有3个特征。
- 将常数项1添加到特征矩阵中。
- 初始化参数、正则化参数、学习率。
- 定义损失函数,计算损失。
- 定义梯度函数,计算梯度。
- 定义梯度下降函数,迭代更新参数。
- 使用梯度下降法训练模型。
- 生成10个测试样本,并进行预测。
- 输出预测值。
原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/825593/
转载文章受原作者版权保护。转载请注明原作者出处!