
介绍
在回归模型中,失败发生在模型产生的预测不准确时——即当MAE或RMSE等误差指标高时——或者当模型在部署后,无法很好地泛化到与训练或测试时不同的新数据上。虽然模型失败通常以这两种形式之一或两者兼有表现出来,但其根本原因可能更加多样和微妙。
本文探讨了一些回归模型可能表现不佳的常见原因,并概述了如何检测这些问题。同时,还附上了使用XGBoost(一种强大且可高度调整的基于集成的回归模型)的实用代码片段。尽管XGBoost很受欢迎且功能强大,但如果训练或评估不当,它也可能失败!
回归模型的判断要点
首先,让我们揭示一些回归模型失败的常见原因,描述每个原因并推荐如何诊断它们。
1. 欠拟合
当用于构建模型的训练数据在数量、质量或与预测目标标签相关的信息不足时,生成的模型过于简单,无法提供准确的预测,即使在与训练数据相似的例子上也是如此。这个常见问题称为欠拟合,很容易诊断:当训练集和测试集上的误差都高时就会出现。

欠拟合可视化
2. 过拟合
欠拟合的相反问题是,如其名字所示,过拟合。当模型过于“记住”训练数据,过度拟合,就像下面所示的情况一样,就会发生过拟合。当过拟合发生时,一个在训练样本上表现似乎非常出色的模型,在未来的、未见过的数据上表现要差得多。因此,低训练误差和高测试误差通常是一个强有力的指标,表明模型对训练数据过拟合。总之,记住训练示例而不是学习可靠的预测所依赖的模式和输入-输出关系,会导致一个模型在收到与之前见过的任何输入数据稍微不同的输入时就“迷失”了。

过拟合可视化
记住训练示例而不是学习可靠的预测所依赖的普遍模式和输入-输出关系,会导致一个模型,一旦它收到与之前见过的任何输入数据稍微不同的输入数据示例,它就会“迷失”。
3. 数据泄露
数据泄露发生在机器学习模型在训练时使用了在推理时无法获得的信息来预测目标变量。与过拟合类似,泄露会使模型在验证期间看起来非常准确,但一旦部署,其现实世界的性能通常会显著下降。
然而,与过拟合不同,这个问题更与训练和部署之间数据可用性或完整性不匹配有关——例如,当在训练时意外包含了未来或目标衍生的特征(例如,一旦检测到欺诈或可疑的房屋价格,对该列表采取的行动)。
数据泄露通常通过注意到验证错误不现实地低来诊断,这可能表明模型获得了不应有的信息:在生产中进行预测时无法获得的信息。
4. 噪音或无关特征
在包含大量特征的数据集中,通常会有一些特征对预测目标值没有信息或者甚至具有误导性。例如,在基于属性估计房屋价格的回归模型中,像房屋的年龄或面积这样的特征是相关的,而其他特征,比如外墙的油漆颜色,可能被认为对价格预测无关紧要。计算特征重要性和使用像SHAP这样的可解释性方法可以帮助确定数据集中的一些特征几乎没有或没有影响,从而可以简化模型而不降低准确性。
5. 数据预处理不足
缺失值、具有不同尺度的数值属性和原始的类别特征应根据其“估计”的与当前预测问题的相关性进行适当的预处理。如果未能这样做,并且忽视诸如缩放、缺失值填充等重要的数据预处理操作,也会影响模型性能。通过相关性分析、摘要统计或热图等数据检查和分析方法可以诊断与数据预处理不佳或不充分相关的问题,以揭示缺失值。
6. 错误的超参数
像XGBoost这样的模型在训练之前需要我们设置多个超参数,它假定我们 either拥有定义正确超参数设置的高水平专业知识,或者(更常见的)使用像交叉验证这样的验证方案进行超参数调整过程来找到最佳配置。为学习率、决策树深度等超参数设置错误的值会导致模型表现不佳。将您的特定超参数设置与默认模型设置进行比较,以验证您是否使用了适当的配置。
7. 数据不足
最后但同样重要的是,拥有太少的数据示例来学习可靠的预测模式或泛化到未来的数据本身就是一个问题——尽管它通常是欠拟合或过拟合的其他问题的原因之一。在使用更复杂的模型时,数据量尤为重要,因为这些模型通常无法从少量标记的示例中有效学习。
实际示例:使用XGBoost预测房价
我们将通过以下示例重新审视前面讨论中的某些见解,该示例使用公开的加州住房数据集(即 scikit-learn 库中可用的版本)训练回归模型来预测房价。
这段代码导入必要的模块,加载数据集,将预测特征与目标分离,并将数据示例分割成训练集和测试集:
from sklearn.datasets import fetch_california_housing
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
import xgboost as xgb
import numpy as np
import pandas as pd
data = fetch_california_housing()
X = pd.DataFrame(data.data, columns=data.feature_names)
y = data.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
我们将首先训练一个XGBoost模型,其超参数是随机(或故意不佳)配置的,稍后我们将使用它作为基准模型进行比较:
base_model = xgb.XGBRegressor(
n_estimators=10,
max_depth=1,
learning_rate=0.5,
random_state=42
)
base_model.fit(X_train, y_train)
y_pred_base = base_model.predict(X_test)
print("Baseline model RMSE:", np.sqrt(mean_squared_error(y_test, y_pred_base)))
如果你对决策树比较熟悉,你可能已经对<font style="color:rgb(85, 85, 85);">max_depth=1</font>的设置感到疑惑,但为了说明问题,我们展示了一个如何诊断问题的例子;因此,我们需要一些看起来有问题的东西。
产生的误差(RMSE)是0.7630064001489125:如果我们考虑到目标变量(房屋价值)以百万美元为单位,那么这个误差相当高。
现在,让我们转向一个具有更精心规划的超参数设置的模型,这个模型与数据集的性质和复杂性更好地对齐.
good_model = xgb.XGBRegressor(
n_estimators=300,
max_depth=6,
learning_rate=0.05,
subsample=0.8,
colsample_bytree=0.8,
random_state=42
)
good_model.fit(X_train, y_train)
y_pred_good = good_model.predict(X_test)
print("Good model RMSE:", np.sqrt(mean_squared_error(y_test, y_pred_good)))
该模型的RMSE显著下降至0.4533940039302877。尽管仍有可能进一步改进,但这相对于基准模型是一个巨大的进步。
在这个简短的例子中,我们比较了RMSEs来诊断性能问题,但其他诊断模型故障的方法可能包括:
最终思考
本文探讨了机器学习中回归模型可能无法良好表现的几种常见原因,从数据质量问题到模型配置定义不善。讨论特别关注诊断这些不同原因的方法,随后通过训练和比较两个XGBoost回归器来识别其中一个潜在问题的例子。
1295

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



