めも

これはメモ。

How to Win a Data Science Competition: Learn from Top Kagglers(三週目)のメモ

コーセラの以下のコースを受講した際の聴講した内容を部分的にメモ。あくまで自分の理解で講義の中身そのものではないです。

coursera

Week2の聴講メモは以下。

Week3

コンペティションの評価指標(metric)について、それらの最適化について。 問題が異なれば最適化すべき損失は異なる。

回帰

回帰問題の指標

  • MAE(Mean Absolute Error)
  • MSE(Mean Squared Error)
  • RMSE(Root Mean Square Error)

MSEとRMSEは勾配ベースのモデルだと学習率が異なる場合と見ることができる。外れ値がある場合はMAEの方がロバストなので(MAEは誤差の絶対値なので外れ値を過大評価しない)外れ値があるかもしれない場合はMAEでいいとして一つ目の講義は締めている。

  • RMSPE(Root Mean Square Percentage Error)
  • MAPE(Mean Absolute Percentage Error)
  • RMSLE(Root Mean Squared Logarithmic Error)

上記は予測の誤差と正解の値との比率が重要になる時に利用する。 RMSLE(Root Mean Squared Logarithmic Error)は

import numpy as np
import math

def rmsle(y, y_pred):
    # Σの箇所を計算
    diffs = [(math.log(ypi + 1) - math.log(yi + 1)) ** 2.0 for yi,ypi in zip(y, y_pred)]
    # サンプル数で割ってルート
    return np.sqrt(np.sum(diffs) * (1.0/len(y)))

となり、MSPE,MAPEはMSE,MAEの重み付けバージョン、RMSLEはMSEのlog-spaceバージョンと見ることができる。

決定係数 (R-squared)

R-squaredを最適化すること = MSEを最適化することと式の形からわかる。 R-squaredは説明変数を増やせば増やすほど(それが重要な説明変数で無いにもかかわらず)高くなるケースがある場合に注意する。

回帰モデルの最適化

評価指標が最適化したい関数であり、損失関数がモデルの最適化する関数。 実際に最適化したい関数は微分不可能だったりの理由からモデルを使って最適化することができない時がある。そのため代替する損失関数を最適化する。

XGBoostではモデルの損失関数を簡単に変えることができる。

XGBoostは損失関数でヘッセ行列が出てくることから二階微分できない MAEなどを目的関数に利用することはできないが、LightGBMは使うことができる(なぜだろう?)。なので二階微分できない関数で勾配ブースティングするときはLightBGMを使えばいいい。

MSPEはサンプルごとの重みを変えてMAEを行えば良い。 XGBoostとLightGBMはsample_weights を変えればok。 それ以外のモデルを使う場合はdf.sampleを使えば良い。

ロバストな損失関数

  • Huber-loss
  • Quantile-loss(MAEはquantileの特別なケースですね)

その他のロバストな損失関数

講義からはそれますが。

A More General Robust Loss Function

BARRON, Jonathan T. A more general robust loss function. arXiv preprint arXiv:1701.03077, 2017.

[1701.03077] A More General Robust Loss Function

Charbonnier損失, pseudo-Huber損失, L2損失, L1損失などパラメータを一つ持つ損失関数を一般化したパラメータを二つ持つ関数を提案。

分類問題の指標

  • accuracy

accuracyは(正解数)/Nなので頻度が高いクラスを当てると高くなる点に注意する。

  • logloss

ylog(y)+(1-y)log(1-y)の箇所は実際には10**-5などの小さい値でクリッピングした値で損失を計算する(講義参照)。

  • AUC-ROC

AUCは予測したクラスが特定の閾値(0~1)で完全に二分できる時に1になる。ベースラインは完全にランダムに予測した場合で、0.5になる。

  • Kohen's Kappa

1 - (1-accuracy)/(1-baseline)

偏りのあるデータ、例えば全部クラス1で予測したらaccuracy=0.9となるデータではaccuracyは高くなる。なのでベースラインとして「予測値をランダムに並び替えたもの」を用意してそのaccuracyとの比率を見る。

他ランキング推定などの指標も sk-learn/metric以下で実装されている。重要なのは、ときたい問題に沿って正しい指標を選ぶこと。

追記予定