Я пытаюсь использовать vowpal wabbit для логистической регрессии. Я не уверен, что это правильный синтаксис для этого.
Однако, если я посмотрю на результаты, прогнозы будут равны -1, а сырые оценки - все 0. У меня около 200 000 примеров, из которых 100 составляют +1, а остальные -1. Чтобы справиться с этими несбалансированными данными, я дал вес положительных примеров 200 000/100 и отрицательный вес примера 200 000/(200000-100). Это потому, что мои данные похожи на действительно сильно неуравновешенные, хотя я настраиваю весы, которые это происходит?
Я ожидал выход (P (y | x)) в исходном файле оценки. Но я получаю все нули. Мне просто нужны вероятностные выходы. Любые предложения о том, что происходит с парнями?
Ответ 2
Аналогичный вопрос был отправлен в списке рассылки vw. Я попытаюсь обобщить основные моменты во всех ответах здесь для будущих пользователей.
Неуравновешенный тренинг устанавливает лучшие практики:
Ваш тренировочный комплект очень неуравновешен (от 200 000 до 100). Это означает, что только 0,0005 (0,05%) примеров имеют метку 1
. Всегда прогнозируя -1
, классификатор достигает замечательной точности 99,95%. Другими словами, если стоимость ложноположительного равна стоимости ложноотрицательного, это на самом деле отличный классификатор. Если вы ищете равноценный результат, вам нужно сделать две вещи:
- Повторите свои примеры, чтобы меньшая группа имела равный вес для большего.
- Переупорядочить/перетасовать примеры, чтобы помехи и негативы были перемешаны.
Второй момент особенно важен в онлайн-обучении, где скорость обучения с течением времени уменьшается. Из этого следует, что идеальный порядок, предполагающий, что вам разрешено свободно изменять порядок (например, нет зависимости от времени между примерами), для онлайн-обучения является полностью равномерной тасовкой (1, -1, 1, -1, ...)
Также обратите внимание, что синтаксис для примера-весов (при условии коэффициента распространенности 2000: 1) должен быть примерно следующим:
1 2000 optional-tag| features ...
-1 1 optional-tag| features ...
И, как упоминалось выше, разбив один взвешенный пример 2000
, чтобы иметь только вес 1
, повторяя его 2000 раз и чередуя его с общими примерами 2000 (тегами с меткой -1
):
1 | ...
-1 | ...
1 | ... # repeated, very rare, example
-1 | ...
1 | ... # repeated, very rare, example
Должно привести к еще большему результату с точки зрения более плавной конвергенции и снижения потерь при тренировках. * Предостережение: как правило, повторение любого примера слишком сильно, как в случае отношения 1: 2000, очень вероятно, чтобы привести к переопределению повторяющегося класса. Возможно, вам захочется противопоставить это медленным обучением (используя --learning_rate ...
) и/или рандомизированную передискретизацию: (используя --bootstrap ...
)
Рассмотрим понижающую дискретизацию преобладающего класса
Чтобы избежать чрезмерной установки: вместо того, чтобы перегружать редкий класс 2000x, рассмотрите обратный путь и "недостаточный вес" более общий класс, исключив большинство его примеров. Хотя это может показаться удивительным (как можно отбросить отличные данные, полезно?), Это позволит избежать переопределения повторяющегося класса, как описано выше, и может фактически привести к лучшему обобщению. В зависимости от случая и стоимости ложной классификации оптимальный коэффициент выборки может варьироваться (это не обязательно 1/2000 в этом случае, но может быть где-то между 1 и 1/2000). Другой подход, требующий некоторого программирования, - использовать активное обучение: тренироваться на очень небольшой части данных, а затем продолжать прогнозировать класс без обучения (-t
или нулевой вес); если класс является преобладающим классом, и онлайновый классификатор очень уверен в результатах (предсказанное значение является экстремальным или очень близко к -1
при использовании --link glf1
), отбросьте избыточный пример. IOW: сосредоточьте свое обучение только на граничных случаях.
Использование --binary
(зависит от ваших потребностей)
--binary
выводит знак прогноза (и соответственно вычисляет прогрессивные потери). Если вам нужны вероятности, не используйте вывод --binary
и pipe vw
для прогнозирования в utl/logistic
(в исходном дереве). utl/logistic
отобразит необработанное предсказание в подписанные вероятности в диапазоне [-1, +1]
.
Один эффект --binary
- вводить в заблуждение (оптимистичную) потерю. Предположения о зажимах {-1, +1} могут значительно увеличить кажущуюся точность, поскольку каждое правильное предсказание имеет потерю 0,0. Это может ввести в заблуждение, так как просто добавление --binary
часто заставляет его выглядеть так, как если бы модель была намного более точной (иногда совершенно точной), чем без --binary
.
Обновление (сентябрь 2014 г.): недавно добавлена новая опция vw
: --link logistic
, которая реализует отображение [0,1]
при прогнозировании внутри vw
. Аналогично, --link glf1
реализует наиболее часто используемое отображение [-1, 1]
. Мнемоника: glf1
означает "обобщенная логистическая функция с диапазоном [-1, 1]
"
Легко переходите к --l1
и --l2
Общепринятой ошибкой является использование высоких значений --l1
и/или --l2
. Значения используются непосредственно для примера, а не, скажем, относительно 1.0
. Точнее: в vw
: l1
и l2
применимы непосредственно к сумме градиентов (или "нормы" ) в каждом примере. Попытайтесь использовать гораздо более низкие значения, например --l1 1e-8
. utl/vw-hypersearch
может помочь вам найти оптимальные значения различных гиперпараметров.
Будьте осторожны с несколькими проходами
Общепринятой ошибкой является использование --passes 20
, чтобы свести к минимуму ошибку обучения. Помните, что целью является минимизация ошибки обобщения, а не ошибки обучения. Даже при прохладном добавлении holdout
(благодаря Zhen Qin), где vw
автоматически рано заканчивается, когда ошибка перестает падать на автоматически выставляемые данные (по умолчанию каждый 10-й пример выставляется), многократные проходы будут в конечном итоге начинают переполнять запатентованные данные (принцип "без бесплатного обеда" ).