Я пытаюсь использовать 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.
self.class_label кажется неопределенным мне. Я не уверен, что вы имеете в виду под термином «какая маркировка классифицируется». Этикетки предсказываются из данных. – Manoj
Да, мой вопрос в основном как определить, что такое '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
Чтобы описать далее, позвольте привести пример. Скажем, комментарий: «Еда в этом ресторане была отличная. Обслуживание в этом ресторане было также феноменальным». И скажем, что я работал с надписями '['food'," staff "," location "," other ", ...]'. Затем OneVsRestClassifier создает клон «VotingClassifier» в этом случае для каждой метки. Это рекурсивно также делает копию «CustomClassifier» для каждой метки. Но я не знаю, как бы определить, какой ярлык соответствует конкретному экземпляру «CustomClassifier». – dshah