Press "Enter" to skip to content

在机器学习模型中寻找正确的平衡:理解欠拟合和过拟合

本文将从机器学习和深度学习的角度解释过拟合和欠拟合的基本概念。

Ag PIC在Unsplash上的照片

将欠拟合和过拟合视为问题

每个从事机器学习问题的人都希望他们的模型能够尽可能地工作得最优。但有时候模型可能无法按照我们期望的那样工作。它可能要么比理想的准确性更差,要么比理想的准确性更好。在机器学习中,这两种情况都被认为是一个问题。

有些人可能会想,准确性低于理想值可能被认为是一个问题,但是为什么我们也认为超过理想准确性是一个问题呢?

有时候我们的模型试图在无意义的东西中找到关系,比如一些不必要的特征或者数据中的一些噪音,这就是额外准确性的来源。让我们通过一个例子来理解这个问题。

如果我们正在训练一个预测个人工资的模型。对于这个问题,我们的数据有四个特征,即个人的姓名、教育程度、工作经验和技能。根据常识,我们知道个人的姓名不会影响到他的工资。但是尽管事实如此,如果我们将个人的姓名作为数据中的一个特征,我们的模型可能会试图在姓名和工资之间找到某种关系。这种关系可能会给我们的模型添加一些额外的准确性。这就导致了超过理想准确性的情况,在这种情况下,我们的模型被错误地训练了。

基本术语

在深入讨论这些主题之前,让我们先了解两种不同类型的错误,这对于理解欠拟合和过拟合是必要的。

  1. 偏差误差:偏差误差是我们使用训练数据和训练好的模型来发现的误差。换句话说,我们在使用用于训练模型的相同数据时发现了这个错误。误差可以是任何类型的错误,比如均方误差、平均绝对误差等。
  2. 方差误差:方差误差是我们使用测试数据和训练好的模型来发现的误差。同样,在这里,误差可以是任何类型的错误。尽管我们可以使用任何类型的错误来找到方差,但我们使用与偏差发现时相同的错误,因为这样我们可以比较偏差和方差的值。

请注意,我们训练模型的理想状态是具有低偏差和低方差。

在日常生活中,什么是过拟合和欠拟合?

假设你正在访问一个外国国家,出租车司机宰了你的钱。你可能会倾向于说这个国家的所有出租车司机都是贪婪的。这就是我们所说的过度概括。

过度概括可能会发生在我们训练的机器和深度学习模型中。在机器和深度学习的情况下,过度概括被称为模型的过拟合。

同样,欠概括被称为模型的欠拟合。

从机器学习的角度来看,过拟合是什么意思?

如果我们的模型具有低偏差和高方差,我们说我们的模型遭受过拟合。

过拟合发生在模型相对于训练数据的数量和噪声而言过于复杂的情况下。

过拟合问题的可能解决方案

  1. 通过以下方式简化模型:

选择参数较少的机器学习模型

减少用于训练机器学习模型的特征或列数

对模型进行约束(使用正则化方法)

2. 收集更多的训练数据。

3. 减少数据中的噪音。噪音可能是数据中的错误或者异常值的存在等。

4. 使用早停止

什么是欠拟合?

欠拟合是指机器学习模型无法捕捉独立特征和因变特征之间的关系。换句话说,在欠拟合的情况下,我们的模型会产生高偏差和高方差。这可能有几个原因。

欠拟合问题的可能解决方案

  1. 使用能够捕捉独立特征和因变特征之间关系的更复杂的模型。
  2. 放宽模型的约束条件,即减少正则化。
  3. 尝试获取更多的训练数据。
  4. 尝试增加模型训练的持续时间。可以通过训练更多的时期来实现。
  5. 尝试清理数据以减少噪音。

让我们通过一些图表来看看过拟合和欠拟合的情况

让我们使用红葡萄酒质量数据集来理解欠拟合和过拟合的概念。

欠拟合:

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snssns.set_style('darkgrid')from sklearn.model_selection import train_test_splitimport tensorflow.keras.layers as tflfrom tensorflow.keras.models import Model## 读取数据wine = pd.read_csv('wine.csv')## 将数据分为独立特征和因变特征X = wine.drop('quality',axis=1)y = wine['quality']## 将数据分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)## 创建模型input = tfl.Input(shape=X.shape[1:])hidden1 = tfl.Dense(6,activation='relu')(input)output = tfl.Dense(10, activation='softmax')(hidden1)model = Model(inputs=[input], outputs=[output])## 编译模型model.compile(optimizer='adam',loss='sparse_categorical_crossentropy', metrics=['accuracy'])## 使用训练集和测试集训练模型history = model.fit(X_train, y_train, epochs=150, validation_data=(X_test, y_test))## 可视化训练和测试准确性plt.plot(history.history['accuracy'],color='red',label='训练准确性')plt.plot(history.history['val_accuracy'],color='blue',label='测试准确性')plt.legend()plt.show()

在机器学习模型中寻找正确的平衡:理解欠拟合和过拟合 四海 第2张

观察上面的图表。我们可以看到训练模型在训练数据和测试数据上的准确性都不到55%,这相当低。因此,在这种情况下,我们的模型遇到了欠拟合问题。这是因为模型的简单性导致的。

import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport seaborn as snssns.set_style('darkgrid')from sklearn.model_selection import train_test_splitimport tensorflow.keras.layers as tflfrom tensorflow.keras.models import Model## 读取数据wine = pd.read_csv('wine.csv')## 将数据分为独立特征和因变特征X = wine.drop('quality',axis=1)y = wine['quality']## 将数据分为训练集和测试集X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y)## 创建模型input = tfl.Input(shape=X.shape[1:])hidden1 = tfl.Dense(100,activation='relu')(input)hidden2 = tfl.Dense(100, activation='relu')(hidden1)hidden3 = tfl.Dense(100, activation='relu')(hidden2)hidden4 = tfl.Dense(100, activation='relu')(hidden3)output = tfl.Dense(10, activation='softmax')(hidden4)model = Model(inputs=[input], outputs=[output])## 编译模型model.compile(optimizer='adam',loss='sparse_categorical_crossentropy', metrics=['accuracy'])## 使用训练集和测试集训练模型history = model.fit(X_train, y_train, epochs=150, validation_data=(X_test, y_test))## 可视化训练和测试准确性plt.plot(history.history['accuracy'],color='red',label='训练准确性')plt.plot(history.history['val_accuracy'],color='blue',label='测试准确性')plt.legend()plt.show()
过拟合

观察上面的图表后,我们可以得出结论:随着我们向左侧移动(即增加训练周期),两个图形之间的间隔在增大。这意味着随着我们增加训练周期,训练准确度在增加,而测试准确度没有增加。这种情况被认为是过拟合。这种模型在测试数据和新数据上都不具有良好的泛化能力。

我们需要以一种训练模型的方式,使其在训练数据和测试数据上都能达到足够的准确度。这种模型将处于欠拟合和过拟合之间的中间状态。

我希望你喜欢这篇文章。如果你对文章有任何想法,请告诉我。我非常欢迎任何有建设性的反馈。

与我在LinkedIn上联系。

给我发邮件至shivamshinde92722@gmail.com

祝你有美好的一天!

Leave a Reply

Your email address will not be published. Required fields are marked *