質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

1824閲覧

[Python] 時系列分析(ランダムフォレスト)がしたいです-その2-

mango55

総合スコア22

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/06/28 12:29

編集2020/06/28 21:23

時系列分析(ランダムフォレスト)で将来の人数を予測しています。

手元のデータ集計期間が短いため、ある特定日を用いて翌日、翌々日の人数を予測したものを学習データ、実際の人数をテストデータとして予測を行いたいです。

実現したいことを達成するためのコード修正についてご指摘頂けないでしょうか。

実現したいこと
① ある日で翌日、翌々日の人数を予測(データを増やす)
② ①を用いて将来的な人数を予測(将来の予測)

色々試行錯誤※しているのですがどうしても最後までたどり着きません。
よろしくお願いいたします。

python

1%matplotlib inline 2import matplotlib 3import matplotlib.pyplot as plt 4import numpy as np 5import pandas as pd 6from sklearn.linear_model import LinearRegression 7from sklearn.tree import DecisionTreeRegressor 8from sklearn.ensemble import RandomForestRegressor 9from sklearn.model_selection import GridSearchCV 10from sklearn.model_selection import train_test_split 11from sklearn.metrics import mean_squared_error 12 13dataset = pd.read_csv('file_0627.csv') 14dataset.head() 15 16target_col = 'patient' 17exclude_cols = ['date','patient','14day_exclusion_rate'] 18feature_cols = [] 19for col in dataset.columns: 20 if col not in exclude_cols: 21 feature_cols.append(col) 22 23y = dataset[target_col] 24X = dataset[feature_cols] 25 26X_train_val, X_test, y_train_val, y_test = \ 27 train_test_split(X, y, test_size=0.3, random_state=1234) #分割1 28 29X_train, X_val, y_train, y_val = \ 30 train_test_split(X_train_val, y_train_val, test_size=0.3, random_state=1234) #分割2 31 32rf = RandomForestRegressor(random_state=1234) 33rf.fit(X_train[X_vars], y_train[Y_vars]) 34 35for fday in pred["date"]: 36 idx = pred[pred["date"] == fday].index[0] 37 pred_value = rf.predict(pred.loc[pred["date"]==fday, X_vars].values.reshape(1,-1)) 38 39 for i in range(len(Y_vars)): 40 prefix = re.match(r'(Date_\w+)_[0-9]+', Y_vars[i]) 41 target_list = prefix[1] 42 43 # Date⁺1 44 prefix = re.match(r'(Date_\w+)_[0-9]+', Y_vars[i]) 45 target_var1 = target_list + "_1" 46 pred.loc[pred["date"]==fday+datetime.timedelta(days=1), target_var1] = pred_value[0][i] 47 48 # Date⁺2 49 target_var2 = target_list + "_2" 50 pred.loc[pred["date"]==fday+datetime.timedelta(days=1), target_var2] = pred.loc[pred["ds"]==fday, target_var1].values[0] 51 52y_train = rf.predict(X_val) 53rf_mse = mean_squared_error(Y_val, y_train) 54print('Random Forest RMSE: ', np.sqrt(rf_mse)) 55

使用している特徴量
'date', 'patient', '6day_exclusion_rate', '14day_exclusion_rate'

※困っていること
実現したいこと①の箇所 
rf.fit(X_train[X_vars], y_train[Y_vars])以降の訂正方法が分からないです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2020/06/28 12:41

「たどり着きません」を具体的に説明できますか?(質問に追記してください)
R.Shigemori

2020/06/28 12:54

実現したいことを整理したほうがいいかと思います。 ③のランダムフォレストは何を実現するモデルなのでしょうか。②で将来の人数を予測するとなっているので、別のことを実現したいものと理解されます
mango55

2020/06/28 13:13

本文中修正しました。よろしくお願いします。
meg_

2020/06/28 13:39

>具体的には[X_vars] is not defined とエラーとなります。 X_train[X_vars]で特徴量を指定します。X_trainはpandas.DataFrameでしょうか? であれば特徴量として使用したいDataFrameの列を指定しましょう。
mango55

2020/06/28 13:59 編集

すみません、書き漏れましたが特徴量を’patient’としてエラーになりました。おそらく特徴量が間違っているのだと思いますが、rf.fit(X_train[X_vars]~、以降の箇所をどう修正したらいいか分からず([X_vars]にどの特徴量を入れたらいいか)分からない状態です。
kabayan55

2020/06/28 14:08

y = dataset[target_col] X = dataset[feature_cols] はsplitより前でないと動かないと思います。Pythonスクリプトだと、そのままコピペでいいのですが、もしJupyterを使っていらっしゃいましたら、最初からRunし直してエラーが出ないことを確認してからコピペした方がいいと思います。 前の質問にも書いてますが、[X_vars], [Y_vars]部分消したら動くと思います。 前の質問で、KeyErrorは解決したと思ったので、他の部分に関する質問に関しては分けて欲しいと書いたのですが、解決していなかったのなら、前の質問でよかったと思います。 https://teratail.com/questions/272906
meg_

2020/06/28 14:32

X_train.columnsでカラム一覧が取得できますので、その中からカラムを選択すればKeyErrorは出ないはずです。(とりあえずの対処となります)
Penpen7

2020/06/28 19:51 編集

KeyErrorは解決したとのことですが、コードがそのままではエラーが出てしまいます。jupyter notebookで一つにセルをまとめたのち、Kernel->Restart & Run Allで結果を全て消去するかjupyter notebookを起動し直します。一つにまとめたセルのみ実行して、エラーが出ていないことを確認してからコピペで投稿してください。
mango55

2020/06/29 10:39

kabayan55さん、meg_さん、Penpen7さん 度々お返事頂きありがとうございます。 R.shigemoriさんから全体的なご指摘を頂きましたので再度考え直したいと思います。ご丁寧にありがとうございました。
Penpen7

2020/06/29 12:38

このコードは何かサンプルコード等を参考にしながら書いているのでしょうか? もしあれば、お示しください。
mango55

2020/06/30 10:30 編集

サンプルコードです。対戦相手の試合結果予測?と漠然と聞いていますが、詳しくは分かりません。これを活用できるのではとのことでコードの理解をしようとしたのですがところどころ分からないところがありどのように修正すべきか分からない状態です。 reg = RandomForestRegressor() reg.fit(X=train[X_vars], y=train[Y_vars]) for fday in pred["days"]: idx = pred[pred["days"] == fday].index[0] pred_value = reg.predict(pred.loc[pred["days"]==fday, X_vars].values.reshape(1,-1)) for i in range(len(Y_vars)): prefix = re.match(r'(GAME_\w+)_[0-9]+', Y_vars[i]) target_game = prefix[1] #available or not available_var = target_game + "_available" availavle_flag = pred.loc[pred["days"]==fday, available_var].values # GAME_x_0 if availavle_flag > 0: pred.loc[pred["days"]==fday, Y_vars[i]] = pred_value[0][i] else: pred.loc[pred["days"]==fday, Y_vars[i]] = 0 # GAME_X_1 prefix = re.match(r'(GAME_\w+)_[0-9]+', Y_vars[i]) target_var1 = target_game + "_1" pred.loc[pred["days"]==fday+datetime.timedelta(days=1), target_var1] = pred_value[0][i] # GAME_X_2 target_var2 = target_game + "_2" pred.loc[pred["days"]==fday+datetime.timedelta(days=1), target_var2] = pred.loc[pred["days"]==fday, target_var1].values[0] よろしくお願いいたします。
guest

回答1

0

実装内容に対する説明が不足しているので、想像で補いながらのコメントになりますので正しくない部分があることを了解下さい。

rf.fitの部分ですが、X_trainとy_trainから学習させる部分なので各々の[]は不要です。X_train,y_trainともに前段で必要なカラムを取り出しています。

for fdayの部分ですが、predがないので動きません。たぶん、予測対象の日付が入った変数と思いますが、前段で作成する必要があります。なお、rf.fitで学習させたモデルは特定の日において入手できている説明変数からpatientを予測するというものです。したがって、将来のpatientを予測するには将来の説明変数がわかっていることが前提になります。質問に記載のコードには将来の説明変数を予測する部分がないように思います。もしかしたらpredの生成過程で考慮済みなのかもしれません。その場合はfor文による繰り返しをせず、rf.pedict(predの説明変数)で将来の予測が可能です。

時系列モデルは、予測対象が時間の流れで推測できると仮定するところから始まります。よってpatientは当日を含む過去の値から明日の値が予測可能と仮定しなければなりません。しかしながら、質問に記載のコードによると、patientは外的変数によって決定されると捉えているので、時系列モデルは合わないように思います。外的変数を考慮しつつ時系列モデルを構築するのであれば、状態空間モデルあたりを活用したほうがいいと思います

投稿2020/06/28 23:28

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mango55

2020/06/29 10:47

R.shigemoriさん ご指摘ありがとうございます。 >rf.fitの部分ですが、X_trainとy_trainから学習させる部分なので各々の[]は不要です。 とのことですが、rf.predict(pred.loc[pred["date"]==fday, X_vars].values.reshape~の部分に”X_vars”があり、これを定義しないとエラーとなってしまうのですが、今回の目的(人数予測)だとX_varsは不要ですか? また、forの中のpredictでpatientの人数を予測しながらループで増やしていくと考えたのですがこの方法だとpatientの人数は予測できないのでしょうか?もしくはforの前にpatientの人数を予測してforでループしていくということなのでしょうか? 質問が多く申し訳ありませんが、よろしくお願いします。
R.Shigemori

2020/06/29 12:58 編集

X_varsの要否は、X_varsが何を意味しているかわからない上、predの内容がわからないので回答できません。 patientは説明変数によって予測されるものとしてモデルに実装されています。よって未来の説明変数が確定していない限りpatientの予測は不可能です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問