2013-09-23 2 views
2

У меня проблема классификации с несколькими классами в наборе данных (с 6 целевыми классами). Данные обучения имеют искаженное распределение меток классов: Ниже приведено распределение каждого из класса меток (1 до 6)Практические рекомендации по установке весов для примеров в vowpal wabbit

(array([174171,  12,  29, 8285, 9996, 11128]), 

Я использую схему OAa vowpal Wabbit, чтобы классифицировать и попытался вес по умолчанию 1.0 для каждого примера. Однако для большинства моделей это просто приводит к модели, предсказывающей 1.0 для всех примеров в оценке (поскольку метка 1 имеет очень большое представление в наборе обучения).

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

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

Будет ли выбор модели играть роль в определении веса. Я экспериментирую с нейронными сетями и функциями логистики и потери петли.

ответ

3

Там может быть лучше подходит, но я хотел бы начать, как вы делали, обратным взвешиванием примеры на основе редкости их ярлыках следующим образом:

Сумма подсчетов меток = 174171 + 12 + 29 + 8285 + 9996 + 11128 = 203621 так

Метка 1 появляться 174171 раз (85,5% от общего числа) будет взвешен: 203621/174171 = 1.16909 Метка 2 появляется 12 раз (редчайший) будет взвешен: 203621/12 = 16968.4

и так далее.

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

Если вы сделали перетасовка хорошо, и вы получите плохую производительность на новых примерах, вы можете взвешивать повторно менее агрессивно, например, взять sqrt() обратных весов, а затем, если это все еще слишком агрессивен, переключиться на log() обратных весов, и т. д.

Другим подходом является использование одного из новых чувствительных к стоимости вариантов нескольких классов, например --csoaa В вики VW на github есть несколько примеров с подробными сведениями о том, как использовать эти параметры и их форматы обучения.

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

Смежные вопросы