はじめに
DROBE ではユーザーとアイテムのマッチ度を算出するモデルを利用していますが、ユーザー側の特徴量として商品の提案日というものを使っています。
これは、例えば夏に商品を提案する際にコートを提案するのはあまり意味が無いという事から、ファッションにおける推薦には季節性を考慮する必要があるという所をモチベーションとしています。
この記事では日付を特徴量として使った際に線形モデルで季節を予測してアプリケーションで使う際の注意点について解説します。
特徴量としての配送日
配送日は日付なので、循環するものであると言えます。例えば12月31日と1月1日はとなり合わせの日付なので特徴としては非常に近いはずです。
ところが日付をそのまま入力とすると、機械学習のモデルは12月31日と1月1日の間に数字的な繋がりを見出す事が出来ません。
そこでモデルが日付を循環したものとして捉えられるように三角関数を使って日付を変換します。
(このコードは こちらの記事 を参考にさせていただきました)
上記関数を使ってエンコードすると、以下のような dataframe を得る事が出来ます
Plot してみると、循環的な性質を持っている事が良くわかります
sns.scatterplot(data=df, x='yday_cos', y='yday_sin', hue='season')エンコードされた日付を使って季節を推定してみる
このように sin cos にエンコードされた日付を使えば数字的な繫がりを加味した入力と出来そうですが、実はこのデータを線形モデルの入力としてそのまま使うと思わぬ落とし穴にハマる可能性があるので解説します。
作られたデータを使って以下のようなコードで季節を推定してみます。
まずは季節が春である事を判断出来るかどうかを試してみます。推定には sklearn の LogisticRegression を使います。
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
solve(lr, target_seasons=["SPRING"])sin cos にエンコードされた日付データから、上手く春を推定できている事がわかります。
LogisticRegression accuracy=1.0 target_seasons=['SPRING']
次に季節が 春 or 秋 である事を判断できるかを試してみます。
lr = LogisticRegression()
solve(lr, target_seasons=["SPRING", "FALL"])LogisticRegression accuracy=0.5506849315068493 target_seasons=['SPRING', 'FALL']
このように、全く判断出来ていない事がわかります。
ちなみに、冬 or 春 といった隣り合った季節の推定は問題なく出来ます。
lr = LogisticRegression()
solve(lr, target_seasons=["SPRING", "WINTER"])LogisticRegression accuracy=1.0 target_seasons=['SPRING', 'WINTER']
これは直感的には以下のように考える事ができると思います。
単一の季節や、春と冬、といった隣り合わせの季節は直線を 1 本引けば分離可能なので線形モデルで判断が可能です。一方で、春と秋、といった隣り合っていない季節は分離するためには直線を 2 本引く必要があり、線形モデルでは判断が不可能であると考えられます。
このようにエンコードされた日付を入力として使った場合に、線形モデルを使ってしまうと上手く特徴が使えない事があり得るという事がわかります。
非線形モデルでの挙動
それでは非線形なモデルではどのような挙動になるかを試してみます。
from sklearn.ensemble import RandomForestClassifier
rfc = RandomForestClassifier()
solve(rfc, target_seasons=["SPRING", "FALL"])このように、隣り合ってない季節でも正確に予測する事が出来ます。
RandomForestClassifier accuracy=1.0 target_seasons=['SPRING', 'FALL']
まとめ
ファッションにおける推薦に欠かせない季節性を考慮する際に重要となる日付データの取り扱いと、線形 / 非線形モデルによる挙動の違いについて解説しました。
データを上手く作っても、モデルの特性によっては望んだ性能が得られないといったケースがあり得てしまう事を検証しました。
アプリケーションやデータによって、どういったモデルを使うのか、また選択したモデルでデータを上手く扱う事が出来るのか、といった事を考慮に入れながら開発をしていくのが大事だと考えいます。
参考にした記事
時系列コンペでよく使用されるsin, cosへの変換とは - Qiita
塩コンペに関しては、大会1位を飾ったphalanxさんが 記事 を書いているのでぜひとも参照してください!自分もやったことは記事内の2ヶ月〜最終日以外はほぼ同じです。 時系列のコンペでは、特徴量として各訓練例が取得された時間や日付を組み込むことがあります。 しかし hour ...
qiita.com
