ある数値を予測するコンペの問題をPythonでやってます。

与えられた訓練データから使えそうな特徴量だけを取り出し、同様にテストデータから訓練データと同じ特徴量を取り出しました。

<https://www.kaggle.com/serigne/stacked-regressions-top-4-on-
leaderboard/notebook>  
上記を参考にして、取り出したデータをもとにLASSO Regression、Elastic Net Regression、Kernel Ridge
Regression、Gradient Boosting
Regression、XGBoost、LightGBMで予測値を出し、それぞれの予測値も特徴量として追加しました。

それらの特徴量をもとに訓練7:評価3に分割し、学習させたところ、R2Scoreが0.85, train lossが0.1378、validation
lossが0.1248 程になりました。  
この学習器でテストデータを予測したのですが、R2Scoreは0.55になりました。

訓練データとテストデータの特徴量はどれもstats.shapiro()を使うとp値が0か限りなく0に近くなり、正規分布であると思います。  
訓練データで目的の値にしたものも同様でした。  
また、最大値、最小値にも差はほぼありませんでした。

訓練(評価)データとテストデータで評価結果が異なる理由が知りたいです。  
また、交差検証以外で汎化性能を上げる方法が知りたいです。  
以下はあってるかわかりませんが交差検証したコードです。

```

    X = train[cat_vars+cont_vars+['xgb', 'lgb', 'stacked', 'ensemble']]
    y = train[['Score']]
    
    X_train, X_test, Y_train, Y_test = train_test_split(X, y, train_size = 0.7, test_size = 0.3, random_state = 0)
    lr = LinearRegression()
    kf = KFold(n_splits = 5,shuffle = True,random_state = 1)
    lr.fit(X, y)
    splitter = kf.split(X,y)
    print(cross_val_score(lr,X,y,cv = splitter, scoring='r2'))
    
```

結果

```

    [0.888343 0.885379 0.891729 0.881329 0.899762]
    
```
CC BY-SA 4.0
2019-09-17T08:00:02.517
59118
2022-01-12T11:03:45.330
35888
question
python 機械学習 深層学習 scikit-learn pytorch
訓練データとテストデータの評価の差
> 訓練(評価)データとテストデータで評価結果が異なる理由が知りたいです。

これは簡単な話で、機械学習モデルは訓練データを元に学習して、それに適応した結果を出すように訓練されるからです。すでに答えを学習させているのだから一般的には訓練データのほうが評価がよくなります（損失が少なくなる）。

一方でテストデータ、交差検証データは機械学習の学習には使わずにとっておき、評価にのみ使用します。そのため、学習がうまく汎化していればいい評価が出ますが、過学習していた場合悪い評価となります。

参考: [Wikipedia -
過剰適合](https://ja.wikipedia.org/wiki/%E9%81%8E%E5%89%B0%E9%81%A9%E5%90%88)

> また、交差検証以外で汎化性能を上げる方法が知りたいです。

コメントにあるとおり、交差検証は汎化性能を上げる手法ではなく汎化性能を測定する指標のひとつなので汎化性能を上げる役に立った話をトピックベースで書き出します。基本的には、訓練データと交差検証（テスト）データのそれぞれの損失をプロットし、それぞれの対策をやっていくしか無いと思います。

  * ニューラルネットワークに関して 
    * [過学習と学習不足について知る](https://www.tensorflow.org/tutorials/keras/overfit_and_underfit?hl=ja)

> まとめ：ニューラルネットワークにおいて過学習を防ぐ最も一般的な方法は次のとおりです。
>
> 訓練データを増やす  
>  ネットワークの容量をへらす  
>  重みの正則化を行う  
>  ドロップアウトを追加する

あと、個人的には学習率を学習が進むに従って半減させるなども効果がありました。
CC BY-SA 4.0
2020-10-03T11:36:24.430
70899
2020-10-03T11:36:24.430
4715
59118
answer
> 与えられた訓練データから使えそうな特徴量だけを取り出し

どのような条件で特徴量を抽出されたのでしょうか？  
実は重要な特徴量が漏れていたり不要な特徴量が含まれているのかもしれません。

特徴量を抽出するのではなく、  
・相関が高い特徴量を削除する  
・特徴量の重要度を算出し、重要度の低い特徴量を削除する

等を試してはいかがでしょうか？
CC BY-SA 4.0
2020-11-11T05:43:35.733
71861
2020-11-11T05:43:35.733
39819
59118
answer