-1

データセットに多変数線形回帰を適合させて、モデルがデータをどれだけうまく説明しているかを調べようとしています。私の予測因子は120件の寸法を持っていると私は177個のサンプルがありますstatsmodelsを使用して統計モデルとscikit-learnが異なるモデルパフォーマンス評価

X.shape =(177120)、y.shape =(177)

を、私は非常に良いR二乗0.76のを取得しますProb(F-統計)は0.06であり、これは有意性に向かい、データの良好なモデルを示す。

scikit-learnの線形回帰を使用して5倍交差検定r2スコアを計算しようとすると、平均r2スコアが-5.06となり、一般化のパフォーマンスが非常に悪いです。

2つのモデルは、列車のr2スコアが正確に同じである必要があります。では、なぜこれらのライブラリのパフォーマンス評価が異なるのですか?どちらを使うべきですか?これについてのあなたのコメントに心から感謝します。なぜなら、訓練サンプルと出て左クロスバリデーションサンプル間の差のrsquaredで

# 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) 

答えて

2

違い:

は、ここにあなたの参考のために私のコードです。

正規化や変数の選択をしないで、定数が177回しかないなど、121個の回帰子が強くオーバーフィットしています。

Statsmodelsはトレーニングサンプルでrsquared、R2のみを報告しますが、相互検証はありません。 Scikit-learnは、クロスオーバー検証のためにトレーニングサンプルのサイズを減らす必要があり、オーバーフィットがさらに悪化します。

scikit-learnで報告されているクロス検証のスコアが低い場合は、過大評価が左外部データに一般化されず、トレーニングサンプルの特異な特徴に一致していることを意味します。

+0

ありがとうuser333700私は列車とテストのスコアの違いを知っていますが、ここでprob(F統計)は何を意味していますか?統計的有意性やそれに対する傾向は、良いモデルを持っていることを意味しますか? – Behrouz

+1

モデルは、r統計量に関してはかなり良く、f統計量に関してはうまく適合しますが、サンプル外予測に関してはあまり適していません。 rsquaredもf-testも過大適合のために不利になることはありません。より良い点検は、AICまたはBICとなります。最も重要でない説明変数を削除した後。問題は、モデルが訓練データに適合するが、パラメータ推定値は信頼性が低く、説明変数ごとの観測数が少ないため正確に推定できないということです。私はあなたの標準誤差と信頼区間がほとんどかなり大きいと思う。 – user333700

関連する問題