web-dev-qa-db-fra.com

erreur de clé pas dans l'index lors de la validation croisée

J'ai appliqué svm sur mon jeu de données. mon jeu de données est multi-étiquette signifie que chaque observation a plus d'une étiquette.

tandis que KFold cross-validation il déclenche une erreur not in index.

Il montre l'indice de 601 à 6007 not in index (J'ai 1 ... 6008 échantillons de données).

Voici mon code:

   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)))])

En fait, je ne sais pas comment appliquer la validation croisée KFold dans laquelle je peux obtenir le score F1 et la précision de chaque étiquette séparément. après avoir examiné this et this ne m'a pas aidé, comment puis-je appliquer avec succès sur mon cas.

pour être reproductible, ceci est un petit échantillon de la trame de données les sept dernières fonctionnalités sont mes étiquettes dont 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

Mise à jour

quand j'ai fait ce que Vivek Kumar a dit. Cela soulève l'erreur

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

dans la partie classifieur. avez-vous une idée de comment le résoudre?

il y a quelques liens pour cette erreur dans stackoverflow qui dit que je dois remodeler les données d'entraînement. J'ai aussi fait ça mais pas de succès lien Merci :)

7
sariii

train_index, test_index sont des indices entiers basés sur le nombre de lignes. Mais pandas l'indexation ne fonctionne pas comme ça. Les versions plus récentes de pandas sont plus strictes dans la façon dont vous découpez ou sélectionnez les données à partir d'eux).

Vous devez utiliser .iloc pour accéder aux données. Plus d'informations sont disponible ici

Voici ce dont vous avez besoin:

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