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のデータです
(コード参照元)Python 機械学習プログラミング Sebastian Raschka著

回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/12/14 09:32