1
/
5

機械学習でアパレルECの在庫最適化問題 に挑戦|京都大学大学院|札幌の長期インターンシップ

プロフィール・自己紹介

京都大学大学院 情報学研究科 2年 森谷 建祐

2021/5/1~7/9 週5フルタイムで参加

参加までの流れ

北海道札幌市生まれで、高校までは札幌で暮らしていました。今は京都の大学院に通って数理最適化分野を学習しています。

地元でのインターンシップを探していた時にダイアモンドヘッドを見つけました。

これまでに参加したインターンシップは少人数のベンチャー企業が多く、今回はベンチャー気質を残しながらも規模が大きく、きちんとした会社を探していました。

インターンシップで行っていること

インターンシップでは機械学習を用いて過去の売上数から将来の売上数を予測できないか研究しています。

アパレルECサイトではブランド独自のECサイトとモール型のECサイトなど複数の販売経路があるのですが、販売経路別で割り当てる在庫割合の最適解を機械学習で求めようとしました。

売上データ解析

機械学習の前に、有効な学習データを探らないといけない為、スペクトル分析を用いてデータ解析を行い、売上データの周期性の有効性を探りました。

スペクトル解析から売り上げの周期を求めた所、平日・休日の周期性や、四季毎などで周期性を推測できました。

機械学習モデルの検討

次に販売経路別で割り当てる在庫割合の最適解を機械学習で求める方法を検討しました。

現状の学習データでは、欠損値が多く、多項式回帰やsin波での回帰モデル、ARMAモデルでは、回帰曲線と実測値とのズレが多すぎたり、欠損値が続くと予測誤差が大きくなってしまい、ディープラーニングのLSTMモデルが最適と判断しました。

LSTMモデルでの機械学習

LSTMモデルでは様々なパラメーターを設定でき、どの設定が将来予測として誤差が少ないか検証を行いました。

検証を行う際は、2017~2019年の訓練データ、2020年をテストデータとし、訓練データをもとに予測したデータと、テストデータを比較して精度を確認しています。

LSTMモデルでは何日間分のデータを参照するか設定できるため、売上周期の分析から求められた複数日のうち、それぞれで汎化誤差を用いて確認したところ大差なかったため、より軽い計算となる短周期の日を採用しました。

また、セル数200の隠れ層一層で構築しました。

学習率変動の実験

学習率を減衰させることで目的関数の極小値に徐々に収束できるか数学的な仮説を検証しました。

学習率を徐々に減衰させたところ、学習率を変え始めたエポックから、過学習に向かってしまっている。汎化誤差に関しては、学習初期(1〜5エポック)の値以上になってしまっているので、過学習へ向かっていくのを避けるために、学習率は終始固定することにしました。

学習率を固定した実験

次に最適な固定する学習率について検討を行いました。

学習率=0.01だと50epochあたりを超えると過学習に向かっていきました。

学習率=0.0001だと過学習は起きにくかったですが、訓練誤差・汎化誤差6以上と大きい結果でした。

学習率=0.001だと100epoch以上で過学習に向かっていきました。訓練誤差と汎化誤差が落ち着いている50epochあたりで学習をやめるのが最適と判断しました。

以上の結果より、学習率を0.01、訓練誤差と汎化誤差の値が落ち着いており、さらに過学習が始まる前である50epochsで学習を止めることが最適だとわかりました。

隠れ層のセル数変更の実験

隠れ層のセル数を150から300の間で10ごとにグリッドサーチした結果を以下に示しました。各学習のエポック数は50です。

どのセル数でも訓練誤差や汎化誤差はたいして変わらず、顕著に誤差が小さいセル数を見つけることはできませんでした。処理が重いこともあり、グリッドサーチは使わないことにしました。

次に、隠れ層を一つから二つに増やしてみました。

セル数200の隠れ層を一つとしてモデルを組んでみましたが、セル数100の隠れ層を一つ追加して二層で学習させた結果が以下の図です。

隠れ層が一層のみの場合と比べ、誤差はあまり変わらず、過学習も起きてしまいました。その為、隠れ層は一層にすることにしました。

次に、optunaで最適な隠れ層のセル数を探索してみました。

ベイズ推定で最適なパラメータを行うライブラリ「optuna」を用いて、最適な隠れ層のセル数を100から500の間で探索した結果を以下に示します。各学習のエポック数は50で、試行回数は200回です。

セル数に対しての訓練誤差や汎化誤差に大きな差はありませんでした。optunaの恩恵を得られず、処理が重いということもあり、使わなくてもよいという結論に至りました。

訓練データを標準化した実験

一般的に、時系列データの学習では、「外れ値の影響を小さくする」「学習を速くする」という目的で、データに対してスケーリングを行いました。

ここでは、スケーリングの一手法として、平均を0、標準偏差が1になるように変換を施す「標準化」を試してみました。「正規化」だと、時系列の突発的な大きいデータ値に影響されて、他のデータの表現が薄くなってしまったため、「標準化」を選択しました。

まず訓練データを標準化して、モデルに学習させました。そのモデルに標準化したテストデータを入力し、出力された予測値を、テストデータの平均と標準偏差を使って逆標準化させました。その結果を以下に示します。一番上が逆標準化させたもの、真ん中が標準化されたままのものです。

逆標準化させたグラフを見ると、予測値と実測値にそこまでズレはありませんでした。

学習速度向上のために使えるかもしれないですが、過学習を解決はしませんでした。このテストデータではズレが出ず、標準化を使っても問題なかったのですが、過学習の問題が解決できなかったため、標準化は使わないことにしました。

活性化関数を変更した実験

隠れ層の活性化関数を、tanh, selu, relu, elu, leaky relu(各関数のパラメータはkerasのdefault)に各々変更して学習した結果を以下に示します。左が訓練誤差、右が汎化誤差です。

seluは、訓練誤差が一番低いepochが多いですが、学習が進むと過学習の度合いが他よりも大きかったです。relu、leaky reluの汎化誤差が小さく、訓練誤差もそこそこ小さいのですが、ここではreluとleaky reluで差がなかったため、leaky reluを選択します。

結論

これらの実験をもとに以下のパラメータで設定しました。

・学習率:0.001(減衰なし)
・データの標準化:使用しない
・隠れ層:一つのみ
・隠れ層のセル数:200
・隠れ層の活性化関数:Leaky ReLU(alpha = 0.01)
・出力層の活性化関数:ReLU
・optuna:使用しない
・グリッドサーチ:使用しない

上記の方法で学習させた結果を以下に示します。学習は、過学習が起きる前の絶妙なところで止めています。

インターンシップで得られたこと

機械学習を行うのは初めてだったのですが、社内に機械学習について詳しい社員がおり貴重な経験が得られました。

また、実際のECサイトでの売上データを用いて機械学習できました。大学で実データを扱うのは難しいため、リアルなデータを扱えて良かったです。

インターンシップにご興味をお持ちの方へ

弊社インターンシップに興味をお持ちの方は以下ページから募集要項をご確認くださいますようお願い致します。

また、弊社インターンシップ情報を以下サイトにまとめて掲載しております。ご覧いただけましたら幸いです。

以上となります。ご拝読ありがとうございました。

Weekly ranking

Show other rankings