web-dev-qa-db-ja.com

相互検証中にキーエラーがインデックスにありません

データセットにsvmを適用しました。私のデータセットはマルチラベルです。つまり、各観測には複数のラベルがあります。

KFold cross-validationエラーが発生しますnot in index

601から6007までのインデックスを示していますnot in index(1 ... 6008個のデータサンプルがあります)。

これは私のコードです:

   df = pd.read_csv("finalupdatedothers.csv")
categories = ['ADR','WD','EF','INF','SSI','DI','others']
X= df[['sentences']]
y = df[['ADR','WD','EF','INF','SSI','DI','others']]
kf = KFold(n_splits=10)
kf.get_n_splits(X)
for train_index, test_index in kf.split(X,y):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X.iloc[train_index], X.iloc[test_index]
    y_train, y_test = y.iloc[train_index], y.iloc[test_index]

SVC_pipeline = Pipeline([
                ('tfidf', TfidfVectorizer(stop_words=stop_words)),
                ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),
            ])

for category in categories:
    print('... Processing {} '.format(category))
    # train the model using X_dtm & y
    SVC_pipeline.fit(X_train['sentences'], y_train[category])

    prediction = SVC_pipeline.predict(X_test['sentences'])
    print('SVM Linear Test accuracy is {} '.format(accuracy_score(X_test[category], prediction)))
    print 'SVM Linear f1 measurement is {} '.format(f1_score(X_test[category], prediction, average='weighted'))
    print([{X_test[i]: categories[prediction[i]]} for i in range(len(list(prediction)))])

実際、F1スコアと各ラベルの精度を個別に取得できるKFold交差検証を適用する方法がわかりません。 thisthis を確認しても、自分のケースにどのようにうまく適用できるかわかりませんでした。

再現可能にするため、これはデータフレームの小さなサンプルです最後の7つの機能は、ADR、WDなどを含む私のラベルです...

,sentences,ADR,WD,EF,INF,SSI,DI,others
0,"extreme weight gain, short-term memory loss, hair loss.",1,0,0,0,0,0,0
1,I am detoxing from Lexapro now.,0,0,0,0,0,0,1
2,I slowly cut my dosage over several months and took vitamin supplements to help.,0,0,0,0,0,0,1
3,I am now 10 days completely off and OMG is it rough.,0,0,0,0,0,0,1
4,"I have flu-like symptoms, dizziness, major mood swings, lots of anxiety, tiredness.",0,1,0,0,0,0,0
5,I have no idea when this will end.,0,0,0,0,0,0,1

更新

私がVivek Kumarが言ったことを何でもしたとき、それはエラーを引き起こします

ValueError: Found input variables with inconsistent numbers of samples: [1, 5408]

分類器部分で。それを解決する方法はありますか?

stackoverflowにこのエラーのリンクがいくつかあり、トレーニングデータを再形成する必要があると述べています。私もそうしましたが、成功しませんでした link ありがとうございます:)

7
sariii

train_indextest_indexは、行数に基づく整数インデックスです。しかし、pandasインデックスはそのように機能しません。pandasの新しいバージョンは、それらからデータをスライスまたは選択する方法でより厳密です。

データにアクセスするには、.ilocを使用する必要があります。詳細は こちらから入手可能

これはあなたが必要とするものです:

for train_index, test_index in kf.split(X,y):
    print("TRAIN:", train_index, "TEST:", test_index)
    X_train, X_test = X.iloc[train_index], X.iloc[test_index]
    y_train, y_test = y.iloc[train_index], y.iloc[test_index]

    ...
    ...

    # TfidfVectorizer dont work with DataFrame, 
    # because iterating a DataFrame gives the column names, not the actual data
    # So specify explicitly the column name, to get the sentences

    SVC_pipeline.fit(X_train['sentences'], y_train[category])

    prediction = SVC_pipeline.predict(X_test['sentences'])
20
Vivek Kumar