課題の解法について
一番シンプルなモデルは前回の購入をそのまま再現するモデルです。つまり、前回購入した商品を今回も購入すると予測するモデルで、これは大体のKagglerが最初に試したと思います。このコンペではこれがベンチマークとなり、ここからどう改善するかが勝負でした。
さて次はどうするか。そのベンチマークで当てられていないところを考えます。例えば前回は購入したが、今回(予測期間)は購入しない商品がある。ではなぜ今回は購入しなかったのかというところから考えます。
例えば、ある人に過去10回の購入履歴があったとして、前回初めて購入した商品と、1回目から10回目まで毎回購入している商品では、購入確率が全く違います。一般的に2回連続で買っている商品より3回連続で買っている商品の方が再購入しやすいし、前ページのグラフにあるように時間帯によっても購入確率は変わります。
前ページのグラフはどの商品がいつ購入されたかの確率分布を示しています。面白いことに商品によっていつ購入されやすいかは全く違います。
例えばアイスクリーム。これは夜に購入される確率が高いのですが、逆にヨーグルトやシリアルは朝に購入されやすいのです。ではアイスクリームを毎回買う人が朝にInstacartを訪れたら何を購入するのか。こういったことを想像しながらデータを分析します。
想像しやすくするために、ユーザーの履歴を一覧できるシートを作ってデータを眺めていました。すると、いつも炭酸飲料を買うユーザーが、1回だけ買わないタイミングがあることを発見しました。私が今まで作っていたモデルでは、その商品に飽きたのではないかという考えになるのですが、よく見るとまとめ買い用の商品を買っていたのです。つまり、ある商品が買われなかったとしても、別の商品が代替になっている場合があるというわけです。こういうケースも考慮したモデルを作りました。

また私の場合は、このコンペのためにInstacarでアカウントを作り、実際に注文寸前の画面まで遷移させてみました。米国の郵便番号がないとアカウントを作れないので、ニューヨーク辺りの郵便番号を代用しました。なぜここまでしたかというと、この問題を解くにはユーザーの気持ちを理解することが必要だと考えたからです。
例えば、今回のコンペでは全てのデータがCSV形式で提供され、商品画像は一切提供されません。そのため、「リンゴを買おうと思っていたけれど、オレンジの方が色鮮やかでおいしそうだったのでオレンジを買った」といった状況を想像で考えるほかありません。また、ユーザーインターフェース(UI)の問題で、特定の条件下になると商品が買いにくくなるといった不具合などがあった場合は、その商品の購入確率が下がるはずです。
これらの情報はCSVファイルを眺めているだけでは十分に得られません。そこで、実際にアカウントを作成したというわけです。欲を言えば、実際に購入して宅配されるまでを体験してみたかったのです。そうすることでしか分からないユーザーの体験もあるはずです。
そして、今回のコンペでは、問題の評価指標が特殊でした。ほとんどのコンペでは、予測値である確率を数値のまま提出し、それをもとに評価されます。今回は、次のように「order_id」とその「order_id」が購入するであろう「product_id(複数可)」を提出し、評価が行われました。そのため、予測値を評価指標に合わせて調整するアルゴリズムも自分で考えて実装する必要がありました。

Kaggleには、競技者間で意見交換できるDiscussionや、プログラムを共有できるKernelという機能があります。このコンペの終了間際に自分の考えと同じような論文と、それを実装したプログラムが共有され、そのアルゴリズムを思い付かなかった人が大幅にスコアを上げてきました。他人との差が縮まってくると普通は悲観的になると思うのですが、私の場合はむしろ既に自分がそういうレベルに達しているのだなとうれしくなりました。