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

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

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

Как простой unit test, я использовал 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. Поэтому, если я подменяю возраст и использую преобразование logit 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 выполняет логистическую регрессию по-разному и как интерпретировать результаты?

Ответы

Ответ 1

Это распространенное недоразумение воблевой магии.

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

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

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

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

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

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


Хорошо, что?

Q: Есть ли способ создать разумную модель в том смысле, что она дает разумные прогнозы по малым данным при использовании онлайн-ученика?

A: Да, есть!

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

  • Примеры равномерного тасования 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 сходиться намного быстрее при обучении на небольших наборах данных, что требует меньше проходов, чтобы получить есть.

Update

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