Есть ли причина, по которой особенность, присутствующая только в данном классе, не была сильно предсказана в этом классе? - PullRequest
1 голос
/ 01 февраля 2020

Резюме и вопросы

Я использую liblinear 2.30 - я заметил похожую проблему в prod, поэтому я попытался изолировать ее с помощью простой сокращенной тренировки с 2 классами, 1 поезд делать c на класс 5 функций с одинаковым весом в моем словаре и 1 простой тест делают c, содержащий только одну функцию, присутствующую только в классе 2.

  • a) для чего используется значение функции ?

  • b) Я хотел понять, почему этот тестовый документ, содержащий одну особенность, которая присутствует только в одном классе, не является строго предсказанным для этого класса?

  • c) Я не ожидаю иметь разные значения для функций. Есть ли какие-либо другие последствия увеличения значения каждого элемента с 1 до чего-то еще? Как я могу определить это число?

  • d) Могут ли мои изменения негативно повлиять на другие более сложные тренировки?

Что я пробовал

Ниже вы найдете данные, относящиеся к простому обучению (пожалуйста, обратите внимание на функцию 5):

> cat train.txt
1 1:1 2:1 3:1
2 2:1 4:1 5:1
> train -s 0 -c 1 -p 0.1 -e 0.01 -B 0 train.txt model.bin
iter  1 act 3.353e-01 pre 3.333e-01 delta 6.715e-01 f 1.386e+00 |g| 1.000e+00 CG   1
iter  2 act 4.825e-05 pre 4.824e-05 delta 6.715e-01 f 1.051e+00 |g| 1.182e-02 CG   1
> cat model.bin
solver_type L2R_LR
nr_class 2
label 1 2
nr_feature 5
bias 0
w
0.3374141436539016
0
0.3374141436539016
-0.3374141436539016
-0.3374141436539016
0

И это вывод этой модели:

solver_type L2R_LR
nr_class 2
label 1 2
nr_feature 5
bias 0
w
0.3374141436539016
0
0.3374141436539016
-0.3374141436539016
-0.3374141436539016
0
1 5:10

Ниже вы найдете прогноз моей модели:

> cat test.txt
1 5:1
> predict -b 1 test.txt model.bin test.out
Accuracy = 0% (0/1)
> cat test.out
labels 1 2
2 0.416438 0.583562

И вот здесь я немного удивлен, потому что предсказания просто [0.42, 0.58] как функция 5 присутствует только в классе 2. Почему? Поэтому я просто попытался увеличить значение функции для теста до c с 1 до 10:

> cat newtest.txt
1 5:10
> predict -b 1 newtest.txt model.bin newtest.out
Accuracy = 0% (0/1)
> cat newtest.out
labels 1 2
2 0.0331135 0.966887

И теперь я получаю лучший прогноз [0.03, 0.97]. Таким образом, я попытался заново скомпилировать свое обучение со всеми функциями, установленными в 10:

> cat newtrain.txt
1 1:10 2:10 3:10
2 2:10 4:10 5:10
> train -s 0 -c 1 -p 0.1 -e 0.01 -B 0 newtrain.txt newmodel.bin
iter  1 act 1.104e+00 pre 9.804e-01 delta 2.508e-01 f 1.386e+00 |g| 1.000e+01 CG   1
iter  2 act 1.381e-01 pre 1.140e-01 delta 2.508e-01 f 2.826e-01 |g| 2.272e+00 CG   1
iter  3 act 2.627e-02 pre 2.269e-02 delta 2.508e-01 f 1.445e-01 |g| 6.847e-01 CG   1
iter  4 act 2.121e-03 pre 1.994e-03 delta 2.508e-01 f 1.183e-01 |g| 1.553e-01 CG   1
> cat newmodel.bin
solver_type L2R_LR
nr_class 2
label 1 2
nr_feature 5
bias 0
w
0.19420510395364846
0
0.19420510395364846
-0.19420510395364846
-0.19420510395364846
0
> predict -b 1 newtest.txt newmodel.bin newtest.out
Accuracy = 0% (0/1)
> cat newtest.out
labels 1 2
2 0.125423 0.874577

И снова прогнозы все еще были в порядке для класса 2: 0.87

1 Ответ

1 голос
/ 03 февраля 2020

a) для чего используется значение объекта?

Каждый экземпляр из n объектов рассматривается как точка в n-мерном пространстве, прикрепленная к данной метке, скажем + 1 или -1 (в вашем случае 1 или 2). Линейный SVM пытается найти лучшую гиперплоскость, чтобы разделить этот экземпляр на два набора, скажем, SetA и SetB. Гиперплоскость считается лучше, чем у других, если SetA содержит больше экземпляров, помеченных +1, а SetB содержит больше экземпляров с -1. то есть более точный. Лучшая гиперплоскость сохраняется как модель. В вашем случае гиперплоскость имеет формулировку:

f(x)=w^T x

, где w - модель, например (0,33741,0,0.33741, -0.33741, -0.33741) в вашем первом случае.

Вероятность (для LR) формулировка:

prob(x)=1/(1+exp(-y*f(x))

, где y = + 1 или -1. См. Приложение L LIBLINEAR paper .

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

Не только 1 5:1 дает слабую вероятность, такую ​​как [0.42,0.58], если вы прогнозируете 2 2:1 4:1 5:1, вы получите [0.337417,0.662583], что, как кажется, решатель также не очень уверен в результате даже входные данные точно совпадают с набором обучающих данных.

Фундаментальная причина - это значение f (x), или его можно просто рассматривать как расстояние между x и гиперплоскостью. Он может быть на 100% уверен, что x принадлежит к определенному классу, только если расстояние бесконечно велико (см. Prob (x)).

c) Я не ожидаю, что в функции. Есть ли какие-либо другие последствия увеличения значения каждого элемента с 1 до чего-то еще? Как я могу определить это число?

TL; DR

Увеличение как тренировочного, так и тестового набора похоже на увеличение параметра штрафа C (- c вариант). Поскольку большее C означает более строгое наказание за ошибку, интуитивно говоря, решатель имеет больше уверенности в предсказании.


Расширение каждой функции обучающего набора похоже на имея меньший C. В частности, регрессия logisti c решает следующее уравнение для w.

min 0.5 w^T w + C ∑i log(1+exp(−yi w^T xi)) 

(уравнение (3) из LIBLINEAR paper )

Для большинства случаев yi w^T xi положительно и больше xi означает меньшее ∑i log(1+exp(−yi w^T xi)). Таким образом, эффект чем-то похож на меньший C, а меньший C подразумевает меньший | w |.

С другой стороны, увеличение тестового набора такое же как имеющий большой | ш |. Следовательно, эффект от увеличения как тренировочного, так и тестового набора в основном равен

(1). Having smaller |w| when training
(2). Then, having larger |w| when testing

Поскольку эффект более драматичен c в (2), чем (1), в целом увеличение как тренировочного, так и испытательного набора похоже на имея большую | w | или большую C.

. Мы можем работать с набором данных и умножать все функции на 10 ^ 12. С C = 1 у нас есть модель и вероятность

> cat model.bin.m1e12.c1
solver_type L2R_LR
nr_class 2
label 1 2
nr_feature 5
bias 0
w
3.0998430106024949e-12 
0 
3.0998430106024949e-12 
-3.0998430106024949e-12 
-3.0998430106024949e-12 
0 
> cat test.out.m1e12.c1
labels 1 2
2 0.0431137 0.956886

Далее мы запускаем исходный набор данных. При C = 10 ^ 12 мы имеем вероятность

> cat model.bin.m1.c1e12
solver_type L2R_LR
nr_class 2
label 1 2
nr_feature 5
bias 0
w
3.0998430101989314 
0 
3.0998430101989314 
-3.0998430101989314 
-3.0998430101989314 
0 
> cat test.out.m1.c1e12
labels 1 2
2 0.0431137 0.956886

Следовательно, поскольку большее значение C означает более строгое наказание за ошибку, поэтому интуитивно решатель будет более уверенным в прогнозировании.

d) Могут ли мои изменения негативно повлиять на другие более сложные тренировки?

Из (c) мы знаем, что ваши изменения похожи на увеличение C, и это приведет к в лучшей точности обучения. Но почти можно быть уверенным, что модель больше подходит , чем тренировочный набор, когда C становится слишком большим. В результате модель не может выдержать шум в тренировочном наборе и будет плохо работать в тестовой точности.

Что касается поиска хорошего C, популярным способом является перекрестная проверка (опция -v).


Наконец,

это может быть не так c, но вы можете посмотреть, как предварительно обрабатывать текстовые данные. Обычно (например, предложенный автором liblinear здесь ) нормализует данные по экземплярам.

По классификации документов наш опыт показывает, что если вы нормализуете каждый документ на единицу длины, то не только время обучения будет меньше, но и производительность будет лучше.

...