什么是过拟合

什么是过拟合?

过拟合(Overfitting)是指机器学习模型在训练数据上的表现非常好,但在新的、未见过的数据上表现较差的现象。简单来说,过拟合就是模型在训练集上“死记硬背”了所有样本的特征,失去了泛化能力。过拟合通常是由于模型过于复杂、训练数据过少或者数据非常嘈杂而引起的。

过拟合问题是实际应用中常见的问题,因为目标是找到一个能够对未见过的数据进行准确预测的模型,而非仅仅在训练数据上表现好。

算法原理

过拟合的原因在于模型的复杂度过高导致其对训练数据中的噪声或者异常样本过于敏感。为了解决过拟合问题,常用的方法是控制模型的复杂度。

在机器学习中,我们经常使用原始的数据(样本集)进行训练,并通过一个函数来表示模型,即模型通过函数对输入进行映射到输出。对于监督学习任务,我们可以使用损失函数来度量模型预测结果与实际结果之间的差距。在训练过程中,我们的目标是找到最佳的模型参数,使得损失函数的值最小化。

对于一个过拟合的模型,它在训练数据上的损失函数值会非常小,但在未见过的数据上的损失函数值则会较大。这是因为过拟合的模型对训练数据过于敏感,训练数据中的噪声或者异常样本被模型所记住,导致模型在新数据上产生错误的预测。

公式推导

为了更好地理解过拟合的原因,我们可以使用线性回归模型作为例子进行推导。假设我们有一个线性回归模型的假设函数表示为:

$$h_\theta(x) = \theta_0 + \theta_1x_1 + \theta_2x_2 + … + \theta_nx_n$$

其中,$x_1, x_2, …, x_n$ 是训练样本的特征,$\theta_0, \theta_1, …, \theta_n$ 是模型的参数。

我们使用最小二乘法来求解模型的最佳参数。最小二乘法的损失函数为:

$$J(\theta) = \frac{1}{2m}\sum_{i=1}^{m}(h_\theta(x^{(i)}) – y^{(i)})^2$$

其中,$m$ 是训练样本的数量,$x^{(i)}$ 是第 $i$ 个训练样本的特征向量,$y^{(i)}$ 是第 $i$ 个训练样本的目标值。

我们的目标是最小化损失函数 $J(\theta)$。通过梯度下降算法,我们可以逐步更新参数 $\theta$ 来寻找最优解。

计算步骤

以下是使用梯度下降算法来计算线性回归模型的参数的步骤:

  1. 初始化参数 $\theta$ 为一个随机值。
  2. 计算模型的预测值 $h_\theta(x^{(i)})$。
  3. 计算损失函数的梯度 $\frac{\partial J(\theta)}{\partial \theta}$。
  4. 使用学习率来更新参数:$\theta := \theta – \alpha \frac{\partial J(\theta)}{\partial \theta}$,其中 $\alpha$ 是学习率。
  5. 重复步骤 2-4 直到收敛或达到最大迭代次数。

复杂Python代码示例

下面是一个简单的线性回归模型的过拟合示例,使用了一个虚拟的数据集:

import numpy as np
import matplotlib.pyplot as plt

# 生成虚拟数据集
np.random.seed(0)
X = np.linspace(-5, 5, 100).reshape(-1, 1)
y = 0.5 artical cgpt2md_gpt.sh cgpt2md_johngo.log cgpt2md_johngo.sh cgpt2md.sh _content1.txt _content.txt current_url.txt history_url history_urls log nohup.out online pic.txt seo test.py topic_gpt.txt topic_johngo.txt topic.txt upload-markdown-to-wordpress.py urls X**2 + X + np.random.randn(100, 1)

# 添加高次特征
def add_high_order_features(X, degree):
 X_poly = np.concatenate([X**i for i in range(1, degree+1)], axis=1)
 return X_poly

X_poly = add_high_order_features(X, degree=10)

# 拟合模型
theta = np.linalg.inv(X_poly.T @ X_poly) @ X_poly.T @ y

# 绘制数据点
plt.scatter(X, y)

# 绘制拟合曲线
X_test = np.linspace(-5, 5, 100).reshape(-1, 1)
X_test_poly = add_high_order_features(X_test, degree=10)
y_pred = X_test_poly @ theta
plt.plot(X_test, y_pred, color='red')

plt.xlabel('X')
plt.ylabel('y')
plt.title('Polynomial Regression')
plt.show()

代码解释:

  1. 首先,我们使用 numpy 库生成了一个虚拟的数据集 Xy,其中 X 是输入特征,y 是目标值。
  2. 然后,我们定义了一个函数 add_high_order_features 来添加高次特征。在这个示例中,我们将特征 X 添加了 10 次方的高次特征。
  3. 接下来,我们使用最小二乘法求解出线性回归模型的参数 theta
  4. 最后,我们使用 matplotlib 库绘制了数据点和拟合曲线。

在这个示例中,我们通过添加高次特征来模拟过拟合的情况。我们可以看到,拟合曲线(红色曲线)过于贴近训练数据,在训练数据之外的区域预测效果较差,说明模型过拟合了训练数据。

注意:这只是一个简单的示例,实际中过拟合问题可能更复杂,需要结合其他方法进行调优,例如正则化、交叉验证等。

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/821964/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球