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