首页 > 解决方案 > 手动计算的 AIC 不同于 statsmodel AIC

问题描述

我试图为 AIC 手动编写公式。我想将它与 scikit learn 结合使用。为了测试我是否正确编码,我比较了给定相同数据集的 statsmodels 的 AIC 值。但是如果我比较模型 M1 和模型 M2,我的实现和 statsmodels 会产生不同的结果;不仅在数字上,而且 statsmodels AIC 更喜欢我的 AIC 之外的另一个模型。

我使用手动实现的残差平方和并将其放入 AIC 公式中。ols 是 scikit 的普通最小二乘估计器。索引 n 在数据集上运行,y_run(n) 是具有响应变量的第 n 个数据集,X_run(n) 是第 n 个输入训练数据集。最后一段代码是 statsmodel 的 AIC,其中 regr 是 statsmodels 普通最小二乘估计器。

def rss(n):
    return ((y_run(n)-ols(n).predict(X_run(n)))**2).sum()

def AIC (n):
    return len(X_run(n))*np.log(rss(n)/len(X_run(n)))+2*p

def AIC_regr (n):
    return regr(n).aic

你能看到,我的手动实施存在缺陷吗?

标签: python-2.7machine-learningscikit-learnstatisticsstatsmodels

解决方案


我认为这只是定义上的差异。

statsmodels 在 aic 和 not 的定义中使用对数似然rssstatsmodels.tools.eval_measures有两个定义。

信息标准通常仅用于比较同一模型的不同版本,特别是不同数量的解释变量。在这种情况下,模型版本中不变的项通常会被删除。但是,statsmodels 在计算信息标准时使用完整的对数似然定义。这也允许跨模型进行比较。

aic 定义的第二个问题是它是否除以观察次数。这也因统计包而异。


推荐阅读