Machine Learning 简明教程

Machine Learning - Bias and Variance

偏差和方差是机器学习中两个重要的概念,它们描述了模型预测中错误的来源。偏差是指由于过度简化输入特征和输出变量之间的潜在关系而导致的错误,而方差是指由于对训练数据中的波动过于敏感而导致的错误。

在机器学习中,我们会努力最小化偏差和方差,以构建一个能够准确预测看不见的数据的模型。偏差较大的模型可能过于简单并欠拟合训练数据,而方差较大的模型可能过度拟合训练数据并且无法泛化到新数据。

Example

下面是 Python 中的一个实现示例,演示了如何使用波士顿住房数据集分析偏差和方差 −

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)

Output

输出显示了线性回归模型的训练和测试均方误差 (MSE)。训练 MSE 为 21.64,测试 MSE 为 24.29,表示该模型具有中等水平的偏差和方差。

Training MSE: 21.641412753226312
Testing MSE: 24.291119474973456

Reducing Bias and Variance

为了减少偏差,我们可以使用更多复杂的模型,它们可以捕捉数据中的非线性关系。

Example

我们尝试一个多项式回归模型 −

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

Example

为了减少方差,我们可以使用正则化技术,如 ridge regressionlasso 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 的岭回归模型的训练和测试 MSE。与多项式回归模型相比,训练 MSE 为 9.03,测试 MSE 为 13.88,表明该模型具有较低的方差但稍高的偏差。

Training MSE: 9.03220937860839
Testing MSE: 13.882093755326755

Example

我们可以进一步调整超参数 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 值的岭回归模型的训练和测试 MSE。

Training MSE: 8.326082686584716
Testing MSE: 12.873907256619141

训练 MSE 为 8.32,测试 MSE 为 12.87,表明该模型在偏差和方差之间取得了良好的平衡。