2

Я пытаюсь использовать OneVsRestClassifier для выполнения многосетевой классификации по набору комментариев. Моя цель - пометить каждый комментарий для возможного списка тем. Мой пользовательский классификатор использует свернутый вручную список слов и их соответствующие теги в csv для каждого комментария. Я пытаюсь объединить результаты, полученные из техники Bag of Words и моего пользовательского классификатора, используя VotingClassifier. Вот часть моего существующего кода:Использование пользовательского классификатора для классификации mutilabel с GridSearchCV и OneVsRestClassifier

import numpy as np 

from sklearn.base import BaseEstimator, ClassifierMixin 
from sklearn.ensemble import VotingClassifier 
from sklearn.feature_extraction.text import CountVectorizer, TfidfTransformer 
from sklearn.grid_search import GridSearchCV 
from sklearn.linear_model import SGDClassifier 
from sklearn.multiclass import OneVsRestClassifier 
from sklearn.pipeline import Pipeline 
from sklearn.preprocessing import MultiLabelBinarizer 

class CustomClassifier(BaseEstimator, ClassifierMixin): 
    def __init__(self, word_to_tag): 
     self.word_to_tag = word_to_tag 

    def fit(self, X, y=None): 
     return self 

    def predict_proba(self, X): 
     prob = np.zeros(shape=(len(self.word_to_tag), 2)) 

     for index, comment in np.ndenumerate(X): 
      prob[index] = [0.5, 0.5] 
      for word, label in self.word_to_tag.iteritems(): 
       if (label == self.class_label) and (comment.find(word) >= 0): 
        prob[index] = [0, 1] 
        break 

     return prob 

    def _get_label(self, ...): 
     # Need to have a way of knowing which label being classified 
     # by OneVsRestClassifier (self.class_label) 

bow_clf = Pipeline([('vect', CountVectorizer(stop_words='english', min_df=1, max_df=0.9)), 
        ('tfidf', TfidfTransformer(use_idf=False)), 
        ('clf', SGDClassifier(loss='log', penalty='l2', alpha=1e-3, n_iter=5)), 
        ]) 
custom_clf = CustomClassifier(word_to_tag_dict) 

ovr_clf = OneVsRestClassifier(VotingClassifier(estimators=[('bow', bow_clf), ('custom', custom_clf)], 
               voting='soft')) 

params = { 'estimator_weights': ([1, 1], [1, 2], [2, 1]) } 
gs_clf = GridSearchCV(ovr_clf, params, n_jobs=-1, verbose=1, scoring='precision_samples') 

binarizer = MultiLabelBinarizer() 

gs_clf.fit(X, binarizer.fit_transform(y)) 

Мое намерение состоит в том, чтобы использовать это вручную Куратор список слов, полученных несколько эвристики, чтобы улучшить результаты, полученные исключительно применяя мешок слов. В настоящее время я изо всех сил пытаюсь найти способ узнать, какая метка классифицируется во время прогнозирования, поскольку для каждого ярлыка создается экземпляр CustomClassifier с использованием OneVsRestClassifier.

+0

self.class_label кажется неопределенным мне. Я не уверен, что вы имеете в виду под термином «какая маркировка классифицируется». Этикетки предсказываются из данных. – Manoj

+0

Да, мой вопрос в основном как определить, что такое 'self.class_label'? Поэтому, когда OneVsRestClassifier подходит для данных, он клонирует оценку (https://github.com/scikit-learn/scikit-learn/blob/51a765a/sklearn/multiclass.py#L73) для каждой классифицируемой метки (https: // github.com/scikit-learn/scikit-learn/blob/51a765a/sklearn/multiclass.py#L283), если вы выполняете многоуровневую классификацию. Итак, в основном то, что мне нужно, - это способ определить, какая метка клонированного CustomClassifier соответствует при расчете 'pred_proba'. – dshah

+0

Чтобы описать далее, позвольте привести пример. Скажем, комментарий: «Еда в этом ресторане была отличная. Обслуживание в этом ресторане было также феноменальным». И скажем, что я работал с надписями '['food'," staff "," location "," other ", ...]'. Затем OneVsRestClassifier создает клон «VotingClassifier» в этом случае для каждой метки. Это рекурсивно также делает копию «CustomClassifier» для каждой метки. Но я не знаю, как бы определить, какой ярлык соответствует конкретному экземпляру «CustomClassifier». – dshah

ответ

1
+0

'ovr_clf.classes_' выглядит как массив numpy от 0 до' n_classes-1', как описано в 'shape = [n_classes]'. Я ищу, чтобы определить, какая метка является одним из экземпляров 'VotingClassifier' в массиве' ovr_clf.estimators_', соответствует тому, когда я пытаюсь «подгонять» данные. – dshah

+0

либо этот массив является ответом, либо я не понимаю ваш вопрос. Первая оценка - класс 0 и остальная часть, вторая оценка - класс 1 и остальные. Если вы назвали свои классы по-другому, вы найдете их имена там. –

+0

Итак, когда я пытаюсь подогнать данные на 'gs_clf', многоканальный бинаризатор преобразует метки' y' из '" food "," staff "," location "," other ", ...]' в массив из 1s и 0s '[0 1 0 0 ...]'. Итак, что соответствует 0-15 в ovr_clf.classes_? Означает ли это, что каждый порядок списка 'ovr_clf.estimators_' совпадает с порядком меток, представляющих столбцы в' [0 1 0 0 ...] '? (что в основном означает его то же, что и порядок, как и классы в списке «binarizer.classes») – dshah