Линейный поиск завершается с ошибкой в ​​обучении 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
}