St_Hakky’s blog

Data Science / Human Resources / Web Applicationについて書きます

【Kaggle】「Mercari Price Suggestion Challenge」に参加したあと、改めて色々調べてみたのでまとめる

こんにちは。

Mercariが主催したKaggleのコンペティションである、「Mercari Price Suggestion Challenge」について、過去に参加して色々見ていたんですが、機会があって改めて調べてみることにしたので、調べた内容とかをまとめてみました。

今回のコンペの概要

コンペの内容

コンペの内容としては、「有名なフリマアプリであるMercariの中で、出品者が出品する際の商品の価格をレコメンドすること」です。

具体的には、過去の出品者が出して来た商品の情報、例えばアイテムの状態やブランド名、説明などから商品の価格をレコメンドすることが求められます。

過去の出品者の価格を元に商品価格のレコメンドを行うので、その意味では「あなたの商品の状態なら、このくらいの価格が過去の出品状態からすると適正ですよ」みたいなのをレコメンドする機能とかに使えそうです。

完全にこれは妄想ですが、フリマでお金儲けしている人とかだと、「如何にして売るか」みたいなのがメインになるので、少し違う観点から価格を決めたいとかはあるかもしれませんが、一般の出品者からすると「とりあえずみんなが出しているっぽい価格」みたいなのでいいと思うので、普通にアプリ内で登場してもおかしくなさそうな機能だなぁと思って見ていました(メルカリのアプリ使ったことないので知らないんですが、もしかしたら既にそういう機能があるのかもしれませんが)。

Kernels Only

今回のコンペは、「カーネルのみでデータのロード、前処理、モデルの学習、予測までを全部1時間以内に行う必要がある」という点が特徴的で、Kaggleのカーネル内で、前処理・モデルの学習・予測の全部を60分以内に終わるようにする必要がありました。

なので、計算機のスペックに依存しない戦いができるということで、よりフェアな戦いができた感があります。他のコンペだと、

  • そもそもデータセットが大きすぎて無理
  • 大きなモデルを沢山作って、力技で勝つ

みたいなこともあったりして、どのくらい課金するかみたいなところが勝負になるところもありますが、今回はKernels Onlyということで、その意味ではだいぶフェアだなぁと思いました。

Kernelのスペックとしては、

  • 16 GB ram
  • 1 GB disk
  • 4 core

という感じでした。

このようなルールもあった関係で、「2nd stageの方のテストデータを予測した時に、制限時間内に終わるのか」みたいなディスカッションがあったのですが、「とりあえず1st stageで終わっていれば確実に終わるようにするよ」みたいな感じで、そういうのも見ていて面白かったです。

今回のコンペ、私のようなお金のないガチ勢にとっては良かったのですが、稀に良くKernelが落ちていたので、とてもイライラしたというのはあります笑。

イベントもやっていた

先日、MercariでこのKaggleの優勝者の皆さんを集めてイベントをされていました。ツイッターに流れている、イベントの様子をみるだけでもめちゃめちゃ面白いので、ぜひ見て見てください(笑)(ちなみに私は予定が合わなくていけなかった、、、行きたかった、、、)

togetter.com

ブログでまとめてくださっている方もいます。会場の雰囲気とかはこれで結構わかるので、行けなかった身としてはとても嬉しい。

メルカリという日本の会社が出したコンペだったので、余計にそう思ったところがありますが、Kaggleの使い方みたいなところがうまくわかるなぁと思いました。

企業がコンペを出す意味というところは、以下の3つが主にあげられるかなぁと思います。

  • 採用活動
  • サービス/会社の宣伝
  • 良い解法の獲得

今回のメルカリが出したコンペは、これらのメリットをフルに生かしているなぁと感じました。

まず、題材が実際に使われそうなものであったので、実際のサービスの宣伝にもなりました。良い解法の獲得という意味でも、Kernels onlyという制約を設けることで「とんでもない計算量を要するモデル」みたいなのを防ぐこともできていたように思います。また、このコンペの後に優勝者や日本で上位だった方を読んでイベントも行なっていたので、その意味でも優秀なデータサイエンティストを採用するという意味ではかなり良かったのではないでしょうか。

Kaggleの問題を出す側としては、とてもお手本になるようなコンペだったと思います(Kaggleのコンペを出す側になることはないだろうけど)。

Kernels

EDA

データ分析をする前に必ず読むといっても過言ではないし、ちょっと遅れて参加したコンペとかでは必ず上がっているEDAですね。

今回のコンペでは、以下の3つのEDAがめちゃめちゃ参考になりました。

一番上のやつとか、すげー頑張っていて、自分でやる気も失せるくらいでした笑。

Top入賞者の解法を眺めてみる

優勝者の解法

優勝者の解法がコンペの後にしっかりと公開されていて、とても嬉しい限りです。とっても勉強になりました(正直、まだ100パーセント理解していない)

参考になるリンクを以下にあげていきます。

コードを見てもシンプルすぎて禿げますね(禿げないけど)。また、解法を解説したスライドもGithub上に上がっていました。

また、このコンペの解説動画を出している方がいますので、解説はこちらを見たほうがいいと思います。わかりやすかったです。

youtu.be

余談ですが、Kaggleのさいつよが集まったslackもこの動画を解説されている方が出しているので、そちらもぜひ。とても有益な知見がガンガン投稿されていて、普通にびっくりします笑。


Top陣の解法

トップ数パーセントにいる人たちの解法が上がっていたので、それをまとめてみました。

参加しての反省点

時間をめちゃめちゃかけないとどの道上位にいけない

途中までは結構順調に行っていたのですが、途中からスコアが伸び悩んでしまい、また修論などに重なってしまったのもあって、進捗が出せずそのままFinishになってしまいました…。

途中まではBaseラインのモデルを元に、前処理の内容とかを追加したりとかしていたんですが、気づいてしまったこととして、「人間性を捨ててスコアをあげるしかない」ということがあります。

ちなみに、「Kaggle 人間性」でTwitterで検索すると、やはり人間性を捨てているのかぁという気持ちになります。

twitter.com

正直スキルなどにも依存する部分もあると思いますが、最後の方になってくると「気合い」みたいなところも大事なんだなぁと思いました。

通常のNLPでよくやることをやってしまった

いわゆる前処理みたいなところとかを一通り試したんですが、これをやってしまうと時間が全然足りなくなり、なんとか高速化の道を模索していたんですが、優勝者の回答をみるとこれがダメだったみたいです…(辛い)

どう頑張っても時間がかかるなぁって思った瞬間に、やめるべきだったなぁと。

Kaggleの楽しみ方(なぜこのコンペに参加したか)

もちろんKaggle上で戦いたいというのもあったんですが、結構勉強にモチベーションがあったりしたので、そこらへんも書いて置こうかなと思います。

個人的な考え

メルカリのコンペは自然言語処理がキーだったのですが、私自身が自然言語処理にあまり詳しくなく(やったことがないわけではないが)、結構試行錯誤してやりました。

その過程で色々勉強になることもありましたし、得られるものもたくさんありました。カーネルを見て「あーこうやってやれば良いのかぁ」ってもったり、ディスカッションを見て「なるほど、このライブラリもあるなぁ」とか思ったりしていました。

なので、競い合うのがKaggleの目的なのかなぁと思っていたのですが、Kaggleはいろんな楽しみ方があるなぁと改めて思いました。

とりあえず分野ではなくてもやってみる、って感じが大事なのかなぁと思いました。


それでもやっぱり神の領域に近づきたい

とは言ってもやっぱり、神の領域に近づきたいなぁと思うわけですよね。

Kaggle – 神々に近づくために | threecourse's memo

頑張ろう。

今後も参加したコンペについては何かしらあげていきます。