python - score - svc c
Convertir la función de decisión de LinearSVC a probabilidades(Scikit learn python) (4)
Utilizo SVM lineal de scikit learn (LinearSVC) para el problema de clasificación binaria. Entiendo que LinearSVC puede darme las etiquetas predichas y los puntajes de decisión, pero quería estimaciones de probabilidad (confianza en la etiqueta). Quiero seguir usando LinearSVC debido a la velocidad (en comparación con sklearn.svm.SVC con kernel lineal) ¿Es razonable usar una función logística para convertir los puntajes de decisión en probabilidades?
import sklearn.svm as suppmach
# Fit model:
svmmodel=suppmach.LinearSVC(penalty=''l1'',C=1)
predicted_test= svmmodel.predict(x_test)
predicted_test_scores= svmmodel.decision_function(x_test)
Quiero comprobar si tiene sentido obtener estimaciones de probabilidad simplemente como [1 / (1 + exp (-x))] donde x es la puntuación de decisión.
Alternativamente, ¿hay otras opciones de clasificadores de wrt que puedo usar para hacer esto de manera eficiente?
Gracias.
Eché un vistazo a los apis en la familia sklearn.svm. *. Todos los modelos a continuación, por ejemplo,
- sklearn.svm.SVC
- sklearn.svm.NuSVC
- sklearn.svm.SVR
- sklearn.svm.NuSVR
tener una interface común que suministra una
probability: boolean, optional (default=False)
Parámetro al modelo. Si este parámetro se establece en Verdadero, libsvm entrenará un modelo de transformación de probabilidad en la parte superior de las salidas de la SVM basándose en la idea de Platt Scaling . La forma de transformación es similar a una función logística como usted señaló, sin embargo, dos constantes específicas A
y B
se aprenden en un paso de post-procesamiento. También vea esta publicación de para más detalles.
En realidad, no sé por qué este procesamiento posterior no está disponible para LinearSVC. De lo contrario, solo debería llamar a predict_proba(X)
para obtener la estimación de probabilidad.
Por supuesto, si solo aplica una transformación logística ingenua, no funcionará tan bien como un enfoque calibrado como Platt Scaling . Si puede comprender el algoritmo de subrayado de la escala de platt, probablemente pueda escribir el suyo propio o contribuir a la familia de svm scikit-learn. :) También siéntase libre de usar las cuatro variaciones SVM anteriores que admiten predict_proba
.
Si desea velocidad, simplemente reemplace el SVM con sklearn.linear_model.LogisticRegression
. Utiliza el mismo algoritmo de entrenamiento que LinearSVC
, pero con pérdida de registro en lugar de pérdida de bisagra.
Usar [1 / (1 + exp (-x))] producirá probabilidades, en un sentido formal (números entre cero y uno), pero no se adherirán a ningún modelo de probabilidad justificable.
Si lo que realmente desea es una medida de confianza en lugar de probabilidades reales, puede usar el método LinearSVC.decision_function()
. Consulte la documentation .
scikit-learn proporciona CalibratedClassifierCV que se puede usar para resolver este problema: permite agregar una salida de probabilidad a LinearSVC o cualquier otro clasificador que implemente el método de toma de decisión:
svm = LinearSVC()
clf = CalibratedClassifierCV(svm)
clf.fit(X_train, y_train)
y_proba = clf.predict_proba(X_test)
La guía del usuario tiene una buena section sobre eso. De forma predeterminada, CalibratedClassifierCV + LinearSVC le proporcionará el escalado Platt, pero también brinda otras opciones (método de regresión isotónica), y no está limitado a los clasificadores SVM.