本記事はK3AdventCalendar2023 23日目の記事です
最近時の流れに追いつけないさんかです。こんばんは。
この記事、23日に投稿されるはずだったらしいのですがうっかりぽっかり24日の深夜に書くことになってしまいました。
人生の色々な物事が遅延気味の私ですが、最近機械学習コンペの進捗も遅延気味というか完全にモチベが下がってきているのでこの記事を書くことで対戦相手となってくれる身近な人材を見つけ出し、私のモチベに貢献して欲しいなという狙いがあります。
(機械学習講座では軽く話をしてしまったので二度目だよという方、ネタが焼き増しで申し訳ない気持ちもありますが、我慢して気持ちばかりの新規性を探してください)
ということで
そもそも機械学習コンペって何?
形式は様々ですが、企業や研究団体がとある課題を一般のプログラマに解いてもらうことを目標として開く大会のことです。
後で詳しく書きますが、課題は例えば「物流で使うための商品自動判定システムを作って!」などなど。
企業側は自社内で開発しなくとも課題を解いてもらえるというメリットや、優秀な人材を採用する機会になるというメリットがあります。
そして我々参加者には、賞金(しょぼいコンペは賞品)や採用機会をもらえるという特大メリットがあります。
この賞金、どうせ2~3万とかじゃん?と思うかもしれませんが、2023年12月25日現在で開催されている日本のコンペティションでさえ以下の通り最高30万円ももらえてしまいます!!学生枠もアリ。
https://signate.jp/competitions/1247
少し難易度は高いですが、機械学習、データ分析のコンペティションで世界一有名なKaggleでは現在
賞金11万ドル=15,665,100円(2023/12/23の時価)
のコンペティションも存在します。約1560万円......
もしかしてこれ、年末ジャンボに賭けるよりよっぽど良いんじゃない?????
しかも今円安だし。
https://www.kaggle.com/competitions
お金の話ばかりですみませんが、万人が大好きな話題なハズですよね。
後は、大体kaggleで上位の称号をゲットすると会社のニュースとしてホームページに名前を掲載してもらえたりします。(kaggleマスターとかkaggleグランドマスターとかあります。Fateみたいでかっこいい)
このリターンのデカさを見た皆さんならもう機械学習コンペがやりたくてたまらなくなっているはずです。
機械学習コンペって具体的にどんな問題が出るの?
実際、どれだけメリットを語ったところで具体的な内容がわからなければただの詐欺だと思われるかもしれません。ということで課題の種類を大きく4つに分けてみました。(私が見たことがないだけでもっとあるかも....コメントお待ちしてます。)
1. 画像
文字通り画像データを使った課題が出されます。
画像の分類や、検出、セグメンテーションなどが目的になります。
私が見たことがある課題だと以下のようなものがあります。
・浮世絵の作者が誰かを自動判別する(分類)
・くずし字(筆で書かれた達筆な字)の検出、分類
・画像から太陽光パネルが存在するピクセルを正確にセグメンテーションする
・CT画像の結果から病変を認識する
2. テーブル
行列に対応したデータが配布され、そのデータの特徴、傾向から予測などを行います。テーブルはよく知らないので誰か挑戦して教えてください。
・木の大きさ、潜在的な問題点、周辺環境といったデータがまとめられたテーブルから木の健康状態の予測
・利用者の居住環境やこれまでの電気使用量などがまとめられたデータから今後の電気使用量を予測
3. 自然言語
文章から予測や分類を行う課題です。
これもあまり詳しくないので誰かやって教えてください。
・与えられた文章がフェイクニュースか、実在のニュースかの判別
・与えられた文章にヘイトスピーチが含まれるかの判別
4. シミュレーション
シミュレーションはみんな大好きゲームAIなどを含むジャンルです。
(たまに最適化問題とかもあるらしいがマイナーなので割愛)
・サッカーAI
・空戦シミュレーションで2機編隊(単一機種)の行動判断を行うモデルの作成 (防衛庁が現在進行形で開催中)
5. 音や脳波などの一次元データ系
これをどう分類するかは知り合いもわからないなあと言ってましたがまあ一次元データ系。
・機械音の異常検知
・脳波などのデータから睡眠の深さを判別
以上が大まかな課題の分類になります。
深層学習のイメージが強いコンペですが、シミュレーション問題を見てわかる通り強化学習など他の手法を使う課題も存在します。
また、機械学習で解決することが多いので便宜上機械学習コンペと書いてはいますが、必ずしも学習が必要な手法が最適解とは限りません。(データ分析コンペというべきかも)自分が比較的詳しいと思うジャンルから始めると良いのではないかなと思います。
また、大体のコンペではこれらの課題に2~3か月単位で取り組むことになります。結構長期戦なので途中で大体モチベが下がりますね....(なので仲間が欲しいよね.......)
機械学習コンペの解き方
どのような課題があるか分かったところで機械学習コンペの大まかな流れについて説明します。(あくまで私の知っている進め方なので参考にしすぎず)
機械学習コンペでは期間内に何回でも*1提出することができ、提出するとその時点のスコアを見ることができます。基本的には期間内で一番スコアの良かった結果が採用されることになります。
*1一日の上限回数はある
1.ベースラインを作る
一番シンプルで改良のベースとなるモデルを作成します。
コンペによってはチュートリアルで取り敢えず提出できる状態のコードが提供されている場合もありますし、何もない場合は過去の同種のコンペの解答を参考にしてベースラインを組むこともできます(一から自分で組むのが良いのが間違いないのはそうなのですが、期間も決まっていますし使えるものは使いましょう)
また、ディスカッションと呼ばれる掲示板でユーザーがベースラインを公開してくれている場合もあります。その場合はそれを採用しても大丈夫です。
ディスカッションでは、効果のあった手法について話し合われていたり、ルールに関する話し合いが運営と行われていることもあるので細目に確認しましょう。
また、コンペによって、サンプルに対する予測結果を出すか、コード自体を提出するかなど提出方式が異なるので、この時点で提出することができるかを絶対に確認しましょう。
ここまで1週間ほどで完了できたら良いかなという感じです。
2.データの中身を見て方針を考える
ベースラインを作成することができ、提出まで経験できたらいよいよ本番です!
ここから最強のモデルの作成を目指しましょう!
そのための第一歩としてまずは学習データの中身を見てみることを激しくおすすめします。(特に画像系の場合)
中にはノイズとなるデータが含まれていたりして、前処理に必要な工夫が分かる場合が多いです。
例:パッケージから商品を判別する課題で、よく見たらパッケージに文字が書いてあってOCRして成分表示からわかるんじゃん???とか
また、クラスごとの偏りを確認したり、データの特徴を可視化することも重要です。
例:特徴量の相関をヒートマップに出力する。
3. 改善策を考える
ある程度課題への理解が深まったら、入力、モデル、出力に分けて改善を考えてみましょう。
前処理
データを見て欠損してノイズになっているデータを削除したり、特徴を抽出しやすい形にする作業です。課題によっていろいろあるので調べてください。
(投げやりすぎるかも)
例:くずし字のデータを正方行列にするためにスライディングウィンドウで整形する。
モデル
強いモデルを実装することが目的ではないので、実装済みの機械学習ライブラリを使うことをお勧めします。
おすすめはtimmというライブラリです。強いモデルが大体実装されているのでモデルはここから合うものを探すだけでも十分対応できます。
https://github.com/pprp/timm/tree/master/timm
ただクソなのは、ヘッドを指定する名前がモデルによってバラバラなので、名前を確かめて指定しないといけないこと(名前の取得の仕方のコード違うPCにメモってあるので後で追記します)
後最新のモデルについては追加でimportが必要。(これも明日あたりで追記)
後処理
結果が正解に近づくように加工します。私もあまり詳しくないのでまた調べたら追記しますが、
例えば
文字を認識して文章を抽出するような課題のとき、連続した文字が続いたら削除するなど。例:ああありがとう→ありがとう
パラメータの調整
手法があるわけではないので図には入れていませんが、学習率を変えたり、学習回数が変えたり、パラメータではないですが活性化関数を変えるといったことにも気を使いましょう。(全然精度が上がらないと思ったら学習率が適切でないときがあった)
4.アンサンブル
ある程度の精度が出るモデルが出来てきたら最強同士を掛け合わせるアンサンブルをしましょう!
アンサンブルとは複数のモデルの予測結果を組み合わせることで、
例えばA, B, Cという別々のモデルの予測結果があるとき
アンサンブル結果 = A ×0.5 + B × 0.3 + C ×0.2
というように加重平均を取ることでも求めることができます(ほかにも方法はある)
こんなにお手軽なのに効果が強いので絶対やりましょう。
5.提出に間に合わせる
超重要。締め切りは細目に確認しましょう!!私は先週やらかしたせいでこの記事がコンペやってみた記事から勧誘記事になりました!
締め切り厳守!!
おすすめコンペサイト
ということで段々コンペに参加したくなってきたであろうやる気が満ち溢れる皆さんのためにおすすめのコンペサイトを紹介します。
常時イイ感じのコンペが開催されているわけじゃないのでこの中から探してまずは参加してみてください。
・the 王道 世界一参加者数が多い、kagglerという言葉でおなじみkaggle
https://www.kaggle.com/
・初心者におすすめsignate(私もこれしかやってない)
https://signate.jp/
・日本酒ラベル当てコンペとかある(雑紹介)
賞品で日本酒ギフト券もらえたらしい
https://www.nishika.com/
・過去の解答が結構載せられてて勉強になるprobspace
https://comp.probspace.com/
・宇宙系コンペ solafune
https://solafune.com/ja
チームを組んでみよう
そして、機械学習コンペはチームを組むことができます!!!
(今回最大の目的)
データの分析をやる人、モデルを組む人、って分担するチームも有れば
単純に解法をお互いに共有するとか色んなスタイルがあるみたいです。
ということでk3でチーム組んでみたいですね~~
最近の私の戦績
実はそういう私も参加できるコンペの都合でまだ2個しか参加できてなくてですね!
しかも締め切り一週間前くらいから本気だすのでこれまた時間が足りなさ過ぎて戦績が散々で!まあ、まだ初心者なのでまずは数こなしてベースライン組むスピードを上げるとか、少しずつ学ぶフェーズで良いかなとは思っているのですが、切実に仲間が欲しい!!!モチベを高める上で伴走してくれる人の存在超重要なんですよね.....
ということで今参加してるsolafuneのコンペ参加してくれる人待ってま~~す!!
https://solafune.com/ja/competitions/5dfc315c-1b24-4573-804f-7de8d707cd90?menu=about&tab=overview