Разница Vowpal Wabbit между необработанными прогнозами (-r) и прогнозами (-p)

Я пытаюсь классифицировать двоичные данные. В файле данных класс [0,1] преобразуется в [-1,1]. Данные имеют 21 функцию. Все функции являются категориальными. Я использую нейронную сеть для обучения. Тренировочная команда:

     vw -d train.vw --cache_file  data --passes 5 -q sd  -q ad  -q do -q fd --binary -f model  --nn 22

Я создаю необработанный файл прогноза как:

    vw -d test.vw -t -i neuralmodel -r raw.txt

И обычный файл предсказания как:

    vw -d test.vw -t -i neuralmodel -p out.txt

Первые пять строк необработанного файла:

    0:-0.861075,-0.696812 1:-0.841357,-0.686527 2:0.796014,0.661809 3:1.06953,0.789289 4:-1.23823,-0.844951 5:0.886767,0.709793 6:2.02206,0.965555 7:-2.40753,-0.983917 8:-1.09056,-0.797075 9:1.22141,0.84007 10:2.69466,0.990912 11:2.64134,0.989894 12:-2.33309,-0.981359 13:-1.61462,-0.923839 14:1.54888,0.913601 15:3.26275,0.995055 16:2.17991,0.974762 17:0.750114,0.635229 18:2.91698,0.994164 19:1.15909,0.820746 20:-0.485593,-0.450708 21:2.00432,0.964333 -0.496912
    0:-1.36519,-0.877588 1:-2.83699,-0.993155 2:-0.257558,-0.251996 3:-2.12969,-0.97213 4:-2.29878,-0.980048 5:2.70791,0.991148 6:1.31337,0.865131 7:-2.00127,-0.964116 8:-2.14167,-0.972782 9:2.50633,0.986782 10:-1.09253,-0.797788 11:2.29477,0.97989 12:-1.67385,-0.932057 13:-0.740598,-0.629493 14:0.829695,0.680313 15:3.31954,0.995055 16:3.44069,0.995055 17:2.48612,0.986241 18:1.32241,0.867388 19:1.97189,0.961987 20:1.19584,0.832381 21:1.65151,0.929067 -0.588528
    0:0.908454,0.72039 1:-2.48134,-0.986108 2:-0.557337,-0.505996 3:-2.15072,-0.973263 4:-1.77706,-0.944375 5:0.202272,0.199557 6:2.37479,0.982839 7:-1.97478,-0.962201 8:-1.78124,-0.944825 9:1.94016,0.959547 10:-1.67845,-0.932657 11:2.54895,0.987855 12:-1.60502,-0.92242 13:-2.32369,-0.981008 14:1.59895,0.921511 15:2.02658,0.96586 16:2.55443,0.987987 17:3.47049,0.995055 18:1.92482,0.958313 19:1.47773,0.901044 20:-3.60913,-0.995055 21:3.56413,0.995055 -0.809399
    0:-2.11677,-0.971411 1:-1.32759,-0.868656 2:2.59003,0.988807 3:-0.198721,-0.196146 4:-2.51631,-0.987041 5:0.258549,0.252956 6:1.60134,0.921871 7:-2.28731,-0.97959 8:-2.89953,-0.993958 9:-0.0972349,-0.0969177 10:3.1409,0.995055 11:1.62083,0.924746 12:-2.30097,-0.980134 13:-2.05674,-0.967824 14:1.6744,0.932135 15:1.85612,0.952319 16:2.7231,0.991412 17:1.97199,0.961995 18:3.47125,0.995055 19:0.603527,0.539567 20:1.25539,0.84979 21:2.15267,0.973368 -0.494474
    0:-2.21583,-0.97649 1:-2.16823,-0.974171 2:2.00711,0.964528 3:-1.84079,-0.95087 4:-1.27159,-0.854227 5:-0.0841799,-0.0839635 6:2.24566,0.977836 7:-2.19458,-0.975482 8:-2.42779,-0.98455 9:0.39883,0.378965 10:1.32133,0.86712 11:1.87572,0.95411 12:-2.22585,-0.976951 13:-2.04512,-0.96708 14:1.52652,0.909827 15:1.98228,0.962755 16:2.37265,0.982766 17:1.73726,0.939908 18:2.315,0.980679 19:-0.08135,-0.081154 20:1.39248,0.883717 21:1.5889,0.919981 -0.389856

Первые пять строк (обычного) файла прогноза:

   -0.496912
   -0.588528
   -0.809399
   -0.494474
   -0.389856

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

Я хотел бы понимать необработанный вывод как обычный вывод. То, что каждая строка содержит 22 пары значений, связано с 22 нейронами? Как интерпретировать вывод как [-1,1] и почему сигмовидная функция необходима для преобразования любого из вышеперечисленного в вероятности. Будем признательны за помощь.


person user3282777    schedule 02.03.2015    source источник


Ответы (1)


Для бинарной классификации следует использовать подходящую функцию потерь (--loss_function=logistic или --loss_function=hinge). Переключатель --binary просто гарантирует, что заявленная потеря является потерей 0/1 (но вы не можете напрямую оптимизировать потери 0/1, функция потерь по умолчанию — --loss_function=squared).

Я рекомендую попробовать --nn в качестве одного из последних шагов при настройке параметров VW. Обычно это лишь немного улучшает результаты, а оптимальное количество юнитов в скрытом слое довольно мало (--nn 1, --nn 2 или --nn 3). Вы также можете попробовать добавить прямое соединение между входным и выходным слоями с помощью --inpass. Обратите внимание, что --nn всегда использует tanh в качестве сигмовидной функции для скрытого слоя, и возможен только один скрытый слой (он жестко запрограммирован в nn.cc).

Если вы хотите получить вероятности (действительное число из [0,1]), используйте vw -d test.vw -t -i neuralmodel --link=logistic -p probabilities.txt. Если вы хотите, чтобы вывод был действительным числом из [-1,1], используйте --link=glf1.

Без --link и --binary выходные данные --pred являются внутренними прогнозами (в диапазоне [-50, 50] при использовании логистической функции или функции потерь шарнира).

Что касается вопроса --nn --raw, ваше предположение верно: 22 пары чисел соответствуют 22 нейронам, а последнее число является окончательным (внутренним) предсказанием. Я предполагаю, что каждая пара соответствует смещению и выходу каждой единицы на скрытом слое.

person Martin Popel    schedule 02.03.2015
comment
Большое спасибо за ваше время. Он проясняет многие вопросы. Я попробую еще раз. - person user3282777; 02.03.2015