と。

統計学は趣味、マーケティングは義務。

atmaCup第10回参加記録

いつか出たいとは思っていたんですよ

優勝されたチームの方おめでとうございます。
参加者の皆さん、お疲れ様でした。

ようやくそれが叶いました。
本当は少しデータを見るだけのつもりが、
徹夜でモデルをつくるとか、やっちゃいましたね……

あ、ブログのデザイン変えました。黒いほうが目にいいので。

結果は?

久しぶりのコンペだったので実質初心者です。
あまり力を入れすぎずにやっていこうと思っており、そこまで順位にこだわっていませんでした。
また、全力で取り組んでいる皆さんがいる中、ゆるふわで参加していたので、
せっかく美術品のコンペならドメイン知識提供しようと思ったポテトチップス
精度指標がRMSLEだったので、全て0のsubmissionを出してtestのスコアの分布の代表値を考えるなど、
あんまり精度に貢献するわけでもないことをぼやいていました。
それでも皆さん読んでいただいて、いいねしていただいて、非常に嬉しい限りです。

美術館、なかなか行きづらいですが、実際換気も程よくされており、
今回のコンペで興味をもった方は是非行ってみるとよいかと思います。
とりわけ平日の常設展とかは空いているので、有給とっていきましょう。
地方の美術館にも言わずと知れた作品が展示されていたり、
思わず自分がlikeをしたくなる絵に出会える場合があります。

で、結果は?

LB: 84位(0.9951)
PB: 81位(1.0601)

幸いベストな結果がベストでした(小泉進次郎構文)

予想通りそこまで変動はしませんでした。kaggleほどのshakeが起きないことは予想できていたので、
無難なモデルの作成が奏功したなあとおもいました。ハァイ。
なんか「敢闘賞」なるものがあるらしく、それをいただきました。ありがとうございます。
敢闘させていただきました。

参考にしたディスカッション・サイト

atmaCup内のディスカッション

Webサイト

  • note.nkmk.me
    • 初手ここ。ここで分からなければドキュメント。
    • pandas/numpyの処理で詰まったら大体ここ経由で公式ドキュメントに飛んだほうが早い
      古事記にも書かれている
  • lightGBM公式ドキュメント
    • やっぱこれだね。
    • 対数変換が効くのは分かりつつ、tweedieobjectiveにしてRMSLEcustom metricで評価したモデルもあります。
      • 大体こういうのは効かないって相場が決まってるんすけどね。
    • dartにしたやつを最終subに、と思ったら間に合いませんでした。
    • weightをつけられるらしいのでつけてみましたが精度が悪化したので辞めました。
      • というかweightを使って奏功する場面があまりない気がしている。
    • ハイパーパラメータのチューニングはできませんでした。
      • GPUがほしいね。
  • その他各種ライブラリのドキュメント
    • ドキュメントないと何も実行できないので。

ディスカッションはたかだか47くらいだったので、全て目を通して、時間との戦いで使えそうな実装に絞って実装しました。
(にゅーらるねっとわあくはよくわからないので、試すのを諦めました) 特にtakoiさんのベースラインは初心者にも易しい構成で平易なモデリングがなされており、スターターとして最適でした。
kaeruさんのBERTはベストディスカッション賞を取るだけあり、一瞬で利用できたのでやべーなーってなりました。
コード置いて、使い方書いて、そのように使えば使えるって本当すごいことですよ。かがくのちからってすげー!

戦略

戦略らしい戦略はほぼないですが、kaggleと違って期間が短いので、
何をやるかの優先順位をつけようと心がけました。

すでにkaeruさんのBERTが完成されているので、とりあえず変換しておきたい文字列特徴量を突っ込んで寝て *1
起きて仕事してる間にモデルを回す、みたいなことをやっていました。

特徴量は全て美術品object_idユニークにして、可能な組合せでマージして、
欠損を補完して、LGBに突っ込むループとかで放置していました。
でもverboseつけてるとついつい見ちゃうので、なんか「終わったら音で知らせる」くらいのアレでいいなとか。

初めての試みに、結果などを管理するために、最低限必要な情報(突っ込んだ特徴量テーブルとかlocal CVとか、実行日とか)は
実行の都度アウトプットされるような形で生成していました。
実質的に自分用の実験管理記録を作ったのですが、事後的にハイパーパラメータを記録していないことに気づき、
「アーコレもうさいげんできないねえ」とか言っています。
ただ「何を使ったらどうだったか」は記録できたし、再現性のある実験記録づくりは自分なりに試して見ようと思います。
kedroやmlflowも検討しましたが、kedroは大分機能が変化していて、使うには知識のキャッチアップが伴いませんでした……

言語はPythonです。個人的に「仕事はR、コンペはPython」って決めているのでこうなりました。
仮想環境はpipenvでバージョン管理し、VSCode内で完結する状態に持ち込めました。

特徴量については自称美術館めぐりが趣味なので、上手いことドメインを活かせるといいなあと思ってました。
上位陣は当たり前のようにやっていた色情報については、美術品別に集計値・代表値を出すくらいにとどめてました。
純粋な画像が得られている場合はそれこそ深層学習ですが、テーブルに出ているなら純粋にテーブルで統計量をひねり出すだけでも効きました。

美術品に対する情報における欠損の数(分かっていないことが多いことが魅力かどうかは)とか、意外と効きました。
あとはlong_titleの長さなどは、長すぎるとダメらしく、程よいやつがあるらしいです。
テキストをBERTにせず、単純に「文字列の長さ」で見るだけでもいいというのはなんだか、ふーんという感じでした。

ポテトチップスで書いた情報は全く役に立ちませんでした。所詮ポテトチップス。

コードは?

ごちゃごちゃしているので整理してgithubに上げてLAPrASの評価向上シェアします。

完走した感想

1週間のコンペはつらい。ソシャゲみたいに2週間ならいいのに。
……希望は書いておくべきですが、総じて面白かったです。
何よりコンペの設計がシンプルで、初心者の方にも手を付けやすいタスクだったと思います。
kaggleのtitanicはもう現行コンペの難易度と比べると「簡単すぎる」ので、
今回のatmaCupのタスクが実際標準的なのではないかと思います。
内容としてはkaggleでいうPETFinderに近い気持ちがあります。
テキスト、画像、テーブルデータの全てを使ったコンペでしたが、
今回はそれに近い性質のデータが揃っており、
「非構造データを如何に効く数字に変換するか」がキモだったなあと思います。
PETFinderはいろいろありましたが、コンペとしては面白いコンペで、
いろいろあって日本人チームが優勝しているので、今からでも見ると良いと思います。

しばらくコンペはいいかな……睡眠時間が削られるとメンタルに来るので今日は早く寝ます。

*1:結果が気になって眠れないのが常