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]"
エラーメッセージによると、trn_indexまたはval_indexがy_trainの列名に存在していないと思われます。
y_trainから抽出したいデータは何でしょうか?コードが間違っているような気がします。
ご質問ありがとうございます。
コメント内容を確認して、私の理解できていない箇所の本質を質問していただいたと思いました。
コードの目的はデータセットの'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'
回答1件
あなたの回答
tips
プレビュー