我想实现一种用于自动模型选择的算法。我正在考虑进行逐步回归,但是任何事情都会做(尽管它必须基于线性回归)。
我的问题是我找不到方法论或开源实现(我正在用Java唤醒)。我想到的方法如下:
- 计算所有因素的相关矩阵
- 选择彼此之间相关性较低的因素
- 删除t统计量较低的因素
- 添加其他因素(仍基于2中找到的低相关因素)。
- 重复几次,直到某个条件(例如AIC)超过某个阈值或无法达到或无法找到更大的值。
我意识到有一个R实现(stepAIC),但是我发现代码很难理解。另外,我还没有找到描述逐步回归的文章。
我想实现一种用于自动模型选择的算法。我正在考虑进行逐步回归,但是任何事情都会做(尽管它必须基于线性回归)。
我的问题是我找不到方法论或开源实现(我正在用Java唤醒)。我想到的方法如下:
我意识到有一个R实现(stepAIC),但是我发现代码很难理解。另外,我还没有找到描述逐步回归的文章。
Answers:
我认为这种方法是错误的,但如果我解释原因,可能会更有帮助。想要了解有关大量变量的一些信息的最佳模型是可以理解的。此外,在这种情况下,人们似乎经常发现自己。此外,许多有关回归的教科书(和课程)涵盖逐步选择方法,这意味着它们必须合法。但是不幸的是,事实并非如此,而这种情况和目标的配对很难成功地解决。以下是自动逐步模型选择过程的问题列表(归因于Frank Harrell,并从此处复制):
- 它产生的R平方值严重偏高。
- 打印输出上每个变量旁边引用的F和卡方检验不具有所要求的分布。
- 该方法得出的效果和预测值的置信区间错误地变窄。参见Altman和Andersen(1989)。
- 它会产生不具有正确含义的p值,对其进行正确的校正是一个难题。
- 它给出需要收缩的有偏回归系数(剩余变量的系数太大;请参见Tibshirani [1996])。
- 在共线性的情况下,它具有严重的问题。
- 它基于旨在用于检验预定假设的方法(例如,嵌套模型的F检验)。
- 增加样本数量没有太大帮助;参见Derksen和Keselman(1992)。
- 它使我们不必考虑问题。
- 它消耗大量纸张。
问题是,这些程序有什么不好?为什么会出现这些问题?参加过基本回归课程的大多数人都熟悉均值回归的概念,因此这就是我用来解释这些问题的方法。(尽管起初看起来似乎是题外话,但请允许我,我保证它是相关的。)
想象一下,在试训的第一天,一名高中田径教练。三十个孩子出现了。这些孩子具有某种内在能力的内在水平,教练和其他任何人都无法直接使用这些内在能力。结果,教练唯一能做的就是让他们全部跑100m。时间大概是衡量其内在能力的标准,因此被认为是时间。但是,它们是概率性的。某人的表现有多大比例取决于他们的实际能力,而有多少是随机的。想象一下,真实情况如下:
set.seed(59)
intrinsic_ability = runif(30, min=9, max=10)
time = 31 - 2*intrinsic_ability + rnorm(30, mean=0, sd=.5)
下图显示了第一场比赛的结果以及教练对孩子的评论。
请注意,按照比赛时间对孩子进行划分会使他们的内在能力重叠,这一事实至关重要。在赞美某些并大喊大叫之后(教练倾向于这样做),他让他们再次跑步。以下是第二场比赛的结果,教练的反应(根据上述同一模型进行了模拟):
请注意,它们的内在能力是相同的,但是相对于第一种族而言,时间反弹了。从教练的角度来看,他大喊大叫的人趋于改善,而他称赞的人则趋于恶化(我从Wiki页面上列出的Kahneman引用中改编了这个具体示例),尽管实际上回归均值是一个简单的数学运算教练基于部分随机的测量结果为团队选择运动员这一事实的结果。
现在,这与自动(例如逐步)模型选择技术有什么关系?基于同一数据集开发和确认模型有时被称为数据挖掘。尽管变量之间存在某种潜在的关系,并且期望更强的关系会产生更强的得分(例如,更高的t统计量),但它们是随机变量,并且实现的值包含误差。因此,当您基于具有较高(或较低)的实现值来选择变量时,由于其潜在的真实值,错误或两者兼而有之。如果您以这种方式前进,那么您会像教练在第二场比赛后一样感到惊讶。无论您是基于具有高t统计量还是具有低相关性来选择变量,这都是正确的。的确,使用AIC比使用p值更好,因为它会惩罚模型的复杂性,但是AIC本身是一个随机变量(如果多次运行研究并拟合相同的模型,AIC会像其他一切)。不幸,
我希望这是有帮助的。
请查看R中的插入符号包。它将帮助您交叉验证逐步回归模型(使用method='lmStepAIC'
或method='glmStepAIC'
),并可能帮助您了解这类模型如何具有较差的预测性能。此外,您可以findCorrelation
在插入符号中使用函数来识别和消除共线性变量,而rfe
在插入符号中使用函数来消除t统计量较低的变量(使用rfeControl=rfeControl(functions=lmFuncs)
)。
但是,如前面的答案所述,这些变量选择方法可能会给您带来麻烦,特别是如果您反复进行操作。绝对要确保您在完整的测试集上评估性能。在对算法满意之前,甚至不要看测试集!
最后,使用具有“内置”特征选择的预测模型可能更好(更简单),例如岭回归,套索或弹性网。具体来说,尝试method=glmnet
插入符号的参数,并将该模型的交叉验证准确性与参数进行比较method=lmStepAIC
。我的猜测是,前者将为您提供更高的样本外准确性,并且您不必担心实现和验证自定义变量选择算法。
r
或的语言对双重pareto惩罚的任何良好实现python
?我很想尝试一下。
我完全同意@gung概述的问题。也就是说,实际上,模型选择是一个需要实际解决方案的实际问题。这是我将在实践中使用的东西。
作为在现实世界中使用此方法的示例,我相信它已在Netflix奖竞赛中使用。
要回答这个问题,有几种选择: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)指出,“所有可能的回归”都对他们提出的新方法给出了相同的结果,但逐步改进的效果更差。他们之间有一个简单的GA。本文(DOI:10.1080 / 10618600.1998.10474784)将惩罚回归(桥梁,套索等)与“跳越界线”(似乎是穷举搜索算法,但速度更快)进行了比较,还发现“桥梁模型与来自通过跳跃方法选择子集”。该论文(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,第561页),例如选择各种指数平滑法和ARIMA模型)。
我看到我的问题引起了很多兴趣,并引起了关于自动模型选择方法有效性的有趣辩论。我同意将自动选择的结果视为理所当然是有风险的,但可以将其用作起点。所以这是我针对特定问题的实现方法,即找到最佳n个因子来解释给定变量
同样,这很粗糙,可能有方法可以改进方法,但这是我的出发点。我正在发布此答案,希望它对其他人有用。欢迎发表评论!