Метки многопрофильной классификации по скикиту


19

Я пытаюсь создать классификатор с несколькими метками, чтобы назначать темы для существующих документов с помощью scikit.

Я обрабатываю свои документы, пропускаю их через TfidfVectorizerярлыки MultiLabelBinarizerи создаю в OneVsRestClassifierкачестве SGDClassifierоценщика.

Однако при тестировании моего классификатора я получаю баллы только до .29, что, как я прочитал, довольно мало для подобных проблем. Я пробовал несколько вариантов на TfidfVectorizer, таких как стоп-слова, надписи, stemming, и ничто, кажется, не меняет результат так сильно.

Я также использовал, GridSearchCVчтобы получить лучшие параметры для моей оценки, и в настоящее время у меня нет идей о том, что попробовать дальше.

В то же время, от того, что я понимаю , что я не могу использовать scikit.metricsс OneVsRestClassifierтаким , как я могу получить некоторые метрики (F1, Precision, Recall и т.д.), чтобы выяснить , что не так?

Может ли быть проблема с моим корпусом данных?

Обновление: я также пытался использовать CountVectorizerи HashingVectorizerи конвейерную их, TfidfTransformerно результаты похожи. Итак, я предполагаю, что подход «мешок слов» делает все возможное в области токенизации, а остальное зависит от классификатора ...


1
Что такое 0,29 измерения? Точность? Что-то другое?
— Sycorax сообщает, что восстановит Монику

@GeneralAbrial Согласно документации scikit, работающей scoreна классификаторе,Returns the mean accuracy on the given test data and labels. In multi-label classification, this is the subset accuracy which is a harsh metric since you require for each sample that each label set be correctly predicted.
— mobius

Это то, что вы сделали? Из вашего вопроса совсем не ясно, что это так, поэтому это вполне разумный вопрос.
— Sycorax сообщает, что восстановит Монику

@GeneralAbrial Да, это то, что я сделал. Извините за путаницу, я пытался держать вопрос в более теоретическом режиме, а не в разработке.
— Мобиус

Можете ли вы добавить свой код здесь? В частности, вы используете sample_weight = "сбалансированный" для SGD? Но могут быть и другие вещи, на которые стоит обратить внимание, когда мы увидим ваш код.
— Диего

Ответы:


21

Точность подмножества - действительно суровая метрика. Чтобы понять, насколько хорош или плох 0.29, давайте подумаем:

  • посмотрите, сколько этикеток у вас в среднем на каждый образец
  • посмотрите соглашение между аннотаторами, если оно доступно (если нет, попробуйте сами выяснить, какая точность подмножества получается, когда вы классификатор)
  • подумайте, хорошо ли определена тема
  • посмотрите, сколько образцов у вас есть для каждого ярлыка

Вы также можете вычислить балл Хэмминга, чтобы увидеть, является ли ваш классификатор невежественным или достаточно приличным, но у него есть проблемы с предсказанием всех меток правильно. Смотрите ниже, чтобы вычислить счет Хэмминга.

В то же время, насколько я понимаю, я не могу использовать scikit.metrics с OneVsRestClassifier, так как я могу получить некоторые метрики (F1, Precision, Recall и т. Д.), Чтобы выяснить, что не так?

См. Как вычислить точность / отзыв для классификации мультикласса и мультиметки? , Я забыл, поддерживает ли Sklearn это, я помню, что у него были некоторые ограничения, например, Sklearn не поддерживает мульти-метки для матрицы путаницы . Было бы неплохо увидеть эти цифры действительно.


Счет Хэмминга :

В параметре классификации с несколькими метками sklearn.metrics.accuracy_scoreвычисляется только точность подмножества (3): то есть набор меток, предсказанный для выборки, должен точно соответствовать соответствующему набору меток в y_true.

Этот способ вычисления точности иногда называют, возможно, менее двусмысленно, точным коэффициентом соответствия (1):

введите описание изображения здесь

Другой типичный способ вычисления точности определен в (1) и (2), и менее неоднозначно упоминается как оценка Хэмминга (4) (так как он тесно связан с потерей Хэмминга), или точность на основе меток ). Он рассчитывается следующим образом:

введите описание изображения здесь

Вот метод python для вычисления счета Хэмминга:

# Code by /programming//users/1953100/william
# Source: /programming//a/32239764/395857
# License: cc by-sa 3.0 with attribution required

import numpy as np

y_true = np.array([[0,1,0],
                   [0,1,1],
                   [1,0,1],
                   [0,0,1]])

y_pred = np.array([[0,1,1],
                   [0,1,1],
                   [0,1,0],
                   [0,0,0]])

def hamming_score(y_true, y_pred, normalize=True, sample_weight=None):
    '''
    Compute the Hamming score (a.k.a. label-based accuracy) for the multi-label case
    /programming//q/32239577/395857
    '''
    acc_list = []
    for i in range(y_true.shape[0]):
        set_true = set( np.where(y_true[i])[0] )
        set_pred = set( np.where(y_pred[i])[0] )
        #print('\nset_true: {0}'.format(set_true))
        #print('set_pred: {0}'.format(set_pred))
        tmp_a = None
        if len(set_true) == 0 and len(set_pred) == 0:
            tmp_a = 1
        else:
            tmp_a = len(set_true.intersection(set_pred))/\
                    float( len(set_true.union(set_pred)) )
        #print('tmp_a: {0}'.format(tmp_a))
        acc_list.append(tmp_a)
    return np.mean(acc_list)

if __name__ == "__main__":
    print('Hamming score: {0}'.format(hamming_score(y_true, y_pred))) # 0.375 (= (0.5+1+0+0)/4)

    # For comparison sake:
    import sklearn.metrics

    # Subset accuracy
    # 0.25 (= 0+1+0+0 / 4) --> 1 if the prediction for one sample fully matches the gold. 0 otherwise.
    print('Subset accuracy: {0}'.format(sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)))

    # Hamming loss (smaller is better)
    # $$ \text{HammingLoss}(x_i, y_i) = \frac{1}{|D|} \sum_{i=1}^{|D|} \frac{xor(x_i, y_i)}{|L|}, $$
    # where
    #  - \\(|D|\\) is the number of samples  
    #  - \\(|L|\\) is the number of labels  
    #  - \\(y_i\\) is the ground truth  
    #  - \\(x_i\\)  is the prediction.  
    # 0.416666666667 (= (1+0+3+1) / (3*4) )
    print('Hamming loss: {0}'.format(sklearn.metrics.hamming_loss(y_true, y_pred))) 

Выходы:

Hamming score: 0.375
Subset accuracy: 0.25
Hamming loss: 0.416666666667

(1) Сороуер, Мохаммад С. " Литературное исследование по алгоритмам многокомпонентного обучения". Государственный университет Орегона, Корваллис (2010)

(2) Цумакас, Григориос и Иоаннис Катакис. « Мультимарочная классификация: обзор». Кафедра информатики, Университет Аристотеля в Салониках, Греция (2006).

(3) Гамрави, Надя и Эндрю МакКаллум. « Коллективная классификация по нескольким меткам ». Материалы 14-й международной конференции ACM по управлению информацией и знаниями. ACM, 2005.

(4) Годболе, Шантану и Сунита Сараваги. « Дискриминационные методы для классификации с несколькими метками ». Достижения в области обнаружения знаний и интеллектуального анализа данных. Springer Berlin Heidelberg, 2004. 22-30.


отличный ответ, это только сделало меня лучше :) Я собираюсь прочитать это более тщательно, попробовать счет Хэмминга и вернуться к вам!
— Мобиус

Если честно, мне не совсем понятно, что именно является подмножеством точности (точное соотношение). Не могли бы вы объяснить немного больше? Кажется, что в случае мультикласса это идентично вспомнить.
— Поэт Модит

Эти hamming_scoreфункциональные ошибки вне на Keras: <IPython-вход-34-16066d66dfdd> в hamming_score (y_true, y_pred, нормализуют, sample_weight) 60 ''»61 acc_list = [] ---> 62 для г в диапазоне (y_true.shape [ 0]): 63 set_true = set (np.where (y_true [i]) [0]) 64 set_pred = set (np.where (y_pred [i]) [0]) TypeError: индекс возвращен не-int (тип NoneType )
— Рюрни

0

Разве 0,29 балла недостаточно? Как выглядит ваша матрица путаницы? Есть ли какие-то темы, которые нельзя отделить, возможно, только просмотрев содержание слова?

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

Чтобы проверить эту гипотезу, вам нужен набор тестовых документов с известными характеристиками пакета слов (которые вы создаете сами). Вы должны получить 100% баллов.

Если нет, значит у вас ошибка. В противном случае вам нужен другой подход для классификации ваших документов. Задайте себе вопрос: чем отличаются документы разных классов? Нужно ли мне смотреть на другие функции моих документов и т. Д.


Помимо чисел, я чувствую, что 0,29 является низким. Я использую обученную модель, чтобы предсказать темы в документах, которые я уже использовала в обучении, чтобы вручную протестировать классификатор. Мне не удалось получить хотя бы такое же количество тем, которое пользователь ввел в документ вручную. Я обычно просто получаю их подмножество. Кроме того, что касается вопроса о матрице смущения, я не думаю, что смогу получить матрицу смущения на OneVsRestClassifier с помощью scikit.metrics ... Я проверю это, хотя
— mobius
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.