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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1949閲覧

データ分割でのエラー

s_kj

総合スコア31

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/02/21 02:15

Kaggleでタイタニックのコンペに取り組んでいます。
学習データの分割でエラーが出ます。
エラーの理由が特定できません。
わかる方いらっしゃいましたら、ご教示いただけないでしょうか。

記載コード

import numpy as np import pandas as pd import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') %matplotlib inline train_df = pd.read_csv('/kaggle/input/titanic/train.csv') test_df = pd.read_csv('/kaggle/input/titanic/test.csv') train_df = train_df.drop(["Ticket", "Cabin"], axis=1) test_df = test_df.drop(["Ticket", "Cabin"], axis=1) combine = [train_df, test_df] freq_port = train_df["Embarked"].dropna().mode()[0] train_df["Embarked"] = train_df["Embarked"].fillna(freq_port) test_df['Fare'] = test_df['Fare'].fillna(test_df['Fare'].dropna().median()) combine = [train_df, test_df] for dataset in combine: dataset['Age'] = dataset['Age'].fillna(dataset['Age'].dropna().median()) dataset['Title'] = dataset.Name.str.extract(' ([A-Za-z]+).', expand=False) dataset['Title'] = dataset['Title'].replace(['Lady', 'Countess','Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare') dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss') dataset['Title'] = dataset['Title'].replace('Ms', 'Miss') dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs') dataset['AgeBand'] = pd.cut(dataset['Age'], 5) dataset['FareBand'] = pd.qcut(dataset['Fare'], 4) dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1 dataset['IsAlone'] = 0 dataset.loc[dataset['FamilySize'] == 1, 'IsAlone'] = 1 dataset['Age*Class'] = dataset.Age * dataset.Pclass from sklearn.preprocessing import LabelEncoder lbe = LabelEncoder() for dataset in combine: dataset['Sex_lbe'] = lbe.fit_transform(dataset['Sex']) dataset['Embarked_lbe'] = lbe.fit_transform(dataset['Embarked']) dataset['Title_lbe'] = lbe.fit_transform(dataset['Title']) dataset['AgeBand'] = lbe.fit_transform(dataset['AgeBand']) dataset['FareBand'] = lbe.fit_transform(dataset['FareBand']) train_df = train_df.drop(['Name', 'PassengerId'], axis=1) test_df = test_df.drop(['Name', 'PassengerId'], axis=1) from sklearn.model_selection import KFold cv = KFold(n_splits=3, random_state=42, shuffle=True) acc_results = [] train_df.columns X_train = train_df[['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked', 'Title', 'AgeBand', 'FareBand', 'FamilySize', 'IsAlone', 'Age*Class', 'Sex_lbe', 'Embarked_lbe', 'Title_lbe']] y_train = train_df[['Survived']] print(X_train) print(y_train) for trn_index, val_index in cv.split(X_train): X_trn, X_val = X_train.loc[trn_index], X_train.loc[val_index] y_trn, y_val = y_train[trn_index], y_train[val_index] model = LogisticRegression() model.fit(X_trn, y_trn) acc = model.score(X_val, y_val) print("acc:", acc) acc_results.append(acc) print(acc_results) print("Average:", np.mean(acc_results))

エラーの返答です。

KeyError Traceback (most recent call last) <ipython-input-85-a1fa4944c0f3> in <module> 14 for trn_index, val_index in cv.split(X_train): 15 X_trn, X_val = X_train.loc[trn_index], X_train.loc[val_index] ---> 16 y_trn, y_val = y_train[trn_index], y_train[val_index] 17 model = LogisticRegression() 18 model.fit(X_trn, y_trn) /opt/conda/lib/python3.7/site-packages/pandas/core/frame.py in __getitem__(self, key) 3028 if is_iterator(key): 3029 key = list(key) -> 3030 indexer = self.loc._get_listlike_indexer(key, axis=1, raise_missing=True)[1] 3031 3032 # take() does not accept boolean indexers /opt/conda/lib/python3.7/site-packages/pandas/core/indexing.py in _get_listlike_indexer(self, key, axis, raise_missing) 1263 keyarr, indexer, new_indexer = ax._reindex_non_unique(keyarr) 1264 -> 1265 self._validate_read_indexer(keyarr, indexer, axis, raise_missing=raise_missing) 1266 return keyarr, indexer 1267 /opt/conda/lib/python3.7/site-packages/pandas/core/indexing.py in _validate_read_indexer(self, key, indexer, axis, raise_missing) 1305 if missing == len(indexer): 1306 axis_name = self.obj._get_axis_name(axis) -> 1307 raise KeyError(f"None of [{key}] are in the [{axis_name}]") 1308 1309 ax = self.obj._get_axis(axis) KeyError: "None of [Int64Index([ 0, 1, 3, 4, 8, 9, 11, 12, 13, 14,\n ...\n 874, 875, 878, 879, 881, 882, 883, 887, 888, 890],\n dtype='int64', length=594)] are in the [columns]"

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

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

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

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

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

meg_

2021/02/21 02:40

エラーメッセージによると、trn_indexまたはval_indexがy_trainの列名に存在していないと思われます。 y_trainから抽出したいデータは何でしょうか?コードが間違っているような気がします。
s_kj

2021/02/21 05:33

ご質問ありがとうございます。 コメント内容を確認して、私の理解できていない箇所の本質を質問していただいたと思いました。 コードの目的はデータセットの'Survived’のカラムの値(0 or1)を予測することです。 この時のデータの分割ができていないと理解しています。 データの分割では、y_trainはX_trainと同じindexのSurvivedの値が格納されてほしいと思っています。 そうすれば、model.fit(X_trn, y_trn)が実行できるのではと思っています。 データセットには下記のカラムが存在しており、test_dfには'Survived’は記載されていません。 'Survived’,'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare','Embarked', 'Title', 'AgeBand', 'FareBand', 'FamilySize', 'IsAlone','Age*Class', 'Sex_lbe', 'Embarked_lbe', 'Title_lbe'
guest

回答1

0

ベストアンサー

KFoldのインスタンスのsplitメソッドが生成するのは、整数の一次元ndarrayなので、

python

1 X_trn, X_val = X_train.loc[trn_index], X_train.loc[val_index] 2 y_trn, y_val = y_train[trn_index], y_train[val_index]

はエラーになります。
この部分を

python

1 X_trn, X_val = X_train.iloc[trn_index], X_train.iloc[val_index] 2 y_trn, y_val = y_train.iloc[trn_index], y_train.iloc[val_index]

に変えればこのエラーは出なくなるはずです。

投稿2021/02/22 02:53

ppaul

総合スコア24666

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

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

s_kj

2021/02/23 09:53

コメントありがとうございました。 ご指摘の内容で、正常に作動できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問