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

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

ただいまの
回答率

89.63%

python indexing.IndexingError: Too many indexers

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 2,664

rmt0202

score 11

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

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

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

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

import pandas as pd
import numpy as np
import matplotlib as plt
from scipy.stats import zscore
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
import SBS
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier
"""
def zscore(x):
    xmean=x.mean()
    xstd=np.std(x)
    zscore=(x-xmean)/xstd
    return zscore
"""

data=pd.read_csv("train.csv",header=None)
i=0
for i in range(40):
    data[i]=pd.Series(zscore(data[i]))
data1=pd.read_csv("trainLabels.csv",header=None)

#線形SVMのインスタンスを作成
svm=SVC(kernel="linear",C=1.0,random_state=1)
#k近傍分類器のインスタンスを生成
knn=KNeighborsClassifier(n_neighbors=5)
#data1=np.ravel(data1)
sbs=SBS.SBS(knn,k_features=1)
#SVMのモデルにトレーニングデータを結合させる
#x_train,x_test,y_train,y_test=train_test_split(data,data1,test_size=0.25)
sbs.fit(data,data1)
k_feat=[len(k) for k in sbs.subsets_]

#横軸を特徴量の個数、縦軸をスコアとした折れ線グラフを作成
plt.plot(k_feat,sbs.scores_,marker="o")
plt.ylim([0.7,1.02])
plt.ylabel("Accuracy")
plt.xlabel("Number of features")
plt.grid()
plt.tight_layout()
plt.show()

上でimportしたSBS.pyです

from sklearn.base import clone
from itertools import combinations
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

class SBS():
    #逐次後退選択を実行するクラス

    def __init__(self,estimator,k_features,scoring=accuracy_score,
                 test_size=0.25,random_state=1):
        self.scoring=scoring
        self.estimator=clone(estimator)
        self.k_features=k_features
        self.test_size=test_size
        self.random_state=random_state

    def fit(self,X,Y):
        x_train,x_test,y_train,y_test=\
        train_test_split(X,Y,test_size=self.test_size,random_state=self.random_state)
        dim=x_train.shape[1]
        self.indices_=tuple(range(dim))
        self.subsets=[self.indices_]

        #全ての特徴量を用いてスコアを算出
        score=self._calc_score(x_train,y_train,x_test,y_test,self.indices_)

        #スコアを格納
        self.scores_=[score]
        #指定した特徴量の個数になるまで処理を反復
        while dim>self.k_features:
            #空のリストを生成
            scores=[]
            subsets=[]

            #特徴量の部分集合を表す列インデックスの組み合わせごとに処理を反復
            for p in combinations(self.indices_,r=dim-1):
                #スコアを算出して格納
                score=self._calc_score(x_train,y_train,x_test,y_test,p)
                scores.append(score)
                #特徴量の部分集合を表す列インデックスのリストを格納
                subsets.append(p)

            #最良のスコアのインデックスを抽出
            best=np.argmax(scores)
            #最良のスコアとなる列インデックスを抽出して格納
            self.indices_=subsets[best]
            self.subsets_.append(self.indices)
            #特徴量の個数を1つだけ減らして次のステップへ 
            dim-=1

            #スコアを格納
            self.scores.append(scores[best])

        #最後に格納したスコア
        self.k_score_=self.scores_[-1]

        return self

    def transform(self,x):
        #抽出した特徴量を返す
        return x[:,self.indices]

    def _calc_score(self,x_train,y_train,x_test,y_test,indices):
        #指定された列番号indicesの特徴量を抽出してモデルを適合
        self.estimator.fit(x_train.iloc[0::,indices],y_train)
        #テストデータを用いてクラスラベルを予測
        y_pred=self.estimator.predict(x_test.iloc[0::,indices])
        #真のクラスラベルと予測値を用いてスコアを算出
        score=self.scoring(y_test,y_pred)
        return score

CSVのデータです

CSVのデータです

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

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 18:32

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

    キャンセル

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

  • ただいまの回答率 89.63%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる