Классификатор логистической регрессии один против всех с Vowpal Wabbit

Я пытаюсь применить логистическую регрессию «один против всех», чтобы классифицировать редакционные статьи по тематическим категориям на основе их текста, используя vowpal wabbit. Когда я пытаюсь делать прогнозы для новых статей, используя те же данные, которые использовались для обучения, у меня плохие результаты, но я ожидал бы нереально хороших результатов из-за переобучения. В этом случае я действительно хочу переобучить, потому что хочу убедиться, что правильно использую vowpal wabbit.

Моя модель обучается на примерах, которые выглядят следующим образом, где каждая функция - это слово из статьи, а каждая метка - идентификатор категории, например спорт или развлечения: 1 | the baseball player ... stadium 4 | musicians played all ... crowd ... 2 | fish are an ... squid

Моя тренировочная команда выглядит так: vw --oaa=19 --loss_function=logistic --save_resume -d /tmp/train.vw -f /tmp/model.vw

Моя команда тестирования выглядит так: vw -t --probabilities --loss_function=logistic --link=logistic -d /tmp/test.vw -i /tmp/model.vw -p /tmp/predict.vw --raw_predictions=/tmp/predictions_raw.vw

Я использую --probabilities и --link=logistic, потому что хочу, чтобы мои результаты можно было интерпретировать как вероятность того, что статья принадлежит этому классу.

У меня очевидная проблема с размером моего набора данных (81 пример и 52000 функций), но я ожидал, что это приведет к серьезному переобучению, и, следовательно, любые прогнозы, сделанные для того же набора данных, что и обучающие данные, будут довольно хорошими. Я что-то делаю не так с моими командами vowpal wabbit? Я плохо понимаю науку о данных?

Вот результат команды обучения:

Num weight bits = 18
learning rate = 0.5
initial_t = 0
power_t = 0.5
using no cache
Reading datafile = /tmp/train.vw
num sources = 1
average  since         example        example  current  current  current
loss     last          counter         weight    label  predict features
1.000000 1.000000            1            1.0       15        1      451
1.000000 1.000000            2            2.0        8       15      296
1.000000 1.000000            4            4.0        8        7      333
0.875000 0.750000            8            8.0       15       15      429
0.500000 0.125000           16           16.0        8        7      305
0.531250 0.562500           32           32.0       12        8      117
0.500000 0.468750           64           64.0        3       15      117

finished run
number of examples per pass = 81
passes used = 1
weighted example sum = 81.000000
weighted label sum = 0.000000
average loss = 0.518519
total feature number = 52703

И для команды тестирования:

only testing
predictions = /tmp/predict.vw
raw predictions = /tmp/predictions_raw.vw
Num weight bits = 18
learning rate = 0.5
initial_t = 0
power_t = 0.5
using no cache
Reading datafile = /tmp/test.vw
num sources = 1
average  since         example        example  current  current  current
loss     last          counter         weight    label  predict features
1.000000 -0.015873            1            1.0 4294967295   3( 7%)      117
1.000000 1.000000            2            2.0 4294967295   3( 7%)       88
1.000000 1.000000            4            4.0 4294967295   3( 7%)      188
1.000000 1.000000            8            8.0 4294967295   9( 7%)     1175
1.000000 1.000000           16           16.0 4294967295   5( 7%)      883
1.000000 1.000000           32           32.0 4294967295   7( 7%)      229
1.000000 1.000000           64           64.0 4294967295  15( 7%)      304

finished run
number of examples per pass = 40
passes used = 2
weighted example sum = 81.000000
weighted label sum = 0.000000
average loss = 1.000000
average multiclass log loss = 999.000000
total feature number = 52703

person vaer-k    schedule 08.07.2016    source источник
comment
С --probabilities вам не нужны ни --link=logistic, ни --raw_predictions. Ваши данные о тренировках перемешаны (или упорядочены в естественном хронологическом порядке)?   -  person Martin Popel    schedule 08.07.2016
comment
@MartinPopel Понятно, спасибо. Мне не удается найти информацию о том, что именно делают --probabilities и --link=logistic. Да, я позаботился перетасовать свои примеры перед тренировкой. (На самом деле, благодаря еще одному твоему ответу)   -  person vaer-k    schedule 08.07.2016
comment
Вы пробовали без --link=logisitic? --probabilities вычисляет функцию логистической ссылки внутренне. Также попробуйте опустить --save_resume: это необходимо только в том случае, если вам нужно обучить модель за несколько шагов (и это может повлиять на отчетную потерю теста, если используется на последнем этапе обучения).   -  person Martin Popel    schedule 09.07.2016
comment
Мое первое правило для мультикласса - использовать --ect N, а не --oaa N, алгоритм сходится намного лучше. Кроме того, как вы заметили, у вас есть тысячи функций и только 81 пример, данных которых может быть недостаточно для схождения, поэтому вы вообще не переобучаете (это онлайн-обучение, а не пакетное обучение). Попробуйте выполнить несколько проходов (например, с -c --passes 10 --no_holdout) для тренировки. Вы можете видеть, что ваша ошибка все еще очень велика (около 46% примеров ошибочны) после одного прохода.   -  person arielf - Reinstate Monica    schedule 09.07.2016
comment
Теперь я вижу текущую метку = 4294967295 в тестовом выводе. Вероятно, это настоящая причина больших потерь при тестировании. У вас есть золотые этикетки в /tmp/test.vw? Правильно ли отформатирован файл (как/tmp/train.vw)?   -  person Martin Popel    schedule 09.07.2016
comment
@MartinPopel В test.vw нет ярлыков. Я отформатировал их вот так, без метки (но все же с пробелом): `| бейсболист ... стадион` Когда используется -t, этот формат должен быть приемлемым, не так ли?   -  person vaer-k    schedule 11.07.2016
comment
@MartinPopel, можете ли вы рассказать, откуда взялся этот label = 4294967295? Где я могу найти дополнительную информацию о том, что делает vw «под капотом» для создания этого лейбла?   -  person vaer-k    schedule 11.07.2016
comment
Я пробовал опускать --link=logistic и --raw_predictions, но результаты остались прежними. Однако выполнение нескольких проходов дало гораздо лучшие результаты: ошибка при обучении снизилась с 46% до 1%. Я не могу использовать --ect для выполнения мультикласса, потому что мне нужно использовать --probabilties, что, по-видимому, несовместимо, потому что ошибка, указывающая, что --probabilities является нераспознанным параметром, появляется, когда я делаю прогнозы для набора, обученного с помощью ect. Я опубликовал новые результаты с несколькими проходами в моем исходном вопросе.   -  person vaer-k    schedule 11.07.2016
comment
4294967295 = 23 ^ 2 - 1 - это наивысшее значение типа unsigned int, обычное контрольное значение, а также результат присвоения -1 беззнаковому int. Вам не нужно иметь метки в вашем тестовом наборе, но тогда VW, конечно, не сможет вычислить тестовые потери. --ect N не поддерживает --probabilities по очевидным причинам: он выполняется за время журнала N, но присвоение вероятностей всем N классам не может быть выполнено за это время. И да, если у вас всего 2179 примеров, и вы хотите переобучить, вам нужно больше проходов и --holdout_off.   -  person Martin Popel    schedule 12.07.2016


Ответы (1)


Я считаю, что моя главная проблема заключалась в том, что мне нужно было делать больше проходов. Я не совсем понимаю, как vw реализует онлайн-обучение и чем это отличается от пакетного обучения, но после выполнения нескольких проходов средняя потеря упала до 13%. При включенном --holdout_off эта потеря упала до% 1. Большое спасибо @arielf и @MartinPopel

Running training command with 2421 examples: vw --oaa=19 --loss_function=logistic --save_resume -c --passes 10 -d /tmp/train.vw -f /tmp/model.vw
final_regressor = /tmp/model.vw
Num weight bits = 18
learning rate = 0.5
initial_t = 0
power_t = 0.5
decay_learning_rate = 1
using cache_file = /tmp/train.vw.cache
ignoring text input in favor of cache input
num sources = 1
average  since         example        example  current  current  current
loss     last          counter         weight    label  predict features
1.000000 1.000000            1            1.0       11        1      234
1.000000 1.000000            2            2.0        6       11      651
1.000000 1.000000            4            4.0        2       12     1157
1.000000 1.000000            8            8.0        4        2       74
1.000000 1.000000           16           16.0       12       15      171
0.906250 0.812500           32           32.0        9        6        6
0.750000 0.593750           64           64.0       15       19      348
0.625000 0.500000          128          128.0       12       12      110
0.566406 0.507812          256          256.0       12        5      176
0.472656 0.378906          512          512.0        5        5      168
0.362305 0.251953         1024         1024.0       16        8      274
0.293457 0.224609         2048         2048.0        3        4      118
0.224670 0.224670         4096         4096.0        8        8      850 h
0.191419 0.158242         8192         8192.0        6        6      249 h
0.164926 0.138462        16384        16384.0        3        4      154 h

finished run
number of examples per pass = 2179
passes used = 10
weighted example sum = 21790.000000
weighted label sum = 0.000000
average loss = 0.132231 h
total feature number = 12925010
person vaer-k    schedule 11.07.2016