原文:
towardsdatascience.com/how-bias-and-variance-affect-your-model-a03b1c3dd6d1
引言
自从我开始转向数据科学以来,我就听说过著名的偏差与方差权衡。
但我学得足够多,可以继续我的学习,并且从未回头过多。我始终知道,一个高度偏颇的模型欠拟合数据,而一个高方差模型是过拟合,而且这些在训练机器学习模型时都不是好事情。
我也知道我们应该在这两种状态之间寻找平衡,这样我们就会有一个良好的拟合,或者一个能够很好地将模式推广到新数据的模型。
但我可能说我从未走得比那更远。我从未搜索或创建高度偏颇或高度变异的模型,只是为了看看它们实际上对数据做了什么,以及那些模型的预测是如何的。
当然,直到今天,因为这正是我们在这篇文章中要做的。让我们继续进行一些定义。
高偏差
过度简化 = 用锤子砸任何东西 | Google Gemini, 2024. gemini.google.com
偏差是我们模型的预测与我们要预测的真实值之间的差异。一个高度偏颇的模型欠拟合数据,未能捕捉到潜在的模式。
具有高偏差的模型在训练数据和测试数据上表现都较差。
-
模型行为:模型过度简化并错过了正确的关系。
-
类比:想象一下一个学生过度简化主题,跳过重要细节,在所有地方都得到一致的低分。
-
示例:遗漏关键信息,例如仅使用卧室数量预测房价,而忽略位置。
-
模型预测示例:如果真实模式是每增加一个单位就加 1,那么一个高偏差模型可能会总是加 0.5,或者更糟,根本不加任何东西,完全忽略输入。
让我们通过代码示例来看看。
# Imports
import numpy as np
import matplotlib.pyplot as plt
# Generating high bias data
x = np.linspace(0, 10, 50)
y = 2 * np.sin(x)
# Plot
plt.scatter(x, y, label="True Nonlinear Data")
plt.plot(x, 0.5 * x, color='g', label="High Bias Linear Model")
plt.legend()
plt.show()
这就是一个高度偏颇的模型的样子。我们试图将线性回归拟合到非线性数据。我们过度简化了模式,试图让一条线拟合到曲线上。
高偏差模型:试图用线拟合曲线
如果我们再向前一步,创建一个线性回归模型,然后进行一些预测,我们就会看到会发生什么。
from sklearn.linear_model import LinearRegression
import pandas as pd
# Fit
lm = LinearRegression().fit(x.reshape(-1, 1), y)
# Predict
preds = lm.predict(x.reshape(-1, 1))
# Performance
(pd
.DataFrame({'Actual': y,
'Predicted': preds,
'Difference %': (y-preds)/y})
.head(10)
.T
)
看看预测有多离谱。模型无法识别这些数据中的模式。
高度偏颇模型的预测
现在是时候理解具有高方差的模型了。
高方差
基于数据微小波动的不可预测结果 | Google Gemini, 2024.
方差是模型对不同的训练数据集预测的变异性。**它衡量的是如果训练数据发生变化,预测会改变多少。**高方差模型过度拟合了训练数据,捕捉到了噪声而不是一般模式。
一个高方差模型在训练数据上表现良好,但在未见过的数据上表现较差。
-
模型行为:模型对训练数据过于敏感,过度拟合。高方差表明模型过于复杂,过度拟合了数据。
-
类比:就像一个学生只记答案而不理解概念,在练习中表现很好,但在实际测试中表现不佳。
-
示例:捕捉了太多的噪声,比如试图预测股市,但错误地将随机波动视为趋势。
-
模型预测示例:如果真实模式是每增加一个单位就加 1,一个高方差模型可能会学习到加100,或者基于数据的微小波动而得出不可预测的值。
现在让我们编写一个示例代码。
# Imports
import numpy as np
import matplotlib.pyplot as plt
# Generating high variance data
x = np.linspace(0, 10, 50)
y = 2 * np.sin(x) + np.random.normal(0, 2, len(x)) # Adding noise
# Plot
plt.scatter(x, y, label="High Variance Data")
plt.plot(x, 2 * np.sin(x), color='r', label="True Pattern")
plt.legend()
plt.show()
具有高方差的模型非常嘈杂。注意噪声数据如何显著地围绕真实曲线波动,这使得模型在没有过度拟合的情况下学习正确的关联关系变得具有挑战性。
高方差模型:噪声数据在真实曲线周围显著波动。
让我们创建一个决策树模型,它因过度拟合而非常著名,并评估高方差模型的行为。
from sklearn.tree import DecisionTreeRegressor
from sklearn.model_selection import train_test_split
# Generate high variance data
np.random.seed(42)
x = np.linspace(0, 10, 100).reshape(-1, 1)
y_true = 2 * np.sin(x).ravel()
y_high_variance = y_true + np.random.normal(0, 3, len(x)) # Adding noise
# Split data into training and testing sets
x_train, x_test, y_train, y_test = train_test_split(x, y_high_variance,
test_size=0.2,
random_state=42)
# Fit a decision tree regressor (high variance model due to overfitting)
tree_high_variance = DecisionTreeRegressor(max_depth=None, random_state=42) # No depth limit increases variance
tree_high_variance.fit(x_train, y_train)
# Predict using the model
x_range = np.linspace(0, 10, 300).reshape(-1, 1) # Fine range for smooth predictions
y_pred = tree_high_variance.predict(x_range)
# Plot the data and model predictions
plt.figure(figsize=(10, 6))
plt.scatter(x_train, y_train, color='blue', label='Training Data', alpha=0.7)
plt.scatter(x_test, y_test, color='green', label='Test Data', alpha=0.7, marker='x')
plt.plot(x_range, y_pred, color='orange', label='High Variance Model Predictions', linewidth=2)
plt.plot(x, y_true, color='red', label='True Pattern', linewidth=2, linestyle='--')
plt.title("High Variance Model with Decision Tree")
plt.xlabel("X")
plt.ylabel("Y")
plt.legend()
plt.show()
结果将在下面显示。
高方差模型:过度拟合训练数据;在测试数据上表现不佳。
我们在之前的图片中看到数据过度拟合了训练数据,但在测试数据上表现不佳。让我们看看数字。
# Predictions Train set
train_preds = tree_high_variance.predict(x_train)
(pd
.DataFrame({'Actual': y_train,
'Predicted': train_preds,
'Difference %': 100*(y_train-train_preds)/y_train})
.head(10)
.T
)
# Predictions test set
preds = tree_high_variance.predict(x_test)
(pd
.DataFrame({'Actual': y_test,
'Predicted': preds,
'Difference %': 100*(y_test-preds)/y_test})
.head(10)
.T
)
如预期的那样,在训练集上的结果完全过度拟合。模型的准确率为 100%。
但它无法泛化模式,在测试集上的表现不佳。
折衷
为了解决这些问题,想法是找到一个在过于简单和过于复杂的模型之间的平衡点。
增加模型复杂性可以减少偏差,使模型更接近训练数据,但会增加方差,使模型对噪声更敏感。另一方面,简化模型可以减少方差,使模型对噪声的敏感性降低,并增加偏差,可能会错过真实模式。
类比
将偏差视为一个刚性的系统(如直尺)和方差视为一个灵活的系统(可弯曲的直尺)。
-
刚硬的尺子无法捕捉曲线(高偏差)。
-
弹性的尺子可能会因为微小的缺陷而弯曲过多,从而过于复杂化形状(高方差)。
理想的工具是那种平衡刚性和灵活性,以表示真实形状(数据中的模式)的工具。
在实践中
在实际操作中,我们可以做些什么来平衡这种权衡?
高偏差模型
-
使用更复杂的算法
-
交叉验证
-
特征工程
-
添加非线性项
-
微调超参数
-
使用提升集成方法(XGB、梯度提升),因为它通过迭代纠正错误来减少偏差。
高方差模型
-
简化模型
-
交叉验证
-
添加正则化
-
使用 Bagging **** 集成方法(随机森林),因为它通过平均预测来减少方差。
在你离开之前
这篇概念性文章对我们深入理解数据科学中这个重要主题至关重要。了解偏差与方差权衡是什么以及每种类型如何影响建模,是使我们能够相应地采取纠正措施的有价值知识。
每个建模决策——比如选择算法、正则化和超参数调整——都隐含着旨在平衡偏差和方差以最小化总误差的目标。这种平衡对于构建稳健和可泛化的机器学习模型至关重要。
**注意:**除非另有说明,所有图片均为作者所有。
跟随我 & 联系方式
如果你喜欢这个内容,请关注我的博客或通过社交媒体与我联系。你可以在我的网站上了解更多关于我的工作。
1499

被折叠的 条评论
为什么被折叠?



