Как выполнить логистическую регрессию с помощью vowpal wabbit на очень несбалансированном наборе данных

Я пытаюсь использовать vowpal wabbit для логистической регрессии. Я не уверен, что это правильный синтаксис для этого

For training, I do

 ./vw -d ~/Desktop/new_data.txt --passes 20 --binary --cache_file cache.txt -f lr.vw --loss_function logistic --l1 0.05

For testing I do 
./vw -d ~/libsvm-3.18_test/matlab/new_data_test.txt --binary -t -i lr.vw -p predictions.txt -r raw_score.txt

вот фрагмент из моих данных поезда

-1:1.00038 | 110:0.30103 262:0.90309 689:1.20412 1103:0.477121 1286:1.5563 2663:0.30103 2667:0.30103 2715:4.63112 3012:0.30103 3113:8.38411 3119:4.62325 3382:1.07918 3666:1.20412 3728:5.14959 4029:0.30103 4596:0.30103

1:2601.25 | 32:2.03342 135:3.77379 146:3.19535 284:2.5563 408:0.30103 542:3.80618 669:1.07918 689:2.25527 880:0.30103 915:1.98227 1169:5.35371 1270:0.90309 1425:0.30103 1621:0.30103 1682:0.30103 1736:3.98227 1770:0.60206 1861:4.34341 1900:3.43136 1905:7.54141 1991:5.33791 2437:0.954243 2532:2.68664 3370:2.90309 3497:0.30103 3546:0.30103 3733:0.30103 3963:0.90309 4152:3.23754 4205:1.68124 4228:0.90309 4257:1.07918 4456:0.954243 4483:0.30103 4766:0.30103

вот фрагмент из моих тестовых данных

-1 | 110:0.90309 146:1.64345 543:0.30103 689:0.30103 1103:0.477121 1203:0.30103 1286:2.82737 1892:0.30103 2271:0.30103 2715:4.30449 3012:0.30103 3113:7.99039 3119:4.08814 3382:1.68124 3666:0.60206 3728:5.154 3960:0.778151 4309:0.30103 4596:0.30103 4648:0.477121

однако, если я посмотрю на результаты, прогнозы все -1 и сырые оценки все 0s. У меня около 200 000 примеров, из которых 100 +1, а остальные -1. Чтобы справиться с этими несбалансированными данными, я дал положительный результат примеры вес 200,000 / 100 и отрицательный пример вес 200,000 / (200000-100). Это потому, что мои данные действительно очень несбалансированы, хотя я регулирую Весы, что это происходит?

Я ожидал вывода (P (y|x)) в файле raw score. Но я получаю все нули. Мне просто нужны вероятностные результаты. Есть предложения, что происходит, ребята?

2 ответов


суммирование подробного ответа arielf.

  1. важно знать что запланированная функция окончательной стоимости (потери) : Логистические потери, 0/1 потери (т. е. точность), оценка F1, область под кривой RO, что-то еще?

  2. вот код Bash для части ответа arielf. Обратите внимание, что мы должны сначала удалить странные попытки важности взвешивания из поезда.txt (я имею в виду":1.00038" и ":2601.25" в вопрос.)

    A. Prepare the training data
    grep '^-1' train.txt | shuf > neg.txt
    grep '^1' train.txt | shuf > p.txt
    for i in `seq 2000`; do cat p.txt; done > pos.txt
    paste -d '\n' neg.txt pos.txt > newtrain.txt
    
    B. Train model.vw
    # Note that passes=1 is the default.
    # With one pass, holdout_off is the default.
    `vw -d newtrain.txt --loss_function=logistic -f model.vw`
    #average loss = 0.0953586
    
    C. Compute test loss using vw
    `vw -d test.txt -t -i model.vw --loss_function=logistic -r   
    raw_predictions.txt`
    #average loss = 0.0649306
    
    D. Compute AUROC using http://osmot.cs.cornell.edu/kddcup/software.html
    cut -d ' ' -f 1 test.txt | sed -e 's/^-1/0/' > gold.txt
    $VW_HOME/utl/logistic -0 raw_predictions.txt > probabilities.txt
    perf -ROC -files gold.txt probabilities.txt 
    #ROC    0.83484
    perf -ROC -plot roc -files gold.txt probabilities.txt | head -n -2 > graph
    echo 'plot "graph"' | gnuplot -persist
    

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

неуравновешенные учебные наборы лучшие практики:

ваш тренировочный набор очень несбалансирован (200,000 до 100). Это означает, что только 0.0005 (0.05%) примеров имеют метку 1. Всегда предсказывая -1, классификатор достигает замечательной точности 99,95%. В другими словами, если стоимость ложноположительного равна стоимости ложноотрицательного, это на самом деле отличный классификатор. Если вы ищете равновзвешенный результат, вам нужно сделать две вещи:

  • перевесьте свои примеры, чтобы меньшая группа имела одинаковый вес с большей
  • порядок/перемешать примерах плюсы и минусы перемешиваются.

2-й пункт особенно важен в онлайн-обучении где скорость обучения уменьшается со временем. Из этого следует, что идеальный порядок, предполагающий, что вам разрешено свободно переупорядочивать (например, нет временной зависимости между примерами), для онлайн-обучения-это полностью равномерное перемешивание (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 ...)

рассмотрим downsampling преобладающего класса

чтобы избежать чрезмерной подгонки: вместо того, чтобы перевешивать редкий класс 2000x, подумайте о том, чтобы пойти в противоположную сторону и "недооценить" более распространенный класс, отбросив большинство его примеров. Хотя это может показаться удивительным (как может быть полезно выбрасывать совершенно хорошие данные?) это позволит избежать чрезмерной подгонки повторяющегося класса как описано выше, и может фактически привести к лучше генерализации. В зависимости от случая и затрат на ложную классификацию оптимальный коэффициент отбора проб может варьироваться (в данном случае он не обязательно равен 1/2000, но может находиться в пределах от 1 до 1/2000). Другой подход, требующий некоторого программирования, заключается в использовании активного обучения: тренируйтесь на очень малой части данных, затем продолжайте прогнозировать класс без обучения (-t или нулевой вес); если класс преобладающий класс и онлайн-классификатор очень уверен в результате (прогнозируемое значение экстремально или очень близко к -1 при использовании --link glf1), выбросьте избыточный пример. IOW:сосредоточьте свое обучение только на граничных случаях.


использование --binary (зависит от ваших потребностей)

--binary выводит знак прогноза (и вычисляет прогрессивные потери соответственно). Если вы хотите вероятности, сделать не использовать --binary и трубы 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 означает " обобщенная логистическая функция с