teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

3

誤字の修正

2020/10/24 12:40

投稿

toast-uz
toast-uz

スコア3266

answer CHANGED
@@ -59,7 +59,7 @@
59
59
  ```
60
60
  「ズラし」はdfdのところだけを後ろに、dfpとdfoは余計にズラしません。またズラしが無効にならないようにreset_indexでindexを振りなおします。concatでまとめる時に、nanがある行は捨てるほうがよいです。
61
61
 
62
- なお、全体の結果を擬似データで確認すると、30分後の予測、1日後の予測は観測との差が少なく、半日後の予測はそれなりではあるものの観測との差はやや大きい結果になるでしょう。これは当たり前のことで、LSTMはRNNよりは改善されていますが、それでも、昔よりは最近のことにより強く影響されるモデルだからです。1日単位の周期性があるデータは、半日後よりも1日後の方が「今」と類似しています。そのため、半日後予測よりも1日後予測の方が、正確に予測しているようにみえるわけです。
62
+ なお、全体の結果を擬似データで確認すると、30分後の予測、1日後の予測は観測との差が少なく、半日後の予測はそれなりではあるものの観測との差はやや大きい結果になるでしょう。これは当たり前のことで、LSTMはRNNよりは改善されていますが、それでも、昔よりは最近のことにより強く影響されるモデルだからです。1日単位の周期性があるデータは、半日後よりも1日後の方が「今」と類似しています。そのため、半日後予測よりも1日後予測の方が、正確に予測しているようにみえるわけです。
63
63
 
64
64
  100日もデータがあるわけですので、単純なLSTMを適用するのではなく、モデルを工夫してチューニングしてみることをオススメします。個人的には、周期性を考えて、30分後、1日後、5日後(五十日?の周期)、1週間後(平日週末の周期)、などをアンサンブルしてみるとよいかと思います。
65
65
 

2

補足追記

2020/10/24 12:40

投稿

toast-uz
toast-uz

スコア3266

answer CHANGED
@@ -59,7 +59,7 @@
59
59
  ```
60
60
  「ズラし」はdfdのところだけを後ろに、dfpとdfoは余計にズラしません。またズラしが無効にならないようにreset_indexでindexを振りなおします。concatでまとめる時に、nanがある行は捨てるほうがよいです。
61
61
 
62
- なお、全体の結果を擬似データで確認すると、30分後の予測、1日後の予測は観測との差が少なく、半日後の予測はそれなりではあるものの観測との差はやや大きい結果になるでしょう。これは当たり前のことで、LSTMは最近のことよく覚えているモデルだからです。1日単位の周期性があるデータは、半日後よりも1日後の方が「今」と類似しています。そのため、半日後予測よりも1日語後予測の方が、正確に予測しているようにみえるわけです。
62
+ なお、全体の結果を擬似データで確認すると、30分後の予測、1日後の予測は観測との差が少なく、半日後の予測はそれなりではあるものの観測との差はやや大きい結果になるでしょう。これは当たり前のことで、LSTMはRNNよりは改善されていますが、それでも、昔よりは最近のことり強影響されるモデルだからです。1日単位の周期性があるデータは、半日後よりも1日後の方が「今」と類似しています。そのため、半日後予測よりも1日語後予測の方が、正確に予測しているようにみえるわけです。
63
63
 
64
64
  100日もデータがあるわけですので、単純なLSTMを適用するのではなく、モデルを工夫してチューニングしてみることをオススメします。個人的には、周期性を考えて、30分後、1日後、5日後(五十日?の周期)、1週間後(平日週末の周期)、などをアンサンブルしてみるとよいかと思います。
65
65
 

1

問題の修正にあわせた修正

2020/10/24 12:03

投稿

toast-uz
toast-uz

スコア3266

answer CHANGED
@@ -1,3 +1,85 @@
1
- LSTMだと違うかもしれませんがバリデーションデータを使ってテスト(予測)していること問題なのではないでしょか?
1
+ 予測以降処理において入力に対する正解の時間差pred_timeの扱いに間違っている部分あるよです。
2
2
 
3
- [なぜ教師あり学習でバリデションセットとテストセット分ける必要があるか?](https://qiita.com/QUANON/items/ae569961ea02b4468e23)
3
+ 以下のコドにおいて、predは予測値ですので、x_testもとにpred_time後予測となっています。
4
+ また、t_testはもともとpred_time後の正解値です。よって、predとobsの時間差は既に無い状態です。
5
+
6
+ ```Python
7
+ pred = model.predict(x_test ) #予測値
8
+ obs = t_test
9
+ ```
10
+
11
+ にもかかわらず、以下のコードにおいてobsだけをpred_timeずらしています。この行為は意味がなく、これが結果に影響していると考えられます。
12
+
13
+ ```Python
14
+ #最初の1日を削除
15
+ dfd = dfd[int(time):]
16
+ dfp = dfp[int(time):]
17
+ dfo = dfo[int(time - pred_time):]
18
+ ```
19
+
20
+ ただし、この後にconcatしていることで上記の「ずらし」が複雑に作用します。Pandasでは明示的にindex振り直しを指示しない限り、元のindexを維持する形で処理されます。よってconcatの時点で「ずらし」は補正されてしまいます。結局「ずらし」は、頭に余計にNanを作る効果しかもたらせていません。
21
+
22
+ 擬似的な交通量を生成して、質問者様のコードを実行した結果、concat後のデータフレームは以下の形でした。(date_timeは日を単位とするfloatにしています)
23
+
24
+ ```
25
+ date_time Pt_pred Pt_obs
26
+ 720 NaN NaN 4211.390625
27
+ 721 NaN NaN 4310.817383
28
+ 722 NaN NaN 4800.063477
29
+ 723 NaN NaN 3912.796387
30
+ 724 NaN NaN 5271.840820
31
+ ... ... ... ...
32
+ 28795 99.996528 NaN NaN
33
+ 28796 99.997222 NaN NaN
34
+ 28797 99.997917 NaN NaN
35
+ 28798 99.998611 NaN NaN
36
+ 28799 99.999306 NaN NaN
37
+ ```
38
+
39
+ 上記にもかかわらず、質問者様の半日後の結果がズレてみえるのは、csv保存以降の処理で上記の、Pt_predとPt_obsの頭のズレが影響しているように思われます。この点はコードが明示されていないので推測ですが、少なくとも意味の無い「ズラし」が入っているため、これが原因の可能性が高いです。
40
+
41
+ 実際、擬似データをもとに、質問者様のコードに
42
+
43
+ ```Python
44
+ plt.plot(df['date_time'], df[['Pt_pred', 'Pt_obs']])
45
+ plt.show()
46
+ ```
47
+ を付け加えると、半日後であっても、それなりに予測〜観測が一致したグラフが出ます。
48
+
49
+ なお、本来あるべきコードは以下です。
50
+
51
+ ```Python
52
+ #最初の1日を削除
53
+ dfd = dfd[int(time + pred_time):].reset_index(drop=True)
54
+ dfp = dfp[int(time):].reset_index(drop=True)
55
+ dfo = dfo[int(time):].reset_index(drop=True)
56
+
57
+ #predとobsのDataFrameを一つにまとめる
58
+ df = pd.concat([dfd, dfp, dfo], axis=1).dropna()
59
+ ```
60
+ 「ズラし」はdfdのところだけを後ろに、dfpとdfoは余計にズラしません。またズラしが無効にならないようにreset_indexでindexを振りなおします。concatでまとめる時に、nanがある行は捨てるほうがよいです。
61
+
62
+ なお、全体の結果を擬似データで確認すると、30分後の予測、1日後の予測は観測との差が少なく、半日後の予測はそれなりではあるものの観測との差はやや大きい結果になるでしょう。これは当たり前のことで、LSTMは最近のことをよく覚えているモデルだからです。1日単位の周期性があるデータは、半日後よりも1日後の方が「今」と類似しています。そのため、半日後予測よりも1日語後予測の方が、正確に予測しているようにみえるわけです。
63
+
64
+ 100日もデータがあるわけですので、単純なLSTMを適用するのではなく、モデルを工夫してチューニングしてみることをオススメします。個人的には、周期性を考えて、30分後、1日後、5日後(五十日?の周期)、1週間後(平日週末の周期)、などをアンサンブルしてみるとよいかと思います。
65
+
66
+ 以下補足として、私が擬似データを作成するために使ったコードを示します。
67
+
68
+ ```Python
69
+ import numpy as np
70
+ from scipy.interpolate import interp1d
71
+
72
+ # 擬似的にdays日分の1分間隔の交通量を生成
73
+ days = 100
74
+ # まずは1日分作成、1日4つの時点のみ、質問者様のグラフを見て目分量でプロット
75
+ linear_interp = interp1d([0, 4, 7, 15, 24], [5000, 3000, 13000, 14000, 5000])
76
+ # 上記を直線で補間して1分間隔のデータにする
77
+ linear_results = linear_interp(np.linspace(0, 24, 24*60))[:-1]
78
+ # それを単純結合してdays日分にする
79
+ linear_results_days = np.array(linear_results.tolist() * days)
80
+ # ノイズを加える
81
+ noise = np.random.normal(0, 500, linear_results_days.shape)
82
+ Pt = linear_results_days + noise
83
+ # dateは1日を1.0のスケールにする
84
+ date = np.linspace(0, days, 24*60*days)[:-1]
85
+ ```