Разница между onevsrestClassifier и индивидуальным применением классификатора к меткам в многослойной классификации - PullRequest
0 голосов
/ 08 сентября 2018

Моя цель сделать multi-label classification. Я прочитал эту ссылку , которая говорит о том же, что и я. однако это больше основано на концепции, чем на реализованном коде.

У меня есть два кода, использующих svm linear. в первом коде я применил onevsrestclassifier, а в другом я строю каждый классификатор по отдельности. Но я получил очень большую разницу в их результатах с точки зрения F1 measure recall precision. но, как уже упоминалось в приведенной выше ссылке, не должно быть такой большой разницы !!

Мне интересно, что я делаю неправильно !!

первый подход с использованием oneVsRestClassifier

df = pd.read_csv('finalupdatedothers.csv')
X= df.sentences
dfy = df[['ADR','WD','EF','INF','SSI','DI','others']]
stop_words = stopwords.words('english')
classifier=Pipeline([
                ('tfidf', TfidfVectorizer(stop_words=stop_words)),
                ('clf', OneVsRestClassifier(LinearSVC(), n_jobs=1)),
            ])
kf = KFold(n_splits=10)
kf.get_n_splits(X)
for train_index, test_index in kf.split(X,dfy):
    X_train, X_test = X.iloc[train_index], X.iloc[test_index]
    y_train, y_test = dfy.iloc[train_index], dfy.iloc[test_index]

classifier.fit(X_train, y_train)
predicted = classifier.predict(X_test)
print ("SVM f-measure "+str(f1_score(y_test, predicted, average='weighted')))
print("SVM precision"+str(precision_score(y_test,predicted,average='weighted')))
print("SVM recall"+str(recall_score(y_test,predicted,average='weighted')))

для этого подхода я получил такой результат:

SVM f-measure 0.6396653428191672
SVM precision0.7153314849944064
SVM recall0.5955056179775281

второй подход, когда я применяю классификатор на каждую этикетку в отдельности:

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

for category in categories:

    print('... Processing {} '.format(category))
    SVC_pipeline.fit(X_train, y_train[category])
    prediction = SVC_pipeline.predict(X_test)
    print 'SVM Linear f1 measurement is {} '.format(f1_score(y_test[category], prediction, average='weighted'))
    print("SVM precision" + str(precision_score(y_test[category], prediction, average='weighted')))
    print("SVM recall" + str(recall_score(y_test[category], prediction, average='weighted')))

Я получил идею вышеупомянутого подхода по этой ссылке для этого подхода, для каждой категории я получаю хороший результат, минимум 77 и максимум 96, в целом хороший результат.

в чем причина? Вот как выглядят мои данные:

id,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
...