前回まででitem, shop, categoryのrank化とその区分化、そしてdateを年月日に分解して予測し、1.41241というスコアを得ました。
素人の割に素早くそこまでいけたし、これは割とすぐにスコア上がっていくだろうウヒヒヒと思っていたのですが、ここから伸び悩みました。
試したのは、決定木ではなくランダムフォレストの使用、時系列を数値とみなした上で、線形回帰など試してみたのですが変化なし。売り上げを月ごとにまとめてみたのですが、悪化こそすれ良化せず。。。
と3日くらい悩んだところで、kaggleにある先輩方のNotebookを参考にすることにしました。当然コピペしても意味ないので、ざっと見て要素を取り出し次の一手を定めることにしました。
参考にしたのは、Feature engineering, LightGBM – Top 1%というタイトルの下記の先輩のNotebook.
https://www.kaggle.com/uladzimirkapeika/feature-engineering-lightgbm-top-1
先輩がやってたこと
1. 外れ値の削除
具体的にはitem_price, item_cnt_dayを箱ひげ図で見て、外れ値を確認してフィルターをかけていました。確かに他に比べて大きい値があったらそれにかなり引っ張られてしまいます。基本でした。。。
2. 重複するshopの抽出
重複しているshopの名前を検出して、そのshop_idを変換し同じものとしていました。これは影響どんなもんなんだろう???それほど大きくない気もしますが、とりあえずメモ。
3. シンプルなtrainデータセットの作成
date_block_num, shop_id, item_idのカラムとそれらをグループ化して合計値をitem_cnt_monthとして作成し、その二つを結合します。この時shop_idとitem_idはそれぞれuniqueであるようにしています。この辺りの細かい処理が差になるのかも。
4. testにdate_block_numを結合
僕は2015年11月としてtestを扱ってましたが、date_block_numのみで時系列情報を表現しているようです。この辺りも結果に差が出る要素なのでしょうか。
5. shopの情報をテーブル化
ロシア語なので触れなかったshop_nameを分解し、cityの名前を抽出して座標を辞書化して、shopテーブルを作成してます。その座標を(a,b,c)として入力し、テーブルの中にそれぞれを格納しています。shop_name, a, b, cとコード化したcitynameを入力。この辺りのコードはぱっと見わからないので解読しながらじゃないと参考にできなさそう。shopのrankよりも正しい。ちなみに座標のcはcountry_codeらしいです。これもどうやって調べるんだろう?
6. itemテーブルの作成
こちらもロシア語で解析しなかったcategoryを解析。こちらは共通で入っているワードを抽出して、共通カテゴリーワードを抽出しています。その後item_idをキーとしてテーブルに結合してます。ふとみるとtrainとtestを結合してますね。
7. calenderの作成
休日の数とそれぞれの月の日数を計測してテーブルに結合。これまたコードがよくわからない。。。休日と平日のそれぞれの日数が売り上げに影響あるということですね。
8. itemが何回売れたかを記載するテーブルを作成
新製品から古くなるにつれて売れずらくなるというものですね。確かに想定する2015年11月に新製品として出るものと、3年前から売っているものでは売り上げは異なります。しかも過去に売れたこともないitem=新製品は今までのやり方では全く売れない予測となってしまいます。これも盲点でした。
9. itemの平均priceを追加
itemはshopや月によってpriceが変わっていきます。その平均値を追加しています。ここもコードが難しい。。。
10. Target Encording
直近3ヶ月のデータを使って、それぞれの特徴量を強化しているようです。馴染みがなく、不勉強でしたが特徴量を新たに作成しているようです。単純に考えたら直近3ヶ月のデータは影響が強いからとかそんな単純な考え方で良いのか?
ということでコード理解に大いに不安はありますが、改善のため特徴量エンジニアリングとしてやってることを整理しました。
僕の知識的に上記を理解しながら改善するのは困難だったため、このコンペは一旦終了しようと思います。
また他のコンペや本による学習を行った上で再度トライしていこうと思います。最終コード、順位は別途noteあたりでまとめようと思います。そのうち・・・