机器学习中的偏差和方差
Bias 和 variance 是机器学习中的两个重要概念,用于描述模型预测中误差的来源。Bias 指的是由于过度简化输入特征与输出变量之间的潜在关系而导致的误差。同时,variance 指的是由于对训练数据波动过于敏感而导致的误差。
在机器学习中,我们努力最小化 bias 和 variance,以构建能够在未见过数据上准确预测的模型。高 bias 模型可能过于简单,无法拟合训练数据。相反,高 variance 模型可能过度拟合训练数据,无法泛化到新数据。
一般来说,机器学习模型会表现出三种误差:bias、variance 和不可约误差。bias 和 variance 误差之间存在权衡关系。降低 bias 会导致 variance 增加,反之亦然。
什么是 Bias?
Bias 是平均预测值与实际值之间的差值。在机器学习中,bias(系统误差)发生在模型对数据做出错误假设时。
高 bias 模型无法很好地匹配训练数据和测试数据。这会导致训练数据和测试数据中的高误差。
而低 bias 模型能够很好地匹配训练数据(训练准确率高或训练误差小)。这会导致训练数据误差低,但测试数据误差高。
Bias 的类型
- High Bias − 高 bias 由于机器学习模型中的错误假设而发生。高 bias 模型无法捕捉训练数据中的隐藏模式。这会导致underfitting。这会导致underfitting。高 bias 的特征是高度简化的模型、underfitting,以及训练和测试数据中的高误差。
- Low Bias − 低 bias 模型能够捕捉训练数据中的隐藏模式。低 bias 会导致高 variance,并最终导致 overfitting。低 bias 通常由于 ML 模型过于复杂而发生。
下图展示了高 bias 和低 bias 误差的图形表示。
模型中 Bias 的示例
尝试拟合非线性数据的线性回归模型会表现出高 bias。高 bias 模型的示例包括 linear regression 和 logistic regression。低 bias 模型的示例包括 decision trees、k-nearest neighbors 和 support vector machines。
Bias 对模型性能的影响
高 bias 会导致训练数据集和测试数据集上的性能差。高 bias 模型无法泛化到新的未见过数据。
什么是 Variance?
Variance 是衡量一组观测值相对于均值的离散程度或分散程度的指标。它基本上衡量了一组数字相对于平均值的分散情况。在统计学和概率论中,variance 被定义为随机变量相对于样本均值的平方偏差的期望值。
在机器学习中,variance 是模型在不同数据集上的预测变异性。Variance 显示了当数据有轻微变化时,模型预测的变动程度。如果模型在训练数据和测试数据上的准确率差异很大,则该模型具有高 variance。
具有高 variance 的模型甚至可以拟合训练数据中的噪声,但缺乏对新未见过数据的泛化能力。
Variance 的类型
- High Variance − 高 variance 模型会捕捉噪声以及隐藏模式。这会导致 overfitting。高 variance 模型在训练准确率上很高,但在测试准确率上很低。高 variance 模型的一些特征是模型过于复杂、overfitting、在训练数据上误差低、在测试数据上误差高。
- Low Variance − 低 variance 的模型无法捕捉数据中的隐藏模式。低 variance 可能发生在数据量非常少或使用过于简化的模型时。低 variance 会导致 underfitting。
下图展示了高 variance 和低 variance 示例的图形表示。
模型中 Variance 的示例
一个具有许多分支的决策树完美拟合训练数据但在测试数据上拟合不佳的例子就是高 variance 的示例。高 variance 的示例包括:k-nearest neighbors、决策树和 support vector machines (SVMs)。
Variance 对模型性能的影响
高 variance 可能导致模型在训练数据上表现良好,但在测试数据上表现不佳。在训练过程中,高 variance 模型如此完美地拟合训练数据,以至于将噪声当作实际模式捕捉。高 variance 误差的模型被称为 overfitting 模型。
Bias-Variance 权衡
Bias-variance 权衡是在由 bias 引入的误差和由 variance 引入的误差之间找到平衡。随着模型复杂度的增加,bias 会减少,但 variance 会增加。然而,当我们降低模型复杂度时,bias 会增加,variance 会减少。因此,我们需要在 bias 和 variance 之间找到平衡,以最小化总预测误差。
如果机器学习模型在训练中具有高 bias 或高 variance,它在新未见过数据上的表现不会很好。一个好的模型不应具有高 bias 或高 variance。我们无法同时减少 bias 和 variance。当 bias 减少时,variance 会增加。因此,我们需要找到一个最优的 bias 和 variance,使得预测误差最小化。
在机器学习中,bias-variance 权衡很重要,因为具有高 bias 或高 variance 的模型。
图形表示
下图以图形方式表示了 bias 和 variance 之间的权衡。
在上述图中,X 轴表示模型复杂度,Y 轴表示预测误差。总误差是 bias 误差和 variance 误差之和。最优区域显示了 bias 和 variance 之间的平衡区域,展示了具有最小误差的最优模型复杂度。
数学表示
机器学习模型中的预测误差可以数学上表示为如下:
Error = bias2 + variance + irreducible error。
为了最小化模型预测误差,我们需要选择模型复杂度,使得这两种误差之间能够达到平衡。
Bias-variance 权衡的主要目标是找到 bias 和 variance(模型复杂度)的值,使得误差最小化。
平衡偏差和方差的技术
有不同的技术可以平衡偏差和方差,以实现最优的预测误差。
1. 减少高偏差
- 选择更复杂的模型 − 如上图所示,选择更复杂的模型可能会减少模型预测的偏差误差。
- 添加更多特征 − 添加更多特征可以增加模型的复杂性,从而更好地捕捉隐藏模式,减少模型的偏差误差。
- 减少正则化 − 正则化可以防止过拟合,但同时在减少方差的同时会增加偏差。因此,减少正则化参数或完全移除正则化可以减少偏差误差。
2. 减少高方差
- 应用正则化技术 − 正则化技术会对复杂模型添加惩罚,最终导致模型复杂性降低。复杂度较低的模型会表现出较小的方差。
- 简化模型复杂性 − 复杂度较低的模型具有较低的方差。您可以通过使用更简单的算法来减少方差。
- 添加更多数据 − 向数据集添加更多数据可以帮助模型表现更好,并显示出较小的方差。
- 交叉验证 − 交叉验证通过比较数据集的训练集和验证集上的性能来识别过拟合,这非常有用。
使用 Python 的偏差和方差示例
让我们使用 Python 编程语言实现一些实际示例。我们在这里提供了四个示例。前三个示例展示了不同程度的高/低偏差或方差。第四个示例展示了偏差和方差的最佳值。
高偏差示例
下面是一个使用 Python 实现的示例,说明如何使用 Boston Housing 数据集分析偏差和方差 −
import numpy as np
import pandas as pd
from sklearn.datasets import load_boston
boston = load_boston()
X = boston.data
y = boston.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2,
random_state=42)
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
lr = LinearRegression()
lr.fit(X_train, y_train)
train_preds = lr.predict(X_train)
train_mse = mean_squared_error(y_train, train_preds)
print("Training MSE:", train_mse)
test_preds = lr.predict(X_test)
test_mse = mean_squared_error(y_test, test_preds)
print("Testing MSE:", test_mse)
输出
输出显示了线性回归模型的训练和测试均方误差 (MSE)。训练 MSE 为 21.64,测试 MSE 为 24.29,这表明模型具有较高的偏差和中等方差。
Training MSE: 21.641412753226312 Testing MSE: 24.291119474973456
低偏差和高方差示例
让我们尝试一个多项式回归模型 −
from sklearn.preprocessing import PolynomialFeatures
poly = PolynomialFeatures(degree=2)
X_train_poly = poly.fit_transform(X_train)
X_test_poly = poly.transform(X_test)
pr = LinearRegression()
pr.fit(X_train_poly, y_train)
train_preds = pr.predict(X_train_poly)
train_mse = mean_squared_error(y_train, train_preds)
print("Training MSE:", train_mse)
test_preds = pr.predict(X_test_poly)
test_mse = mean_squared_error(y_test, test_preds)
print("Testing MSE:", test_mse)
输出
输出显示了 degree=2 的多项式回归模型的训练和测试 MSE。训练 MSE 为 5.31,测试 MSE 为 14.18,这表明与线性回归模型相比,该模型偏差较低但方差较高。
Training MSE: 5.31446956670908 Testing MSE: 14.183558207567042
低方差示例
为了降低方差,我们可以使用正则化技术,如 ridge regression 或 lasso regression。在下面的示例中,我们将使用 ridge regression −
from sklearn.linear_model import Ridge
ridge = Ridge(alpha=1)
ridge.fit(X_train_poly, y_train)
train_preds = ridge.predict(X_train_poly)
train_mse = mean_squared_error(y_train, train_preds)
print("Training MSE:", train_mse)
test_preds = ridge.predict(X_test_poly)
test_mse = mean_squared_error(y_test, test_preds)
print("Testing MSE:", test_mse)
输出
输出显示了 alpha=1 的 ridge regression 模型的训练和测试 MSE。与多项式回归模型相比,训练 MSE 为 9.03,测试 MSE 为 13.88,这表明模型方差较低但偏差略高。
Training MSE: 9.03220937860839 Testing MSE: 13.882093755326755
偏差和方差的最佳示例
我们可以通过进一步调整超参数 alpha 来找到偏差和方差的最佳平衡。来看一个示例 −
from sklearn.model_selection import GridSearchCV
param_grid = {'alpha': np.logspace(-3, 3, 7)}
ridge_cv = GridSearchCV(Ridge(), param_grid, cv=5)
ridge_cv.fit(X_train_poly, y_train)
train_preds = ridge_cv.predict(X_train_poly)
train_mse = mean_squared_error(y_train, train_preds)
print("Training MSE:", train_mse)
test_preds = ridge_cv.predict(X_test_poly)
test_mse = mean_squared_error(y_test, test_preds)
print("Testing MSE:", test_mse)
输出
输出显示了具有最优 alpha 值的 ridge regression 模型的训练和测试 MSE。
Training MSE: 8.326082686584716 Testing MSE: 12.873907256619141
训练 MSE 为 8.32,测试 MSE 为 12.87,这表明模型在偏差和方差之间达到了良好的平衡。