【问题标题】:Different model performance evaluations by statsmodels and scikit-learnstatsmodels 和 scikit-learn 的不同模型性能评估
【发布时间】:2018-05-26 18:22:48
【问题描述】:

我正在尝试在数据集上拟合多变量线性回归,以了解模型对数据的解释程度。我的预测变量有 120 个维度,我有 177 个样本:

X.shape=(177,120), y.shape=(177,)

使用 statsmodels,我得到了 0.76 的非常好的 R 平方和 0.06 的 Prob(F 统计量),它趋向于显着性并表明数据的良好模型。

当我使用 scikit-learn 的线性回归并尝试计算 5 倍交叉验证 r2 分数时,我得到的平均 r2 分数为 -5.06,这表明泛化性能非常差。

这两个模型应该与他们的训练 r2 分数完全相同。那么为什么这些库的性能评估差异太大呢?我应该使用哪一个?非常感谢您的 cmets。

这是我的代码供您参考:

    # using statsmodel:
    import statsmodels.api as sm
    X = sm.add_constant(X)
    est = sm.OLS(y, X)
    est2 = est.fit()
    print(est2.summary())

    # using scikitlearn:
    from sklearn.linear_model import LinearRegression
    lin_reg = LinearRegression()
    lin_reg.fit(X, y)
    print 'train r2 score:',lin_reg.score(X, y)
    cv_results = cross_val_score(lin_reg, X, y, cv = 5, scoring = 'r2')
    msg = "%s: %f (%f)" % ('r2 score', cv_results.mean(),cv_results.std())
    print(msg)

【问题讨论】:

    标签: python scikit-learn statistics linear-regression statsmodels


    【解决方案1】:

    rsquared 的差异是因为训练样本和遗漏的交叉验证样本之间的差异。

    在没有正则化或变量选择的情况下,您很可能对 121 个回归量(包括常数和仅 177 个观察值)严重过度拟合。

    Statsmodels 只报告训练样本的 rsquared,R2,没有交叉验证。 Scikit-learn 需要减少交叉验证的训练样本量,这使得过度拟合更加严重。

    scikit-learn 报告的低交叉验证分数意味着过度拟合的估计不会泛化到遗漏的数据,并且匹配训练样本的特殊特征。

    【讨论】:

    • 感谢 user333700。我知道训练分数和测试分数之间的差异,但是 prob(F-statistic) 在这里意味着什么?统计显着性或趋势是否意味着我们有一个好的模型?
    • 该模型在 rsquared 方面非常适合,在 f 统计量方面也相当不错,但就样本外预测而言,它太适合了。 rsquared 和 f-test 都不会因过度拟合而受到惩罚。更好的检查是 AIC 或 BIC,例如去掉最不重要的解释变量后。问题是该模型适合训练数据,但参数估计不是很可靠,并且由于每个解释变量的观察数量很少,因此无法精确估计。我猜你的参数的标准误差和置信区间大多非常大。
    猜你喜欢
    • 2013-06-04
    • 2014-06-13
    • 2019-04-27
    • 2018-10-29
    • 2014-09-02
    • 2018-07-04
    • 2014-10-03
    • 2016-06-27
    相关资源
    最近更新 更多