What one likes, one will do well 〜好きこそ物の上手なれ〜

寄り道しながらも、最後は昔から好きな物理とプログラミングに戻ってくる。そんな男の思いをつづるブログです。

初めてAIコンテストに参加した

はじめに

2年ほど前から機械学習ディープラーニングを勉強している。チュートリアルなどをやっていると簡単に予測精度が出てすごいと思い、Webから簡単に使えるディープラーニングフレームワークを作っていた。

しかし分類の予測を作り、次に回帰の予測を作っているとなかなか精度が出ない。思えば分類は実際のデータで予測の精度を上げるため試行錯誤した経験があった。

やはり実践的な経験を踏まえてフレームワークを作らないと意味がないと思い、AIコンテストに参加した。

 

参加したAIコンテスト

参加したのは「オプトDSL・DeepAnalyticsDeepAnalytics」が開催している日本のAIコンテスト。日本語で参加できるので敷居が低い。AIコンテストと言えば「Kaggle: Your Home for Data Science」が有名だが、英語なので敷居が上がる。

またディープラーニングフレームワークを作成している時の検証は、オプトDSLの練習問題で行っていた。そのためコンテストに参加するのも抵抗感がなかった。

たくさんのコンテストが開催されているのだが、参加したのは『走行中の北陸新幹線車両台車部の着雪量推定モデルの作成』だ。北陸新幹線は実家に帰るときに乗るため、愛着もあり、開催された当初から参加したいと考えていた。

そう思いながらも開催されてから参加できていなかった。今年の抱負でAIコンテストの参加を掲げ、参加に至ったという感じだ。

 

コンテストに参加してみて

コンテストは12月の頭から始まり、1月の終わりまでだったのだが、本格的に内容を確認し始めたのが、1月の中旬で2週間ほどしか取り組めなかった。

コンテストの参加前はディープラーニングが最強で、ディープラーニングを使えば結構いけると思っていたのだが、実際はそうではなかった。

自分の結果では一番基本(?)の線形回帰での結果が一番精度が出た。そこで大切と思った事が以下だ。

  • データの観察
  • 予測に使うデータの選択
  • 予測に使うモデルの選択
  • モデルのパラメータのチューニング

 

データの観察

データがどんな特徴を持っているかを知るために、まずはデータの観察が大切だ。データの件数や欠損状況、基本統計量、ヒストグラム、散布図、相関係数など、予測に使うデータの選択にもつながるたいせつなプロセスだ。

欠損が多かったり、予測するデータと全く関係がなかったり、異常値がたくさんあるなど、予測の精度を上げるには、どんなデータかを知ることが大前提となる。

 

予測に使うデータの選択

データを観察したら、そこから予測に関係のありそうなデータを選択する。相関係数を見るのが基本だが、全体でなくとも一部に効くデータだったり、ラベル化して使うなど、どのデータをどのように予測に使うかを決める。

予測に使うデータが悪ければ、どんなによいモデルでも精度がでない。実際にデータを追加して精度が下がることも多かった。そのためデータの選択が1番大切なプロセスとも言える。

 

予測に使うモデルを選択

モデルはたくさんあるので、試しながら決めることになる。私の場合は、まず線形回帰を使い、その後ディープラーニングやxgboostなど試してみた。

線形回帰は解析的に平均二乗誤差を最小にする予測なので、一番基本だか、精度は悪くない。逆にディープラーニングだと過学習やランダム性で、精度が出なかったり、安定しなかったりする。

線形回帰を基本に置きつつ、より精度の高いモデルを探すのがよいと思う。

 

モデルのパラメータのチューニング

線形回帰はパラメータはないが、多くのモデルはパラメータの調整が必要だ。パラメータを変えることで精度が大きく上がったりする。

xgboostを今回試してみたが、すべて同じ値を予測していた。Kaggleではデータをうまく選択すればxgboostだけでも1位になれると言う情報もあるのにだ。つまりデータの選択やパラメータの選択が大切と言う事だ。

今回は時間がなくxgboostのパラメータを変えることもできなかったので、次回以降試してみたい。

 

その他の試した手法

stackingと言う手法を試した。Kaggleでは最後に少し精度を上げるために使われている。実際に作ったモデルで試してみると1割ほど精度が上がった。これは使える手法だと思うが、決め手になるのは上記に書いたデータとモデルだ。精度が高いデータとモデルを選択した後、最後にstackingでもう一歩精度を上げる感じだ。

 

その他に試したかったこと

今回は時間が足りず試したかったが、試せなかったことも多かった。

  • 時系列データとみなせるのでRNNを使う
  • 予測したデータから予測する(予測に使うデータも時系列データで、未来のデータを使うと予測精度が上がる)
  • 合計値を予測するのだが、内訳の相関が違っていたので、それぞれ予測する

コンテストだと上位者は創意工夫しながら挑戦しているので、自分で考えたことをやり切り、自分の中で最高のパフォーマンスを出す必要がある。

 

おわりに

初めてのAIコンテストだったが、ギリギリまで挑戦していて最後に精度の悪い結果を投稿してしまい、最終的には60位ぐらいで、なんとも残念だった。

まず参加してみるというところと、色んな手法を使いこなせないまでも、まずは試してみるというところまではできた。今後もAIコンテストに参加していって、経験値を積んでいきたいと思う。

まずは日本のコンテストに参加していこうと思うが、その後は世界的に有名なAIコンテスト「Kaggle: Your Home for Data Science」に挑戦したいと思っている。

Kaggleで結果を残す人は、Kaggle Masterという称号をもらい、データサイエンティストとして引く手あまたのようだ。目標は高くKaggle Materを目指したい。