前回に続き、SIGNATEの「お弁当の需要予測」をやっていきます。
ds-blog.tbtech.co.jp
前回はチュートリアルで紹介されているコードを実装してみましたが、
課題が残っていましたので、そちらに取り組みたいと思います!
考察1
前回のチュートリアルの結果を見てみます。
上に飛び出た日はかなり予測できていますが、小さく上に凸した日や
売り上げが下がった日は殆ど予測できていませんでした。
その原因は何だったのでしょうか?
まずは、前回学習に使った変数を確認します。
cols = ["precipitation","weather","days","fun","curry"]
この5つの説明変数が使われました。
売り上げyとの関係を示すために使った箱ひげ図も見てみます。
これを見て「week」も少なからず「y」に関連があるように思いました。
なので説明変数に「week」を追加します!
再学習1
変更点
コードの変更点はcolという変数にカラム名を指定する箇所のみです。
trainとtestでそれぞれ指定しますので2箇所変更しました。
cols = ["precipitation","weather","days","fun","curry","week","y"]
cols = ["precipitation","weather","days","fun","curry","week","y","t"]
結果1
では学習結果を見てみましょう!
RMSE(平均平方二乗誤差)は7.986→7.066に下がりました!(低いほど良い)
グラフは、小さく上に凸の部分が先程に比べ予測できているようです。
考察2
続いて売り上げが下がる日について考えます。
グラフを見ると、売り上げが60を下回る日は予測できていないようです。
そこで売り上げが60以下の日のデータを抽出し、lowというDataFrameを作ります。
low=dat[dat.y < 60]
抽出した売り上げの低い日の分布が、周期的なのかそうでないのかを確認します。
分布の確認にはlowのindex値をy軸に取ります。
[1]グラフのx軸用の変数として、lowの長さと同じ連番の数を用意します。
始まりの数がindexと同じ1になるように+1をします。
[2]lowのindexをy軸に取り、グラフに表示します。
x_index=np.array(range(len(low)))+1 plt.plot(x_index,low.index)
グラフを見てみると、傾きがおおよそ一定になっているようなので
売り上げが低い日は、周期的に発生しているようです。
そこでデータに新たに「low」という変数を作り、売り上げが60以下の日に1を
それ以外の日は0を入れていき、周期的に発生する変数を作成します。
再学習2
変更点2
変更点は変数「low」を新たに追加する点と、
先程の変更と同様に、使用する変数に「low」というカラム名を追加する点です。
dat["low"] = dat["y"].apply(lambda x: 1 if x < 60 else 0)
cols = ["precipitation","weather","days","fun","curry","week","low","y"]
cols = ["precipitation","weather","days","fun","curry","week","low","y","t"]
結果2
では学習結果を見ていきます!
RMSEは7.066→5.034に下がりました!!
グラフを見てみると、下に凸の部分が以前に比べかなり予測できています。
投稿し直し
以前の記事と同様にtestデータで予測した結果を投稿します!
前回の結果は,,,
61.17656でした。
そして今回の結果は,,,
11.87758でした!
順位は2736位→225位に上がりました!!
チュートリアルさまさまです(≧∇≦*)
次回は更に改善をしてもっと精度を上げるよう頑張ります!!