¿Cómo funciona internamente la función predict_proba () de sklearn.svm.svc?

Estoy usando sklearn.svm.svc de scikit-learn para hacer una clasificación binaria. Estoy usando su función predict_proba () para obtener estimaciones de probabilidad. ¿Alguien puede decirme cómo predict_proba () calcula internamente la probabilidad?

Scikit-learn usa LibSVM internamente, y esto a su vez usa el escalado Platt , como se detalla en esta nota de los autores de LibSVM , para calibrar el SVM para producir probabilidades además de las predicciones de clase.

El escalado de Platt requiere primero entrenar el SVM como de costumbre, luego optimizar los vectores de parámetros A y B de tal manera que

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

donde f(X) es la distancia firmada de una muestra desde el hiperplano (método de decision_function de decision_function scikit-learn). Puede reconocer el sigmoide logístico en esta definición, la misma función que la regresión logística y las redes neuronales utilizan para convertir las funciones de decisión en estimaciones de probabilidad.

Tenga en cuenta que: el parámetro B , la “intersección” o “sesgo” o como se llame, pueden hacer que las predicciones basadas en las estimaciones de probabilidad de este modelo sean inconsistentes con las que obtiene de la función de decisión SVM f . Por ejemplo, supongamos que f(X) = 10 , entonces la predicción para X es positiva; pero si B = -9.9 y A = 1 , entonces P(y|X) = .475 . Estoy sacando estos números de la nada, pero has notado que esto puede ocurrir en la práctica.

Efectivamente, la escala de Platt entrena un modelo de probabilidad en la parte superior de las salidas del SVM bajo una función de pérdida de entropía cruzada. Para evitar que este modelo se adapte en exceso, utiliza una validación cruzada interna de cinco veces, lo que significa que el entrenamiento de SVM con probability=True puede ser mucho más costoso que un SVM de vainilla no probabilístico.

En realidad, encontré una respuesta ligeramente diferente: utilizaron este código para convertir el valor de decisión en probabilidad

 '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)) ;' 

Aquí los valores A y B se pueden encontrar en el archivo modelo (probA y probB). Ofrece una forma de convertir la probabilidad al valor de decisión y, por lo tanto, a la pérdida de la articulación.

Utilice que ln (0) = -200.