Линейный поиск завершается с ошибкой в обучении ksvm prob.model
Вслед за Недопустимая вероятностная модель для больших векторных машин с поддержкой ksvm в R:
Я тренирую SVM, используя ksvm из пакета kernlab в R. Я хочу использовать вероятностную модель, но во время сигмоидальной установки я получаю следующее сообщение об ошибке:
line search fails -1.833726 0.5772808 5.844462e-05 5.839508e-05 -1.795008e-08
-1.794263e-08 -2.096847e-12
Когда это произойдет, результирующее значение prob.model(m)
является вектором всех вероятностей, а не ожидаемыми параметрами сигмоидной функции, установленной по этим вероятностям. Что вызывает эту ошибку и как я могу ее предотвратить? Поиск сообщения об ошибке не дал никаких результатов.
Воспроизводимый пример:
load(url('http://roelandvanbeek.nl/files/df.rdata'))
ksvm(label~value,df[1:1000],C=10,prob.model=TRUE)->m
prob.model(m) # works as it should, prints a list containing one named list
# the below, non-working problem, unfortunately takes an hour due to the large
# sample size
ksvm(label~value,df,C=10,prob.model=TRUE)->m # line search fails
prob.model(m) # just a vector of values
Ответы
Ответ 1
Глядя на исходный код, это строка, которая выдает эту ошибку.
Это метод .probPlatt
с использованием метода Newton для оптимизации функции, в данном случае масштабирования Platt. Если вы проверите строку 3007, вы увидите некоторые параметры, относящиеся к методу.
Одним из таких параметров является minstep
в основном минимальный числовой шаг, который должен продолжать пытаться оптимизировать функцию. Понимаете, это точно условие ошибки в строке 3090: if (stepsize < minstep)
. Таким образом, в принципе, функция не сходится даже при достижении минимального размера шага.
Вы можете попробовать изменить minstep
на более низкие значения, чтобы обойти его. Alexandros даже прокомментировал эти параметры, вероятно, должен быть в интерфейсе.
Ответ 2
Мне кажется, что проблема возникает случайно. Таким образом, я обошел проблему, подгоняя модель ksvm столько раз, сколько она работала.
stop.crit = 1
while (stop.crit <= 10) {
stop.crit = stop.crit + 1
MOD = ksvm(...)
tryCatch(PRED = predict(...), error = function(e) e)
if (exists("PRED") == TRUE) stop.crit = 11
}