自动模型选择算法

机器算法验证 特征选择 模型选择 aic 逐步回归 常问问题
2022-01-15 11:20:28

我想实现一个自动模型选择的算法。我正在考虑进行逐步回归,但任何事情都可以(尽管它必须基于线性回归)。

我的问题是我找不到方法或开源实现(我在 java 中工作)。我想到的方法是这样的:

  1. 计算所有因子的相关矩阵
  2. 选择彼此相关性较低的因素
  3. 删除具有低 t-stat 的因素
  4. 添加其他因素(仍然基于 2. 中发现的低相关因素)。
  5. 重复几次,直到某个标准(例如 AIC)超过某个阈值或不能或我们找不到更大的值。

我意识到有一个 R 实现(stepAIC),但我发现代码很难理解。我也找不到描述逐步回归的文章。

4个回答

我认为这种方法是错误的,但如果我解释原因可能会更有帮助。在给定大量变量的一些信息的情况下,想知道最好的模型是可以理解的。此外,这是一种人们似乎经常发现自己的情况。此外,许多关于回归的教科书(和课程)都包含逐步选择方法,这意味着它们必须是合法的。然而不幸的是,它们并非如此,而且这种情况和目标的配对很难成功导航。以下是自动逐步模型选择过程的问题列表(归属于 Frank Harrell,并从此处复制):

  1. 它产生的 R 平方值严重偏高。
  2. 打印输出中每个变量旁边引用的 F 和卡方检验没有声称的分布。
  3. 该方法产生了错误狭窄的效果和预测值的置信区间;参见奥特曼和安徒生 (1989)。
  4. 它产生的 p 值没有正确的含义,对它们进行正确的校正是一个难题。
  5. 它给出了需要收缩的有偏回归系数(剩余变量的系数太大;参见 Tibshirani [1996])。
  6. 在存在共线性的情况下存在严重问题。
  7. 它基于旨在用于检验预先指定的假设的方法(例如,嵌套模型的 F 检验)。
  8. 增加样本量并没有太大帮助;参见 Derksen 和 Keselman (1992)。
  9. 它让我们不去思考问题。
  10. 它使用大量纸张。

问题是,这些程序有什么不好/为什么会出现这些问题?大多数上过基本回归课程的人都熟悉回归均值的概念,所以我用它来解释这些问题。(虽然一开始这似乎离题,请耐心等待,我保证它是相关的。)

想象一下选拔赛第一天的高中田径教练。三十个孩子出现了。这些孩子有一定程度的内在能力,教练和其他任何人都无法直接接触到这些能力。结果,教练做了他唯一能做的事情,那就是让他们都跑100m冲刺。时间大概是他们内在能力的衡量标准,因此被认为是这样的。但是,它们是概率性的;一个人的表现有一部分是基于他们的实际能力,而一部分是随机的。想象一下真实情况如下:

set.seed(59)
intrinsic_ability = runif(30, min=9, max=10)
time = 31 - 2*intrinsic_ability + rnorm(30, mean=0, sd=.5)

下图显示了第一场比赛的结果以及教练对孩子们的评价。

第一场比赛

请注意,按比赛时间划分孩子会导致他们的内在能力重叠——这一事实至关重要。在表扬了一些人,并对一些人大喊大叫(就像教练经常做的那样)之后,他让他们再次跑步。以下是第二场比赛的结果以及教练的反应(根据上面的同一模型模拟):

第二场比赛

请注意,他们的内在能力是相同的,但时间相对于第一场比赛有所反弹。从教练的角度来看,他大喊大叫的人往往会有所改善,而他称赞的人往往会变得更糟(我根据维基页面上列出的卡尼曼引文改编了这个具体的例子),尽管实际上回归均值是一个简单的数学教练根据部分随机的测量结果为球队选择运动员这一事实的结果。

现在,这与自动(例如,逐步)模型选择技术有什么关系?基于同一数据集开发和确认模型有时称为数据挖掘. 尽管变量之间存在一些潜在的关系,并且预计更强的关系会产生更高的分数(例如,更高的 t 统计量),但这些都是随机变量,实现的值包含错误。因此,当您根据具有更高(或更低)的已实现值来选择变量时,它们可能是因为它们的潜在真实值、错误或两者兼而有之。如果你以这种方式前进,你会像第二场比赛后的教练一样感到惊讶。无论您是根据高 t 统计量还是低相关性来选择变量,这都是正确的。的确,使用 AIC 比使用 p 值更好,因为它会降低模型的复杂性,但 AIC 本身就是一个随机变量(如果您多次运行研究并拟合相同的模型,AIC 会像其他一切)。很遗憾,

我希望这是有帮助的。

查看 R 中的caret包。它将帮助您交叉验证逐步回归模型(使用method='lmStepAIC'or method='glmStepAIC'),并可能帮助您了解这些类型的模型如何往往具有较差的预测性能。此外,您可以使用findCorrelationcaret 中的函数来识别和消除共线变量,并使用rfecaret 中的函数来消除具有低 t 统计量的变量(使用rfeControl=rfeControl(functions=lmFuncs))。

但是,正如前面的答案中提到的,这些变量选择方法可能会给您带来麻烦,特别是如果您以迭代方式执行它们。绝对确定您在完全保留的测试集上评估您的表现。在您对算法感到满意之前,甚至不要查看测试集!

最后,使用带有“内置”特征选择的预测模型可能会更好(也更简单),例如岭回归、套索或弹性网络。具体来说,尝试method=glmnet插入符号的参数,并将该模型的交叉验证准确性与参数进行比较method=lmStepAIC我的猜测是,前者会给你更高的样本外准确度,你不必担心实现和验证你的自定义变量选择算法。

我完全同意@gung 提出的问题。也就是说,实际上,模型选择是一个需要真正解决的真正问题。这是我将在实践中使用的东西。

  1. 将数据拆分为训练集、验证集和测试集。
  2. 在您的训练集上训练模型。
  3. 使用预测 RMSE 等指标测量验证集上的模型性能,并选择具有最低预测误差的模型。
  4. 根据需要设计新模型,重复步骤 2-3。
  5. 报告模型在测试集上的表现。

举一个在现实世界中使用这种方法的例子,我相信它是在 Netflix Prize 比赛中使用的。

要回答这个问题,有几种选择:

  1. AIC/BIC 的所有子集

  2. 逐步按 p 值

  3. AIC/BIC 逐步

  4. 正则化,例如 LASSO(可以基于 AIC/BIC 或 CV)

  5. 遗传算法(GA)

  6. 其他的?

  7. 使用非自动的、以理论(“主题知识”)为导向的选择

下一个问题是哪种方法更好。这篇论文 (doi:10.1016/j.amc.2013.05.016) 表明“所有可能的回归”对他们提出的新方法给出了相同的结果,并且逐步更糟。他们之间有一个简单的遗传算法。本文 (DOI:10.1080/10618600.1998.10474784) 将惩罚回归 (Bridge, Lasso 等) 与“跳跃式”(似乎是一种详尽的搜索算法但速度更快) 进行了比较,并发现“桥模型与来自跨越式方法的子集选择”。这篇论文 (doi:10.1186/1471-2105-15-88) 表明 GA 优于 LASSO。这篇论文 (DOI:10.1198/jcgs.2009.06164) 提出了一种方法——本质上是一种全子集(基于 BIC)方法,但巧妙地减少了计算时间。他们证明这种方法比 LASSO 更好。有趣的是,这篇论文 (DOI: 10.1111/j.1461-0248.2009.01361.

所以总的来说结果好坏参半,但我的印象是 GA 看起来非常好,尽管逐步可能不会太糟糕而且很快。

至于7),使用非自动、理论(“主题知识”)导向的选择。这很耗时,而且不一定比自动方法好。事实上,在时间序列文献中,已经确定自动化方法(尤其是商业软件)“大幅”优于人类专家(doi:10.1016/S0169-2070(01)00119-4, page561 例如选择各种指数平滑和 ARIMA 模型)。