How to Win a Data Science Competition Week3-01
Posted on 2019/10/05 in 機械学習 , Updated on: 2019/10/05
coursera の How to Win a Data Science Competition: Learn from Top Kagglers の Week 3 のまとめ。
Motivation¶
- コンペにおいて重要な metric (評価指標) について
- 色々な metric が用いられる理由は、各企業が特定の問題に最適な指標を自分たちで決定しているから
- コンペにていいスコアを取得する = 良い metric score を取得する
- metric の意味を理解して、効率よくスコアアップを目指そう
- metric が異なれば、同じデータ/モデルを使用してもスコアは大きく異なることがある
- metric を効率的にアップさせるには、ある種の直感も必要
- そのためには、EDA は非常に重要
- また、特殊な metric が使用される場合は、まずそれについて学ぼう
Regression metrics review 1¶
- MSE (平均二乗誤差)
- ターゲットと予測値誤差の二乗の平均
- 最も一般的な評価指標
- RMSE (平方根平均二乗誤差)
- 平均二乗誤差の平方根
- MSE最小 = RMSE最小
- 一見 MSE と同じように思えるが、わずかな違いが、勾配ベースモデルにて生じる
- MSE の勾配と RMSE の勾配が異なる => learning rate が異なる
- R_squared
- MSE や RMSE の絶対値でモデルの良し悪しは判断できない (あくまで相対値)
- R_squared を使って一定のベースラインと比較できるようになる
- MSE が 0 の時、R_squared は 1 に、逆に 1 の時は, 0 に。
- MAE (平均絶対値誤差)
- ターゲットと予測値の絶対誤差の平均
- 重要な点として、大きな誤差にペナルティ(重み)を課さない
- つまり MSE よりも外れ値に鈍感になる
- MAE は金融業界で利用される。MAE なら
10
と5
の誤差の比率は2倍だが、MSE では4倍 - MAE は MSE より堅牢 (つまり異常値の影響が少ない)
Regression metrics review 2¶
- target:10 に対して予測 9 と target:1000 に対して予測 999 はどちらも MSE は
1
- 実際には、10に対して9 のほうが深刻な誤差である(10%)
- しかし、MSE や MAE は絶対誤差で動作するので上記を区別することができない。
- この問題に対応するために、相対誤差を考慮した指標が必要
Classification metrics review¶
分類問題における評価指標
- Accuracy
- 最も単純な評価指標
- 値が大きいほど、モデルとして優れており、正しく分類される割合に等しい
- 偏ったデータセットにおいては注意が必要
- 猫10匹、犬10匹のデータにおいて、全て犬と予測すると Accuracy は 90% と高い値を出してしまう
- この場合、本当は99%の精度まで高められる可能性を持っていても、最適化は難しい
- Logarithmic loss
- 分類するべきクラスに属する確率で評価する指標
- 2値分類およびマルチクラス分類問題にて利用できる (計算式は異なる)
- すべてのクラスに属する確率の合計は、常に 1
- 間違った分類に対して大きなペナルティを課す
- Area under ROC curve
- Quadratic weighted Kappa
- 重み付き誤差
General approaches for metrics optimization¶
損失(loss)と、評価指標(metric)の違いについて。また、metric の最適化へのアプローチの説明
- metric は、モデルの品質を評価するために使用する関数
- 分類タスクにおいては、モデルが正しいラベルを出力する頻度を最大化したい
- しかし、精度を効率的に最適化する方法はわからない
- 代わりに proxy loss function を使う。これは特定モデルに最適化が容易な評価関数
- 損失関数は、モデルを最適化するために用いられる
- metric は、モデルの結果に対する評価方法
- metric の最適化アプローチ
- いくつかの metric は直接最適化できる (MSE, Logloss)
- 直接最適化できないもの : MSPE, MAPE, RMSLE..
- XGBoost では、MSPE は直接最適化できないが、データをリサンプリングして、MSE で最適化できるようにするトリックがある(後述)
- XGBoost では、カスタム損失関数を簡単に定義できる (例↓)
In [ ]:
# 予測とターゲット値を受け取り、モデルの予測に対して損失関数の1次および2次の導関数を
# 計算する単一の関数を実装
def logregobj(preds, dtrain):
labels = dtrain.get_label()
preds = 1.0 / (1.0 + np.exp(-preds))
grad = preds - labels
hess = preds * (1.0 - preds)
return grad, hess
- 適切な最適化方法や、カスタム損失関数を書くことは難しいのが現状
- 便利な機能として、
early stoppgin
がある- モデルを設定、最適化できる損失関数を最適化し、検証セットで metric を監視する。そして、モデルが最適化され、metric にしたがってモデルがオーバーフィットし始めたら、トレーニングを停止する。