ディープラーニングで時系列データの未来予測をしてみよう〜RNN(LSTM)〜【Python時系列分析#4】
Вставка
- Опубліковано 5 вер 2024
- 今回は前回のモデリングとは違い、機械学習を使った方法で時系列の未来予想をしてみます。
この動画ではディープラーニングのRNN(再帰型ニューラルネットワーク)の一種である「LSTM」と呼ばれる手法を用いています。
【参考にさせて頂いたWeb Page】
data-viz-lab.c...
toeming.hatena...
axa.biopapyrus...
いつも勉強になります!
ディープラーニングを使った回帰(?)も取り上げていただけたら嬉しいです。
職場でディープラーニングを使った顧客生涯価値の予測の話が出てきて、GoogleにDNNの記事があるのを見つけたのですが、今ひとつピンときませんでした。
因果推論の動画も楽しみにしています。残暑も厳しいかと思いますが、お体に気をつけて。
嬉しいコメントありがとうございます!
ディープラーニングを使用して数値を予測することも可能ですね。
以下の動画は画像分類ですが、インプットとアウトプットの形式を数値データにすれば実装可能なので、もしよろしければ取り急ぎご参考にしてください。
ua-cam.com/video/ThKRS7B5GFY/v-deo.html
まだまだ暑い日が続きますが、どうかご自愛ください。
@@nishimaki 画像分類を応用するとは思いつきませんでした!早速挑戦します。
丁寧なリプライ、ありがとうございます😊
本動画で使用しているソースとファイルのダウンロードは下記URLからどうぞ。
analysis-navi.com/?p=3868
非常に勉強になりました!多変量LSTMの解説動画も期待しています!
ご視聴ありがとうございます。
多変量は一応、動画の後半で扱っているつもりなのですが。。。汗
こちらとは違いましたかね??
@@nishimaki 動画の後半で予測された気温は、過去の気温と降水量、日照時間の3つが説明変数に使われているのでしょうか?
はい、前半では気温のみを説明変数かつ目的変数に、
後半では3つの変数すべてを説明変数かつ目的変数としております!(グラフがごちゃごちゃになるので1つずつしか表示しておらず、分かりづらかったかもしれませんが。。。)
@@nishimaki なるほど、ありがとうございます!(単変量を3つ同時にやっているものだと勘違いしていました・・・汗)
これからの動画も楽しみにしています!
いつも動画を参考にさせて頂いています。ありがとうございます。
自身の勉強も兼ねて時間と圧力のLSTMの作成をしてみました。
途中までは実行できたのですが、未来予測のコードで、valueErrorが出てしまいます。
原因はアップされているコードだと自身のプログラムには必要のない日付のラベルが組み込まれてしまうことでした
いろいろと試して見たのですが上手く行きません。御手数ですが、コードのどの部分を消せば日付のラベルを外すことが出来ますか?
こちらこそ、ご視聴ありがとうございます。
日付のラベルを消すだけで宜しいでしょうか?それでしたら、
データフレーム名.reset_index().drop("年月日",axis=1)
で消えるかと思います。
@@nishimaki ありがとうございます.早速試させて頂きます.
7:56 「基本的には標準化を、データの最大値・最小値が定まっていて外れ値が存在しない場合には正規化を使用する」と別の場所で習ったのですが、気象データという最大値や最小値が決まらないデータに対してなぜ正規化を用いているのでしょうか?
標準化と正規化のどちらにするか、決まったルールは無いので難しい所とは思います。
東京の1日平均気温はまず-5度〜40度には収まるでしょうし、日照時間は必ず0〜24の間なので正規化でも良いかなと考えましたが、
降水量は上限が読めないので仰る通り標準化の方が適していたかもしれません!
@@nishimaki ありがとうございます!
動画ありがとうございます。教えていただきたいのですが、
動画後半で3変数を使って予測をしていますが、これは過去の「平均気温」「降水量」「日照時間」から未来の平均気温を予測しているという認識で良いでしょうか。
それとも「平均気温」は過去の平均気温、「降水量」は過去の降水量のみを説明変数としてそれぞれ予測しているのでしょうか。
こちらこそご視聴ありがとうございます。はい、LSTMでは一般的に「平均気温」「降水量」「日照時間」すべての変量が平均気温の予測に関与しています。降水量、日照時間についても同様に、すべての変量を用いて予測がされています。
ありがとうございます!色々な要素で予測できるのは便利ですね!
度々で申し訳ないのですが、売上予測をする場合に天気を説明変数に用いる場合、これらは晴:1雨:2曇:3のようにすればLSTMで使うことができるんでしょうか?それともこの手法は気温のように連続値でないと駄目でしょうか?
はい、それでも実行可能ですが、その場合「晴フラグ」=0 or 1、「曇フラグ」=0 or 1のように2変数に変換する方が望ましいかと思います(2つのフラグがいずれも0なら雨と分かります)。
晴:1雨:2曇:3と変換してしまうと、あくまでコンピュータは数字として処理するので「晴と曇の差は、晴と雨の差の2倍」のような解釈をしてしまい、変な結果が得られてしまう可能性があります。
@@nishimaki
なるほど、、0か1かで分けた方が良いのですね。ありがとうございます!
大学の卒論で時系列分析に取り組み始めた初学者です!動画全4本非常にわかりやすかったです
動画と全く関係ないのですが、
深層学習で平均二乗誤差による誤差関数を用いた時に誤差の単位は何になりますか?
1/N( y - t )^2 で求めると思うのですがよくわからなくて、、、
調べても単位のことは書いてるページがなく、身近にも聞けるひとがいなかったため
コメントさせていただきました。。。
P.S. 分析しているのは動画と同様に気象の気温です
ご視聴ありがとうございます!
基本的には誤差の単位というものは定義しないと思います。
例えば「モデルAの誤差が0.1で、モデルBの誤差が0.2」だった場合に「誤差が小さいモデルAの方が良い」と判断する際に使うものなので、0.1や0.2の単位が何だろうと関係ないんですよね。
なので、単位はつけずに数値だけで表現されるものと考えて良いかなと。
@@nishimaki
返信ありがとうございます!
あともう一つ関係のない質問なのですが、
気温分析の指標にlossではなくaccuracyを使うのはやはり一般的ではないですか?
accuracyはカテゴリ予測の時に用いる指標なので、気温データなどの数値予測の場合はMAEなどの指標を用いるかと思います。
lossはモデルの学習のための「損失関数」として使用する事が一般的な気がします。
@@nishimaki
なるほど
度々ありがとうございます!
@データサイエンス塾!!
分かりやすくいつも勉強させて頂いております!
自分でもほかのデータを使って実装したのですが、精度確認部分で以下のエラーが出ました。。
>model.evaluate(X_test,y_test,batch_size=1)
OverflowError: cannot convert float infinity to integer
調べてみると、float が無限大に小さくなりすぎているとの事でした。
>import sys
>sys.float_info.min
2.2250738585072014e-308
また、それぞれの中身を見ると行列が空っぽでした。。。
>X_test
array([], shape=(0, 30, 1), dtype=int64)
>y_test,
array([], shape=(0, 1, 1), dtype=int64)
この場合精度を実装するにはどうしたらよろしいでしょうか?
ご視聴ありがとうございます!
X_test、y_testが空っぽなのがおかしいですね。
ご使用されているデータのフォーマットと、本動画で紹介しているデータのフォーマットは同一でしょうか?
めちゃくちゃ参考になります!
質問ですが、例えば日照時間を説明変数に、降水量と気温を目的変数にしたい場合、どの辺を変えたらいいですかね?
ありがとうございます!
その場合は、create_input_data関数を少しいじる必要がありそうですね。
今回、全体のデータフレームからXとyをそれぞれ抽出していますが、
まず日照時間のデータフレームと平均気温・降水量のデータフレームに分離してから、それぞれの要素をX,yにappendしていく形になるかと思います。
具体的でなくてすみませんが。。。
@@nishimakicreate_input_dataに代入するdf_week_scale_trainとかを変えるだけじゃなくて、データフレーム自体を分割する必要があるって事でしょうか?
やり方は色々あるかと思いますが、データフレームを分割しないならば、
X[j].append(raw_data[j][i:i + look_back])
y[j].append([raw_data[j][i + look_back]])
の1行目のraw_dataをraw_data[["日照時間"]]みたいにして、
2行目のraw_dataをraw_data[["降水量","気温"]]みたいにする方法でも良さそうです。
こちらの方が楽かも知れないですね。
@@nishimaki 丁寧にありがとうございます😊
この動画を参考に、日経平均株価の時系列データで、株価予想をしようと思っているのですが、
NotImplementedError: Cannot convert a symbolic Tensor (sequential_2/lstm_6/strided_slice:0) to a numpy array.
This error may indicate that you're trying to pass a Tensor to a NumPy call, which is not supported
というエラーがでます、検索すると、numpy のバージョンを落とせみたいなことを言われますが、うまくいきません。
numpy とテンソルフローで、いつもこのエラーがでるので、止まっています。
torchだとこのエラーは出ないのですが、いい方法があればご教示いただければ助かります。
よろしくおねがいします
ご視聴ありがとうございます。
そのエラーには当方も遭遇した事が無いのですが、調べたところnumpyのバージョンを落とす以外にもpythonやTensorflowのバージョンを変える方法もあるようです。
大した情報でなく申し訳ありませんが、お試しください。
ご参考:exerror.com/notimplementederror-cannot-convert-a-symbolic-tensor-lstm_2-strided_slice0-to-a-numpy-array/
@@nishimaki 忙しい中ありがとうございます、ついでに、天候の時系列分析は、実用性がほぼないので、株価とか、競馬とか、実用的な例題で、かつ、torchでやってもらうのを期待しています。わがままですみません。
ご意見ありがとうございます。ネタ帳に入れさせて頂きます。
今後ともよろしくお願いいたします。
@@nishimaki お騒がせしました、動きました。ターミナルでnumpyのアンインストールとバージョン下げて再インストールをやって、バージョンダウンしないので諦めていたのですが、anacondaのナビゲーターのenvironmentsのinstalled,numpyの緑のチェックを押した時に出る、mark for specific version installというところで、バージョンダウンしたら、1.19.2が入って、うまくいきました。ありがとうございます。ただし、baseのところでやろうとしたら、pythonのバージョン下げろみたいなことを言われてうまくいきませんでした。
わざわざご連絡頂きましてありがとうございます。解決されましたようで何よりです。
最近ディープラーニングを学びはじめました!とても参考にさせて頂いてます!16:55のところでわたしも同じエラーが出たのですが、どうすれば次に進めますでしょうか。
ご視聴ありがとうございます!
早足で進めてしまってすみません。ここでは変数X_trainに代入する処理を実行していなかったため、「"X_train" in not defined」というエラーが出ています。
なので、X_trainを定義したセルを実行すればエラーは消えるかと思います。
@@nishimaki
x_trainの定義とはどのようにすればよいのでしょうか。私の学習不足で、初歩的な質問ですみません😭
X_train = ○○、という処理を行うと、X_trainが定義されます。
ソースコードは動画のものと同一でしょうか?
でしたら、11:27〜説明している部分になります。
とても参考になっています。
ありがとう御座います。
質問ですが、学習実行したときにlossがnanとなり予測ができません。
どうすれば良いでしょうか。
データは、2021年の天気を使用してます。
ご視聴ありがとうございます。
ソースコードはダウンロードしたものをそのままお使いでしょうか?
@@nishimaki
ご返信ありがとう御座います。
ソースコードは
データ読み込みの週ごとに集計するところを10分ごとに集計するように変えました。
ほかは変えてません。
承知しました。理由は様々考えられますが、まずはX_trainやy_trainに正しく値が入っているかご確認されるのが良いかなと思います。
また、10分ごとに集計するように変えたとのことで、データ自体にnanが入っていないかも今一度ご確認してみてください。
@@nishimaki
データが抜けている箇所があるので、nanが入ってしまっています。
この場合、予測は難しいでしょうか?
データが抜けている状態そのままでは難しいかなと思うので、前後の値に基づいて穴埋めするのが良いかと思います。
時系列データの欠損値を穴埋めする方法ですが、下記動画の9:28〜あたりからご参考になりませんでしょうか?
ua-cam.com/video/aLyEQQ6_-gQ/v-deo.html