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

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

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

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

1回答

11177閲覧

python indexing.IndexingError: Too many indexers

rmt0202

総合スコア13

Python 3.x

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

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2018/12/14 04:26

pythonで現在機械学習について勉強しています。

あるデータを解析しようとしている途中に
pandas.core.indexing.IndexingError: Too many indexers

というエラーが発生してしまいました。
どのようにしたら解決できるでしょうか?

申し訳ありませんが、よろしくお願いします。

python

1import pandas as pd 2import numpy as np 3import matplotlib as plt 4from scipy.stats import zscore 5from sklearn.svm import SVC 6from sklearn.model_selection import train_test_split 7import SBS 8import matplotlib.pyplot as plt 9from sklearn.neighbors import KNeighborsClassifier 10""" 11def zscore(x): 12 xmean=x.mean() 13 xstd=np.std(x) 14 zscore=(x-xmean)/xstd 15 return zscore 16""" 17 18data=pd.read_csv("train.csv",header=None) 19i=0 20for i in range(40): 21 data[i]=pd.Series(zscore(data[i])) 22data1=pd.read_csv("trainLabels.csv",header=None) 23 24#線形SVMのインスタンスを作成 25svm=SVC(kernel="linear",C=1.0,random_state=1) 26#k近傍分類器のインスタンスを生成 27knn=KNeighborsClassifier(n_neighbors=5) 28#data1=np.ravel(data1) 29sbs=SBS.SBS(knn,k_features=1) 30#SVMのモデルにトレーニングデータを結合させる 31#x_train,x_test,y_train,y_test=train_test_split(data,data1,test_size=0.25) 32sbs.fit(data,data1) 33k_feat=[len(k) for k in sbs.subsets_] 34 35#横軸を特徴量の個数、縦軸をスコアとした折れ線グラフを作成 36plt.plot(k_feat,sbs.scores_,marker="o") 37plt.ylim([0.7,1.02]) 38plt.ylabel("Accuracy") 39plt.xlabel("Number of features") 40plt.grid() 41plt.tight_layout() 42plt.show()

上でimportしたSBS.pyです

python

1from sklearn.base import clone 2from itertools import combinations 3import numpy as np 4from sklearn.model_selection import train_test_split 5from sklearn.metrics import accuracy_score 6 7class SBS(): 8 #逐次後退選択を実行するクラス 9 10 def __init__(self,estimator,k_features,scoring=accuracy_score, 11 test_size=0.25,random_state=1): 12 self.scoring=scoring 13 self.estimator=clone(estimator) 14 self.k_features=k_features 15 self.test_size=test_size 16 self.random_state=random_state 17 18 def fit(self,X,Y): 19 x_train,x_test,y_train,y_test=\ 20 train_test_split(X,Y,test_size=self.test_size,random_state=self.random_state) 21 dim=x_train.shape[1] 22 self.indices_=tuple(range(dim)) 23 self.subsets=[self.indices_] 24 25 #全ての特徴量を用いてスコアを算出 26 score=self._calc_score(x_train,y_train,x_test,y_test,self.indices_) 27 28 #スコアを格納 29 self.scores_=[score] 30 #指定した特徴量の個数になるまで処理を反復 31 while dim>self.k_features: 32 #空のリストを生成 33 scores=[] 34 subsets=[] 35 36 #特徴量の部分集合を表す列インデックスの組み合わせごとに処理を反復 37 for p in combinations(self.indices_,r=dim-1): 38 #スコアを算出して格納 39 score=self._calc_score(x_train,y_train,x_test,y_test,p) 40 scores.append(score) 41 #特徴量の部分集合を表す列インデックスのリストを格納 42 subsets.append(p) 43 44 #最良のスコアのインデックスを抽出 45 best=np.argmax(scores) 46 #最良のスコアとなる列インデックスを抽出して格納 47 self.indices_=subsets[best] 48 self.subsets_.append(self.indices) 49 #特徴量の個数を1つだけ減らして次のステップへ  50 dim-=1 51 52 #スコアを格納 53 self.scores.append(scores[best]) 54 55 #最後に格納したスコア 56 self.k_score_=self.scores_[-1] 57 58 return self 59 60 def transform(self,x): 61 #抽出した特徴量を返す 62 return x[:,self.indices] 63 64 def _calc_score(self,x_train,y_train,x_test,y_test,indices): 65 #指定された列番号indicesの特徴量を抽出してモデルを適合 66 self.estimator.fit(x_train.iloc[0::,indices],y_train) 67 #テストデータを用いてクラスラベルを予測 68 y_pred=self.estimator.predict(x_test.iloc[0::,indices]) 69 #真のクラスラベルと予測値を用いてスコアを算出 70 score=self.scoring(y_test,y_pred) 71 return score

CSVのデータです

CSVのデータです

(コード参照元)Python 機械学習プログラミング Sebastian Raschka著

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

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

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

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

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

guest

回答1

0

ベストアンサー

"Too many indexers" のエラーですが、 SBS.py の _calc_score() 関数内のx_train.iloc[0::,indices] および x_test.iloc[0::,indices] と DataFrame のIndexing行う処理において、 indices の値として tuple型 で与えられていることが原因のようです。
(どうやら tuple型は MultiIndexの指定として使用されるため、今回のような Indexingの用途ではエラーになるとのことです)

ですので、indices の値を list(indices) などとlist型に変換するとこの部分に関してはエラーがでなくなるのではないでしょうか。

私の環境では、これ以外のエラーにより動作しておりません

投稿2018/12/14 08:08

magichan

総合スコア15898

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

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

rmt0202

2018/12/14 09:32

ありがとうございます! あとはSBSの変数が一致していないところがあったのでそこを直したら動作しました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問