Подтвердить что ты не робот

Как функция sklearn.svm.svc предсказывает_пробу() работать внутри?

Я использую sklearn.svm.svc из scikit-learn выполнять двоичную классификацию. Я использую функцию pred_proba() для получения вероятностных оценок. Может ли кто-нибудь сказать мне, как pred_proba() внутренне вычисляет вероятность?

4b9b3361

Ответ 1

Scikit-learn использует LibSVM внутренне, и это, в свою очередь, использует масштабирование Platt, как описано в эта заметка авторов LibSVM, чтобы калибровать SVM для создания вероятностей в дополнение к предсказаниям класса.

Масштабирование Platt требует сначала обучения SVM, как обычно, затем оптимизации векторов параметров A и B таких, что

P(y|X) = 1 / (1 + exp(A * f(X) + B))

где f(X) - знаковое расстояние образца от гиперплоскости (метод scikit-learn decision_function). Вы можете распознать логистический сигмоид в этом определении, ту же функцию, что и логистическая регрессия и нейронные сети, для преобразования функций решения в вероятностные оценки.

Имейте в виду: параметр B, "перехват" или "смещение" или все, что вы хотите называть, может привести к тому, что прогнозы, основанные на оценках вероятности из этой модели, будут несовместимы с теми, которые вы получаете от решения SVM функция f. Например. предположим, что f(X) = 10, то прогноз для X положителен; но если B = -9.9 и A = 1, то P(y|X) = .475. Я вытягиваю эти цифры из воздуха, но вы заметили, что это может произойти на практике.

Эффективно, масштабирование Platt обучает вероятностную модель поверх выходов SVM под функцией потери поперечной энтропии. Чтобы предотвратить переопределение этой модели, она использует внутреннюю пятикратную перекрестную проверку, что означает, что обучение SVM с помощью probability=True может быть намного дороже, чем ванильный, не вероятностный SVM.

Ответ 2

На самом деле я нашел несколько другой ответ, что они использовали этот код для преобразования значения решения в вероятность

'double fApB = decision_value*A+B;
if (fApB >= 0)
    return Math.exp(-fApB)/(1.0+Math.exp(-fApB));
else
     return 1.0/(1+Math.exp(fApB)) ;'

Здесь значения A и B можно найти в файле модели (probA и probB). Он предлагает способ преобразования вероятности в значение решения и, таким образом, для потери петли.

Используйте это ln (0) = -200.