はじめに
この記事は「ただただアウトプットを癖付けるための Advent Calendar 2024」に投稿した記事です。
最初の記事にも書いた通り、私は生物物理の実験を専門にしている研究者です。
最近はデータ解析のため機械学習のコード開発も行っており、幸いにもその成果がNeurIPSに採択されました。
競技プログラミングの存在は知っていました。
Kaggleくらいしか知らず、ややハードルが高いものという印象でした。
しかし、SIGNATEというサービスがあることを知り、今回は初心者向けの課題に挑戦してみました。
関連記事
前の記事「生物物理屋が日本語LLMを試してみた話」
次の記事「NeurIPS著者が今更JAXを使ってみた話」
SIGNATE
SIGNATEは、データサイエンスのコンペティションを提供しているサービスです。
こちらからアクセスできます。
通常のコンペティションに加えて、初心者向けの課題も提供されています。
目に付く課題として、毒キノコの分類問題をやってみることにしました。
選んだ基準は、毒キノコに触れる機会はなかなかないのではないかということです。あと、なんだか目を引きますよね。
データセットと回答方法
コンペのページには、トレーニングデータ、テストデータがtsv形式で提供されています。
トレーニングデータには、キノコの各種特徴を表すアルファベットと、そのキノコが毒キノコか否かが記載されています。
テストデータには、キノコの各種特徴のみが記載されています。
これらを用いて、テストデータの各キノコが毒キノコか否かを予測するのが課題です。
ページには、ほかにも提出用のサンプルファイルがcsv形式で提供されています。
このファイルには、テストデータのキノコが毒キノコであるかどうかが記載されています。
これは正解というわけではありません。
単に、この形式にのっとったcsvファイルを提出することで、スコアが算出されるということです。
モデルの選択
データセットを見ると、特徴量がアルファベットで表されていることがわかります。
これは、カテゴリカルデータとして扱う必要があります。
そこで、決定木を使ってみることにしました。
プログラム
今回は練習問題ということで、だいぶ端折っています。
以下の手順で提出用ファイルを作成し、提出しました。
- pandasを使ってデータを読み込み (read_csv)
- トレーニングデータを学習用と検証用に分割 (train_test_split)
- カテゴリカルデータをバイナリのベクトルデータに変換 (OneHotEncoder)
- ランダムフォレストを定義 (DecisionTreeClassifier)
- 学習 (fit)
- テストデータを予測 (predict)
- 提出用ファイルを作成 (to_csv)
提出そのものは、練習問題のページを開いて参加をクリックしたのち、提出ボタンからファイル選択するだけです。
提出直後は評価値が表示されませんが、5分ほどするとスコアが表示されるようになりました。
結果
決定木の深さだけは変えてみました。
3, 5, 10を試したところ、深さ10では検証用データでの正答率が100%になりました。
そこで、深さ10で提出したところ、スコアは1でした。
とはいえ、これは練習問題ですので、自動的にスコアが1になるように設定されているのかもしれません。
追加で深さ3も提出しました。
深さ3と深さ10の予測値はほぼ同じですが、1.5%ほどの差がありましたので、正答率がスコアに反映されているならば、両者のスコアが1になることはないでしょう。
実際、深さ3のスコアは0.9852290でした。
実はこの値、トレーニングデータでの正答率とほぼ同じです。
間接的に、過学習しすぎていないことがわかるという結果になりました。