はじめに
2020年10月から始まるAIQuest2期に向けて肩慣らしがてらビギナー限定コンペ(https://signate.jp/competitions/293 )に参加した。
AIQuestに参加するために参加したコンペではそこまでよい順位ではなかったが何とか参加に漕ぎつけることができた。
このままでは結果を出せないどころかついていけない、、、と思い9月後半からではあったがある程度時間を投下して本コンペに参加することができた。
本コンペは一定のスコアを出せばクリア、といったもので順位はあまり意味を持たないものだったが「勉強のため」と「自信をつけるため」に順位を上げる努力をした。結果としては運よく一位を取ることができたので今回自分が実施したことを紹介していこうと思う。
コンペの概要
今回は血液のデータと年齢、性別で肝疾患かどうかを判断するといったもの。
評価関数はAUCを使用。
クリア条件はAUC=0.92を超えること。
環境
環境はGoogle Colaboratory
序の口
テーブルデータの分析で共通して実施していることをピックアップしていく。
- データを見る
データそれぞれがどのような意味のものか、データの型は何か、欠損値がないかを確認。
後はどれだけ偏りがあるか可視化をしてみる。
- feature_importanceを見てみる
一旦何も工夫せず学習してみて何を重要視しているか見てみる。
ほーんくらいの感想しか出なくても仮定を立てていく上でイメージ作りにこの作業は重要に思える。(捉え方によってはここで得た印象は足枷となってしまうかもしれないが)
- 色々なモデルで学習してスコアを見てみる
Kaggleの有名なTitanicのノートでも実施されているが色々なモデルでスコアを出してみる。
今回私が試したのは
Support Vector Machines
,KNN
,Logistic Regression
,Random Forest
,Naive Bayes
,Perceptron
,Stochastic Gradient Decent
,Linear SVC
,Decision Tree
,catboost
採用したのはcatboost
。
今回は欠損値も存在しなかったので何も考えず色々なモデルでスコアを出し、一番結果が良いものをfirst_commitとした。結果は0.8程度だったと思う
クリアするのに必要だった最低限のこと
↑で0.8とクリア条件と大幅にかけ離れているので無工夫ではさすがにクリアはできなかった。
私の場合、以下の2つの工夫(といえるものではないかも)をしてクリア条件を満たすことができた。
- 性別と年齢の列を削除する
一見とても肝疾患か否かと関係がありそうだが(実際相関も高かった)これを削除すると精度が向上した。
本当は何か根拠を持って消したかったが自分はそれをつかむことができず「機械的に消してみたらうまくいった」といったものだった。
ここに至るまでには
-
TargetEncoding
をやってみる - 年齢を10代、20代…とわけてみる
を実施したがどれも成果はなかった。
ここで精度が0.83くらいまで上昇。
- 推論結果を確率表記にする
この手の推論は1か0で出力する脳しかなかったので思いつくのに時間を要したがこれで飛躍的にスコアが向上した。
# 0か1で出力
model.predict(pred)
# 確率表記
model.predict_proba(pred)[:, 1]
これで0.83⇒0.92と合格ラインに到達。
さらに精度を向上するために実施したこと
順位は関係ないコンペだったがモチベーションがあったのでさらに精度向上を試みた。以下は実施してスコアが上がったもの。
-
医学的視点での血液正常値の範囲内かどうかの特徴量を追加
値では判断ができるものではあるが単位が皆異なっており総合的判断が難しく、「正常値の範囲内なのかどうか」だけで判断する特徴量が欲しいと思い、取り入れた。実際にこの方法はかなり有用でこれをやるだけで順位がTop10に入るくらいまで向上した。 -
↑で得た知識で訓練データのイレギュラーデータを除去する
単に機械的に突出したデータを持つデータを削る、では見いだせなかった「ほとんどの数値で異常値を取っているのに正常と判断されているデータ」を除去した。
1か0の推論ならそこまで影響はないのかもしれないが確率表記なので傾向と真逆のデータを消してやることで突出してシロ・クロなデータを限りなく1か0で表現できるようになるのでは?という仮定からこれを実施した。
これが1位まで上り詰めることができた決定打となった。
まとめ
ビギナー限定のコンペで順位もあまり関係がない、ということで喜んでいいことなのか微妙なところだが自信はついたので取り組んでよかった。
こんなしょぼいデータ分析では実務レベルには耐えられない気がするのでもっと詰めていけるようになりたい。