Я пытаюсь применить логистическую регрессию «один против всех», чтобы классифицировать редакционные статьи по тематическим категориям на основе их текста, используя 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
--probabilities
вам не нужны ни--link=logistic
, ни--raw_predictions
. Ваши данные о тренировках перемешаны (или упорядочены в естественном хронологическом порядке)? - person Martin Popel   schedule 08.07.2016--probabilities
и--link=logistic
. Да, я позаботился перетасовать свои примеры перед тренировкой. (На самом деле, благодаря еще одному твоему ответу) - person vaer-k   schedule 08.07.2016--link=logisitic
?--probabilities
вычисляет функцию логистической ссылки внутренне. Также попробуйте опустить--save_resume
: это необходимо только в том случае, если вам нужно обучить модель за несколько шагов (и это может повлиять на отчетную потерю теста, если используется на последнем этапе обучения). - person Martin Popel   schedule 09.07.2016--ect N
, а не--oaa N
, алгоритм сходится намного лучше. Кроме того, как вы заметили, у вас есть тысячи функций и только 81 пример, данных которых может быть недостаточно для схождения, поэтому вы вообще не переобучаете (это онлайн-обучение, а не пакетное обучение). Попробуйте выполнить несколько проходов (например, с-c --passes 10 --no_holdout
) для тренировки. Вы можете видеть, что ваша ошибка все еще очень велика (около 46% примеров ошибочны) после одного прохода. - person arielf - Reinstate Monica   schedule 09.07.2016/tmp/test.vw
? Правильно ли отформатирован файл (как/tmp/train.vw
)? - person Martin Popel   schedule 09.07.2016-t
, этот формат должен быть приемлемым, не так ли? - person vaer-k   schedule 11.07.2016--link=logistic
и--raw_predictions
, но результаты остались прежними. Однако выполнение нескольких проходов дало гораздо лучшие результаты: ошибка при обучении снизилась с 46% до 1%. Я не могу использовать--ect
для выполнения мультикласса, потому что мне нужно использовать--probabilties
, что, по-видимому, несовместимо, потому что ошибка, указывающая, что--probabilities
является нераспознанным параметром, появляется, когда я делаю прогнозы для набора, обученного с помощью ect. Я опубликовал новые результаты с несколькими проходами в моем исходном вопросе. - person vaer-k   schedule 11.07.2016--ect N
не поддерживает--probabilities
по очевидным причинам: он выполняется за время журнала N, но присвоение вероятностей всем N классам не может быть выполнено за это время. И да, если у вас всего 2179 примеров, и вы хотите переобучить, вам нужно больше проходов и--holdout_off
. - person Martin Popel   schedule 12.07.2016