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

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

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

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

3241閲覧

[Python] 時系列分析(ランダムフォレスト)コーディングエラーの意味.

mango55

総合スコア22

データ構造

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

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2020/06/25 13:18

編集2020/06/28 13:48

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

手元のデータ集計期間が短いため、ある特定日を用いて前日、前々日の人数を予測したものを学習データ、実際の人数をテストデータとして予測を行いたいです。
エラーの内容を調べても分かりませんでした。
解決法、実現したいことを達成するためのコードの間違いをご指摘頂けないでしょうか。

実現したいこと
① 学習用データの作成 4/1のデータから3/31,3/30の人数を予測
② ①を学習用データ、実際の人数をテストデータとして予測
③ ①②を用いてランダムフォレストでRMSEを算出

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

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 23X_train_val, X_test, y_train_val, y_test = \ 24 train_test_split(X, y, test_size=0.3, random_state=1234) #分割1 25 26X_train, X_val, y_train, y_val = \ 27 train_test_split(X_train_val, y_train_val, test_size=0.3, random_state=1234) #分割2 28 29y = dataset[target_col] 30X = dataset[feature_cols] 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))
コード修正後のエラー(初回とはエラー内容が異なります) KeyError Traceback (most recent call last) ~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 2656 try: -> 2657 return self._engine.get_loc(key) 2658 except KeyError: pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() KeyError: 'patient' During handling of the above exception, another exception occurred: KeyError Traceback (most recent call last) <ipython-input-57-82605815cc01> in <module> 3 4 rf = RandomForestRegressor(random_state=1234) ----> 5 rf.fit(X_train[X_vars], y_train[Y_vars]) 6 7 for fday in pred["date"]: ~\Anaconda3\lib\site-packages\pandas\core\frame.py in __getitem__(self, key) 2925 if self.columns.nlevels > 1: 2926 return self._getitem_multilevel(key) -> 2927 indexer = self.columns.get_loc(key) 2928 if is_integer(indexer): 2929 indexer = [indexer] ~\Anaconda3\lib\site-packages\pandas\core\indexes\base.py in get_loc(self, key, method, tolerance) 2657 return self._engine.get_loc(key) 2658 except KeyError: -> 2659 return self._engine.get_loc(self._maybe_cast_indexer(key)) 2660 indexer = self.get_indexer([key], method=method, tolerance=tolerance) 2661 if indexer.ndim > 1 or indexer.size > 1: pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc() pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.PyObjectHashTable.get_item() KeyError: 'patient'

file_0627.csv
|date|patient|6day_exclusion_rate|14day_exclusion_rate
|2020/4/1|181|0.117179|0.130412
|2020/4/2|186|0.17748|0.129215

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

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

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

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

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

Penpen7

2020/06/25 20:20 編集

jupyter notebookを使われているものと思いますが、どういう風に定義されている変数か、import文がないためどういうモジュールを読み込んでいるのかわかりません。エラーが発生したセルだけでなく、他のセルで実行したものもエラーを考える上で必要になります。質問する際には載せたソースコードを貼り付ければ、そのまま他の人のPCでも実行できるように一つにまとめるようにしてください。 1. pythonのverとどういうモジュールを使っていますか? import文も含めて載せてください。 2. dataset, X_train, Y_train, pred, X_val, Y_valは、このソースの中に定義されていないので、このままでは動きません。 3. X_trainとX_varsを使う意図は理解されてコードを書いていますか?すなわち、なぜ、X_trainの添字にX_varsを使われたのでしょうか? 4. pandasでデータ(csvなど)を読み込んでいるものと思いますが、ファイルの構造はどうなっていますか?
mango55

2020/06/27 02:19 編集

度々すみません。全コード(質問1,2,4について)追記しました。 前回とはエラー内容が変わりました。 >3. X_trainとX_varsを使う意図は理解されてコードを書いていますか? →正直理解出来ていないかもしれません(for fday in pred["date"]:~以降はサンプルコードを参考にしています) やりたいことは1日のデータから前日、前々日のpatientの予測が出来ればこのコーディングには拘っていません。 >すなわち、なぜ、X_trainの添字にX_varsを使われたのでしょうか? →ここは過去dateの配列の中にpatientを挿入していくと考えました。でも自信がないです・・・ よろしくお願いします。
Penpen7

2020/06/27 09:21

ご対応ありがとうございます。しかし、Xとyとpredの定義がありません。
Penpen7

2020/06/27 09:46 編集

kabayan55さんの繰り返しになってしまいますが... X_varsやY_varsはそれぞれX_train, Y_trainからデータとして取り出したい列の指定です。 例えば、DataFrameであるdfという変数に a | b | c ----------- 1 2 3 4 5 6 が入っている場合, df[['a','b']]とすれば、aとbの列を取り出すという意味なので, a | b ------- 1 2 4 5 というように欲しい列をリスト['a','b']で指定すると, DataFrameとして返ってきます。 また、df[['a']]であれば, a -- 1 3 となります。DataFrameで返ってきます。 df['a']と単純に文字列で'a'とだけで指定すると, 1 3 とSeriesとして返ってきます。 DataFrameに対して存在しない列を指定したり(例えばdf[['d']]) Seriesに対して列を指定したりすると、ご質問にあるようにKeyErrorとなります。 1. type(X_train)やtype(y_train)を実行し, X_train, y_trainがSeriesになっていないか確認。 2.1. Seriesであれば列の指定[~]を削除 2.2. DataFrameであれば、X_trainやy_trainにちゃんとpatientという列が存在するか確認。なければ、適切に修正する とりあえずこれをやればエラーは回避できると思います。
guest

回答1

0

ベストアンサー

エラーが出ている箇所は、エラー文を読むとわかる通り、rf.fit(X_train[X_vars], y_train[Y_vars]) ですね。

KeyError: "None of [Float64Index([0.140526, 0.131246,......,0.215802], dtype='float64', length=4465)] are in the [columns]"
というエラーですが(長かったので途中省略しました)、KeyErrorとあるのでキーを疑います。

例えばX_train[X_vars]であればX_varsの部分がKeyです。
X_vars = dataset['exclusion_rate']と1行目で書いているので、おそらくpd.Seriesになっていると思います。

X_train[X_vars]でしたいことは、X_trainの学習に用いたいカラムを指定することだと思います。
X_varsの代わりに、カラムを入れてください。

pandasのインデックス参照で行・列を選択し取得

投稿2020/06/25 23:44

kabayan55

総合スコア389

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

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

mango55

2020/06/27 10:20 編集

すみません、ある特定日の'patient'データから前日、前々日を取り出すためのコードはどのように書いたらいいでしょうか? 下記の箇所は無視していただいて構いません。 for fday in pred["date"]: idx = pred[pred["date"] == fday].index[0] pred_value = rf.predict(pred.loc[pred["date"]==fday, X_vars].values.reshape(1,-1)) for i in range(len(Y_vars)): prefix = re.match(r'(Date_\w+)_[0-9]+', Y_vars[i]) target_list = prefix[1] # Date_-1 prefix = re.match(r'(Date_\w+)_[0-9]+', Y_vars[i]) target_var1 = target_list + "_1" pred.loc[pred["date"]==fday+datetime.timedelta(days=1), target_var1] = pred_value[0][i] # Date_-2 target_var2 = target_list + "_2" pred.loc[pred["date"]==fday+datetime.timedelta(days=1), target_var2] = pred.loc[pred["ds"]==fday, target_var1].values[0] よろしくお願いします。
kabayan55

2020/06/28 09:04

コメントで無視して問題ないと書かれていらっしゃるコード部分は、 rf.fit(X_train[X_vars], y_train[Y_vars]) の部分がまだうまくいってないのでその前の処理についてまず解決したく、後半部分は現時点では関係ないという認識で合っていますでしょうか。 元々の質問(エラー文)の方しか着目していなかったので、前提をまだ理解しておらず、まず、実現したいことについて確認させてください。できる限り回答したいとは思いますが、エラー箇所はおそらく同じとはいえ元々の質問とは違う質問になってしまっていますので、改めて別に質問を立てていただいた方が良いかもしれません。 > ① 学習用データの作成 4/1のデータから3/31,3/30の人数を予測 時系列予測は基本的に未来のことを予測するので(過去のことはわかっているので予測にはならない)、実現したいことの設定自体に違和感があります。最終的な目的が「将来の人数を予測」であると思うので、データの水増しをする際にも「3/30のデータから3/31, 4/1」のデータを予測とした方が良いように思います。 > ある特定日の'patient'データから前日、前々日を取り出すためのコード この部分、具体的にどのようなことをされたいのかイメージがついておりません。「取り出す」と書いていらっしゃるということは、予測ではなく文字通り「取り出す」で良いのでしょうか。 ・「ある特定日の'patient'データ」がどれを指しているのかわらかないのですが、patientのカラムって人数ですよね?ある日の人数ってことなんでしょうか。あるいは、1行って意味ですか? ・「前日、前々日を取り出す」の部分もよくわかりません。 前日と前々日の行をそのままコピーしてきたいってことなんでしょうか。 質問文に載せてくださっているデータがあった時に、例えば4/3のデータを作るとして、 以下のように元々のデータに前日と前々日の日付を変更したものも加えたいのでしょうか。 |2020/4/3|181|0.117179|0.130412 |2020/4/3|186|0.17748|0.129215 質問の背景でわからない部分が多かったので、たくさん質問してしまいました。見当違いのことを言っていたらすみません。
mango55

2020/06/28 10:00 編集

ご丁寧にご指摘頂きありがとうございます。 元々の目的である 将来の人数予測 のため、 実現したいこと①は、データの水増し が目的です。 例えば、4/1-6/30までの3ヶ月間しかデータがなくても 今のデータから予測、予測としていくことでデータが増やせるのではと思いました。 ですが仰って頂いた通り、過去データがあるので過去日の予測は意味がありませんね。。。 >rf.fit(X_train[X_vars], y_train[Y_vars]) の部分がまだうまくいってないのでその前の処理についてまず解決したく、後半部分は現時点では関係ないという認識で合っていますでしょうか。 こちらの意図としては for fday in pred["date"]: ~ print('Random Forest RMSE: ', np.sqrt(rf_mse)) の箇所がどうしても理解出来ない箇所があり、この部分を別の記述方法で実現する方法はないかお伺いする意図でした。 > ある特定日の'patient'データから前日、前々日を取り出すためのコード この部分、具体的にどのようなことをされたいのかイメージがついておりません。 こちらは"予測"と"取り出す"ことの内容や方法について誤った認識をしていました。のでこちらはなかったことにしてください。 改めて実現したいことは、  ①特定日で翌日、翌々日の人数を予測(データを増やす)  ②①を用いて将来的な人数を予測(将来の予測) です。 どうぞよろしくお願いいたします。
kabayan55

2020/06/28 10:44

説明、ありがとうございます。 説明していただいた後に書くのも申し訳ないんですが、KeyError以外の部分に関しては、質問ページを別に作ってもらえませんか? このページの元々の質問、「エラーの意味」とありましたので、エラーの意味がわかってエラーの「解決法、実現したいことを達成するためのコードの間違い」がわかればこの質問は解決済みになると思っています。KeyError: 'patient' に関してはまだ解決していない(Keyを変えてみたけどまだエラーが出る)ということだと思うので、この部分に関してはこのページで解決するまで議論していいと思います。まだ見れていないですが、ちょっと見てみますね。 また、質問文のエラーを編集し直していらっしゃると思うのですが、Penpen7さんや私がしているコメントは元のエラーに対するものなので、後から同じようなエラーを出した人がこのページを見にきて参考にしたいと思った時に、話が噛み合っていなくて混乱する可能性が大いにあります。元のエラー + コメントを受けて行った変更 + 今のエラー とかにしておくといいと思います。 > こちらの意図としては > for fday in pred["date"]: ~ print('Random Forest RMSE: ', np.sqrt(rf_mse)) の箇所がどうしても理解出来ない箇所があり、この部分を別の記述方法で実現する方法はないかお伺いする意図でした。 こちらに関しては、このページの質問とは違うものだと思いますので、どこまで理解できているかを書いた上で、別のページで質問していただければと思います。
kabayan55

2020/06/28 11:17 編集

分割1のところで、train_test_split(X, y......)とされていますが、このXとyはどうなっていますか? X=dataset[feature_cols], y=dataset[target_col] などの定義をしていらっしゃいますでしょうか。その部分は動いているということは貼り忘れかなと思っています。 分割1の時点でカラム選択をしていれば、y_trainはおそらくsplitした時点でtarget_col('patient')のみのSeriesになっていると思うので、fitの時にX_train, y_trainどちらもカラムを指定する必要はない気がします。エラーが出ているのは、DataFrameの場合はカラム名を入れることによって、そのカラムのデータを選択できますが、Seriesに対してはそれが行えないからです。 以下、エラーに関係ある部分の修正案です。 dataset = pd.read_csv('file_0627.csv') dataset.head() target_col = 'patient' exclude_cols = ['date','patient','14day_exclusion_rate'] feature_cols = [] for col in dataset.columns: if col not in exclude_cols: feature_cols.append(col) X=dataset[feature_cols] y=dataset[target_col] X_train_val, X_test, y_train_val, y_test = \ train_test_split(X, y, test_size=0.3, random_state=1234) #分割1 X_train, X_val, y_train, y_val = \ train_test_split(X_train_val, y_train_val, test_size=0.3, random_state=1234) #分割2 rf = RandomForestRegressor(random_state=1234) rf.fit(X_train, y_train)
mango55

2020/06/28 12:23

度々迅速なご指摘ありがとうございます。 >KeyError以外の部分に関しては、質問ページを別に作ってもらえませんか? 別ページ作成いたします。 頂いた修正案で前回のエラーは解消されましたのでこちらのページは解決済みにさせて頂こうと思います。 >元のエラー + コメントを受けて行った変更 + 今のエラー とかにしておくといいと思います。 こちらはエラーのページに「コード修正後のエラー(初回とはエラー内容が異なります)」と追記させて頂きました。 >分割1のところで、train_test_split(X, y......)とされていますが、このXとyはどうなっていますか? X,yについてはご指摘の通りの定義はしておりこちらは問題なかったです。 ですが以後の、rf.fit(X_train[X_vars], y_train[Y_vars])の部分の[X_vars],[y_val]の箇所の定義が が何を指しているか理解出来ていなくて定義が間違っていると思います。 特に以下の内容、コード修正箇所が理解出来ておらず、こちらは別問題として別ページを作成させて頂きます。 実現したいこと ①特定日で翌日、翌々日の人数を予測(データを増やす) for fday in pred["date"]: ~ print('Random Forest RMSE: ', np.sqrt(rf_mse)) よろしくお願いいたします。
kabayan55

2020/06/28 13:26

質問修正と別途作成の件、了承しました。 > rf.fit(X_train[X_vars], y_train[Y_vars])の部分の[X_vars],[y_val]の箇所の定義が が何を指しているか理解出来ていなくて定義が間違っていると思います。 X_trainには学習に用いたい説明変数(feature_cols)のデータ、y_trainには学習に用いたい目的変数(target_col)のデータが欲しいです。 []をつけるのは、DataFrameのうち、どのデータを選択するかです。 修正案の方で[X_vars]をつけていないのは、X_trainの一部のデータを使いたいわけではなく、全てを使いたいからです。また、y_trainの方はSeriesなので、そこから選択することはないので、こちらもそのまま入力としています。 回答に「pandasのインデックス参照で行・列を選択し取得」というリンクを貼ったのは、ここでDataFrameの名前の後に[]をつけているのは、「pandasのインデックス参照で列を選択し取得」しているという意図でした。リンク先にはわかりやすい例があるので、どのような動作が行われているかはそちらを見た方がわかりやすいかと思います。また、上の質問への追記・修正でPenpen7さんが例を載せてくださっています。 今あるデータがどんな形(型もですが、どんなカラムが含まれているかとかも)で、どんな形になっていると嬉しいか、そのためにはどんな処理が必要か、を1つ1つ確認しながら書くといいと思います。 今回の場合、どのような確認をすればよかったのかは、上でPenpen7さんが書いていらっしゃる通りです。
kabayan55

2020/06/28 13:31

次の質問、KeyError部分解決したのであれば、解決済みのコードにしておいた方が良いのではないですか? この質問と同じ質問に見えてしまいます。 https://teratail.com/questions/273559
kabayan55

2020/06/28 14:24

> 頂いた修正案で前回のエラーは解消されましたので 思い違いをしていたようですが、回答に書いた部分によって「KeyError: "None of [Float64Index([0.14......」が解消されたということでしょうか。20:16 にしたコメントの修正案は、"patient" のエラーを解消するためのものだったのですが、こちらのコードは試されましたでしょうか。 y = dataset[target_col] X = dataset[feature_cols] で何をしているかはわかりますでしょうか? 以下のコードで中身を見てみると、何をしているか掴みやすいと思います。データフレームからカラム指定でデータ選択をしています。 print(dataset) print(target_col) print(dataset) print(dataset[target_col]) print(dataset[feature_cols]) また、X_train, y_trainにおいてカラム指定しなくていい理由が伝わってないと思ったので、以下も確認してみてください。 print(X_train) print(type(X_train)) print(y_train) print(type(y_train))
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問