Правильность логистической регрессии в Vowpal Wabbit?

Я начал использовать Vowpal Wabbit для логистической регрессии, однако не могу воспроизвести результаты, которые он дает. Возможно, в нем есть какая-то недокументированная «магия», но смог ли кто-нибудь воспроизвести / проверить / проверить расчеты для логистической регрессии?

Например, с помощью простых данных ниже мы стремимся смоделировать способ, которым age предсказывает label. Очевидно, что существует сильная взаимосвязь, поскольку с возрастом вероятность наблюдения 1 увеличивается.

В качестве простого модульного теста я использовал следующие 12 строк данных:

age label
20  0
25  0
30  0
35  0
40  0
50  0
60  1
65  0
70  1
75  1
77  1
80  1

Теперь, выполняя логистическую регрессию для этого набора данных с помощью R, SPSS или даже вручную, создает модель, которая выглядит как L = 0.2294*age - 14.08. Итак, если я подставлю возраст и использую логит-преобразование prob = 1 / (1 + EXP (-L)), я могу получить прогнозируемые вероятности, которые варьируются от 0.0001 для первой строки до 0.9864 для последней строки, как разумно ожидалось. .

Если я вставлю те же данные в Vowpal Wabbit,

-1 'P1 |f age:20
-1 'P2 |f age:25
-1 'P3 |f age:30
-1 'P4 |f age:35
-1 'P5 |f age:40
-1 'P6 |f age:50
1 'P7 |f age:60
-1 'P8 |f age:65
1 'P9 |f age:70
1 'P10 |f age:75
1 'P11 |f age:77
1 'P12 |f age:80

А затем выполните логистическую регрессию, используя

vw -d data.txt -f demo_model.vw --loss_function logistic --invert_hash aaa

(командная строка соответствует Как выполнить логистическую регрессию с использованием vowpal wabbit на очень несбалансированном набор данных), я получаю модель L= -0.00094*age - 0.03857, которая сильно отличается.

Прогнозируемые значения, полученные с использованием -r или -p, дополнительно подтверждают это. Результирующие вероятности в конечном итоге почти одинаковы, например, 0.4857 для возраста = 20 и 0.4716 для возраста = 80, что очень мало.

Я заметил это несоответствие и с большими наборами данных. В каком смысле Vowpal Wabbit по-другому выполняет логистическую регрессию и как интерпретировать результаты?


person sling    schedule 18.07.2014    source источник


Ответы (1)


Это распространенное заблуждение о vowpal wabbit.

Нельзя сравнивать пакетное обучение с онлайн-обучением.

vowpal wabbit не предназначен для группового обучения. Это онлайн-ученик. Онлайн-учащиеся учатся, просматривая примеры по одному и немного корректируя веса модели по мере продвижения.

У онлайн-обучения есть свои преимущества и недостатки. Обратной стороной является то, что приближение к окончательной модели происходит медленно / постепенно. Учащийся не выполняет «идеальную» работу по извлечению информации из каждого примера, потому что процесс является повторяющимся. Сходимость к окончательному результату намеренно сдерживается / замедляется. Из-за этого онлайн-учащиеся могут показаться слабыми на крошечных наборах данных, подобных приведенным выше.

Однако есть несколько плюсов:

  • Онлайн-учащимся не нужно загружать полные данные в память (они работают, исследуя один пример за раз и корректируя модель на основе наблюдаемых в реальном времени потерь для каждого примера), поэтому они могут легко масштабироваться до миллиардов примеров. Статья 2011 г. 4 Yahoo! Исследователи описывают, как vowpal wabbit использовался для обучения с помощью набора данных tera (10 ^ 12) за 1 час на 1k узлах. Пользователи регулярно используют vw для изучения миллиардов примеров наборов данных на своих настольных компьютерах и ноутбуках.
  • Онлайн-обучение является адаптивным и может отслеживать изменения условий с течением времени, поэтому оно может учиться на нестационарных данных, таких как обучение против адаптивного противника.
  • Самоанализ обучения: один может наблюдать скорость сходимости потерь во время обучения и выявить конкретные проблемы и даже получить важную информацию из конкретных примеров или функций набора данных.
  • Онлайн-учащиеся могут учиться постепенно, поэтому пользователи могут смешивать помеченные и немаркированные примеры, чтобы продолжать обучение, одновременно делая прогнозы.
  • Расчетная ошибка, даже во время обучения, всегда "вне выборки", что является хорошей оценкой ошибка теста. Нет необходимости разделять данные на обучающие и тестовые подмножества или выполнять N-стороннюю перекрестную проверку. Следующий (пока невидимый) пример всегда используется в качестве сдерживающего фактора. Это огромное преимущество перед пакетными методами с точки зрения эксплуатации. Это значительно упрощает типичный процесс машинного обучения. Кроме того, пока вы не выполняете многократные проходы по данным, это служит отличным механизмом предотвращения чрезмерной подгонки.

Онлайн-ученики очень чувствительны к порядку примеров. Наихудший возможный порядок для онлайн-ученика - это когда классы сгруппированы вместе (сначала появляются все или почти все -1, а затем все 1), как в приведенном выше примере. Итак, первое, что нужно сделать, чтобы получить лучшие результаты от онлайн-ученика, такого как vowpal wabbit, - это равномерно перемешать 1s и -1s (или просто упорядочить по времени, как примеры обычно появляются в реальной жизни).


Хорошо, что теперь?

В: Есть ли способ создать разумную модель в том смысле, что она дает разумные прогнозы для небольших данных при использовании онлайн-учащегося?

О: Да, есть!

Вы можете более точно подражать тому, что делает пакетное обучение, выполнив два простых шага:

  • Перемешайте 1 и -1 примеры.
  • Выполните несколько проходов над данными, чтобы дать учащемуся возможность сойтись

Предостережение: если вы выполняете несколько проходов до тех пор, пока ошибка не станет 0, существует опасность переобучения. Онлайн-учащийся прекрасно усвоил ваши примеры, но они могут плохо обобщаться на невидимые данные.

Вторая проблема заключается в том, что прогнозы, которые дает vw, не преобразованы в логистическую функцию (это прискорбно). Они сродни стандартным отклонениям от средней точки (усеченной до [-50, 50]). Вам необходимо передать прогнозы через utl/logistic (в исходном дереве), чтобы получить вероятности со знаком. Обратите внимание, что эти вероятности со знаком находятся в диапазоне [-1, +1], а не [0, 1]. Вы можете использовать logistic -0 вместо logistic, чтобы сопоставить их с диапазоном [0, 1].

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

# Train:
vw train.vw -c --passes 1000 -f model.vw --loss_function logistic --holdout_off


# Predict on train set (just as a sanity check) using the just generated model:
vw -t -i model.vw train.vw -p /dev/stdout | logistic | sort -tP -n -k 2

Даем более ожидаемый результат на вашем наборе данных:

-0.95674145247658 P1
-0.930208359811439 P2
-0.888329575506748 P3
-0.823617739247262 P4
-0.726830630992614 P5
-0.405323815830325 P6
0.0618902961794472 P7
0.298575998150221 P8
0.503468453150847 P9
0.663996516371277 P10
0.715480084449868 P11
0.780212725426778 P12

Вы можете сделать результаты более / менее поляризованными (ближе к 1 для старших возрастов и ближе к -1 для младших), увеличивая / уменьшая количество проходов. Также вас могут заинтересовать следующие варианты тренировок:

--max_prediction <arg>     sets the max prediction to <arg>
--min_prediction <arg>     sets the min prediction to <arg>
-l <arg>                   set learning rate to <arg>

Например, увеличивая скорость обучения со значения по умолчанию 0.5 до большого числа (например, 10), вы можете заставить vw сходиться намного быстрее при обучении на небольших наборах данных, что требует меньшего количества проходов, чтобы добраться туда.

Обновить

С середины 2014 года vw больше не требует внешней logistic утилиты для сопоставления прогнозов с диапазоном [0,1]. Новая опция --link logistic отображает прогнозы в диапазон логистической функции [0, 1]. Аналогичным образом --link glf1 отображает прогнозы в диапазон обобщенной логистической функции [-1, 1].

person arielf - Reinstate Monica    schedule 18.07.2014
comment
Большое спасибо за отличный вопрос. Повторное посещение через несколько месяцев, похоже, помогло нескольким другим пользователям лучше понять vowpal wabbit. - person arielf - Reinstate Monica; 08.02.2015
comment
Я получил зашитый результат от vw, что когда я добавляю --l1 или --l2 регуляризацию, я получаю все прогнозы на 0,5 (это означает, что все функции равны 0) - person zihaolucky; 24.09.2015
comment
@zihaolucky - Думаю, потому что ваши --l1 или --l2 аргументы слишком велики. Попробуйте использовать небольшие значения, например --l1 1e-6. Подсказка: --readable_model r.model и изучение r.model может помочь выяснить, сколько функций осталось в окончательной модели после регуляризации. - person arielf - Reinstate Monica; 24.09.2015
comment
@arielf да, я попробовал меньший штраф и вроде нормально. Но его производительность в тестовом наборе не лучше, чем без l1 / l2. Я поднимаю здесь новый вопрос stackoverflow.com/questions/32752833/ - person zihaolucky; 24.09.2015