在机器学习领域,理解偏差(Bias)和方差(Variance)的概念对于构建有效的预测模型至关重要。本文将通过实例和代码实现,探讨如何在这两者之间取得平衡。
偏差指的是模型在训练过程中由于错误假设而产生的泛化误差。例如,如果假设数据是线性的,而实际上它是二次的,那么偏差就会产生。一个高偏差的模型很可能会欠拟合训练数据。
方差描述的是模型对训练数据中微小变化的敏感性。如果模型具有很高的自由度,比如高次多项式模型,那么它很可能具有高方差。一个高方差的模型很可能会过拟合训练数据。
当增加模型的复杂度时,通常会导致方差增加而偏差减少。相反,减少模型的复杂度会增加偏差而减少方差。因此,目标是找到低偏差和低方差的平衡点,这就是所谓的偏差-方差权衡。
想象一个飞镖靶,靶心代表完美预测的模型。当远离靶心时,预测的准确性就会降低。可以多次重复模型构建过程,每次飞镖的命中点代表模型的一个实现。如果训练数据分布良好,预测就会接近靶心;如果训练数据包含异常值或非标准值,预测就会很差。这些不同的实现导致飞镖靶上的散布点。
对于初学者来说,一个常见的诱惑是不断增加模型的复杂度,直到它很好地拟合训练集。然而,如果模型过于复杂以至于能够拟合所有训练点,那么它将无法预测新的测试点,即过拟合。
在一般立场上,可以用一个图表来展示模型复杂度与预测误差的关系。在X轴上,从左到右代表从低到高的模型复杂度;在Y轴上,代表某种预测误差。向左移动,得到高偏差但低方差;向右移动,得到低偏差但高方差。需要找到一个最佳的平衡点,如果偏离这个点,要么欠拟合,要么过拟合。
虽然不能计算特定算法的偏差-方差权衡值,但可以使用偏差、方差、不可约误差(数据的噪声)和偏差-方差权衡来帮助选择和配置模型。在某些情况下,可以估计它。
使用Sebastian Raschka的mlxtend
库中的bias_variance_decomp()
函数可以估计模型的偏差和方差。首先,需要安装mlxtend
库。
pip install mlxtend
from pandas import read_csv
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from mlxtend.evaluate import bias_variance_decomp
url = 'https://raw.githubusercontent.com/jbrownlee/Datasets/master/housing.csv'
dataframe = read_csv(url, header=None)
data = dataframe.values
X, y = data[:, :-1], data[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=101)
model = LinearRegression()
mse, bias, var = bias_variance_decomp(model, X_train, y_train, X_test, y_test, loss='mse', num_rounds=200, random_seed=1)
print('MSE: %.3f' % mse)
print('Bias: %.3f' % bias)
print('Variance: %.3f' % var)
MSE: 34.904
Bias: 33.438
Variance: 1.466