[競馬予想AI] 不均衡データの対応と評価指標の考察
前回に引き続き、競馬予想AIのモデルチューニングを行いましたのでその内容をまとめて紹介します。
前回の内容はこちら
今回の内容は大きく2つ。「不均衡データに対応するためのオーバーサンプリング」と「評価指標のMCCとPR曲線のAUC」についてです。
オーバーサンプリング
不均衡データの学習をする際、多いクラスのデータを減らす「アンダーサンプリング」と少ないクラスのデータを増やす「オーバーサンプリング」を使うことがあります。
両者のデメリットは次のようなものがありますので、注意して使用する必要があります。
アンダーサンプリングのデメリット
・折角の情報が大きく削除されてしまい、単純に勿体ない。
・削除により元々のデータの分布が歪んでしまう。
オーバーサンプリングのデメリット
・同じデータを単純に複製すると過学習をしてしまい汎用性が低くなる。
これらを考慮して今回はオーバーサンプリングを採用しました。オーバーサンプリングの中でもどのようにデータを増やすのか、いくつかのアルゴリズムが存在します。
今回は「SMOTE」を使用しました。SMOTEを使うと単純に同じデータを複製しないので汎用性を持たせることが可能です。どのようにデータを生成するかというと、同じクラスに属するデータに対してk近傍法を使って新たにデータを生成します。つまり、同じデータではないけど似たデータを作るイメージです。
SMOTEは次の数行だけで実装できます。
from imblearn.over_sampling import SMOTE
sm = SMOTE(random_state=777)
X_train, Y_train = sm.fit_sample(X_train, Y_train)
適用後の結果は次の通りです。
・ROC曲線AUC:0.7523→0.7698
・F1値:0.2644→0.0288
ROC曲線のAUCは多少良くなっていますが、F1値が極端に下がってしまいました。何が起こったかというと、偽陰性率(本当はclass:1なのにclass:0と判定してしまう)が高くなりすぎてしまいました。学習機としては慎重すぎる判定をするものとなってしまいました。出力の閾値の変更で多少の調整は可能ですが、それでも性能が良くなったとは言えません。
MCCとPR曲線AUC
ここからは評価指標のお話です。性能には直接的な影響はありません。
MCC
MCCはマシューズ相関係数とよばれるもので2値分類モデルを評価するための指標で-1~+1の値をとります。ランダムな予想と変わらない場合はMCC=0となります。
MCCは不均衡データに対しても使用できる指標となっています。MCCは混同行列から計算可能です。詳細は別途お調べいただけたらと思います。
F1値は不均衡データに対して正負のクラス定義の違いで偏った値になりがちですが、MCCは安定した値になります。「F1値が高いから性能がよくなった!」と騙されることが少なくなります。
ただし、今後も変わらず混同行列を見てどのような判定をしているのか見ていく必要はありそうです。
PR曲線のAUC
PR曲線は簡単にいうと、不均衡データに対して敏感に反応します。少数クラス(class:1)を正しく予測しないとなかなか数値が上がらない指標です。
ROC曲線の場合、偽陰性と予測としてしまってもROC曲線は横ばいとなりAUCは減少しない一方、PR曲線は偽陰性と予測してしまうと曲線が下がりAUCが減少しペナルティのような挙動を見せます。これが不均衡データに対して敏感な所以です。
さて、ここまで2つの指標を紹介しましたが、正直、指標だけで判断するのは危険だなと思います。確かに目安にはなりますが、同時に混同行列を観察するのがやはり安全です。2値分類問題なので混同行列のマトリックスは多分類問題よりはるかに単純です。なので混同行列をつぶさに観察したほうが無難でしょう。
今後の予定
前回の「今後の予定」では深層学習の導入を予定していましたが、もうひとつ試したいアルゴリズムがあるのでそちらを試した後に深層学習を始めたいと思っています。
・LambdaRankを試してみる
今まで使ってきたxgboostは分類学習で、LambdaRankはランク学習アルゴリズムです。文字通り入力から順位を予測するアルゴリズムです。競馬予想AIにはこちらのアルゴリズムの方が適してる気がしますよね?
LambdaRankでどれほどの精度がでるのかお楽しみにお待ちください!
よろしければサポートをよろしくお願い致します。いただいたサポートは今後の技術向上のために書籍費用等に当てられ、このnoteで還元できればと思います。