Optimizar SVM para evitar falsos negativos en la clasificación binaria

9

Estoy entrenando un clasificador binario SVM usando Scikit learn.

Debido a la naturaleza de mi problema, necesito evitar falsos negativos. Como nada es gratis, estoy bien obteniendo una tasa más alta de falsos positivos para reducir la cantidad de falsos negativos. ¿Cómo podemos hacer eso (idealmente con Scikit learn)?

En otras palabras, ¿cómo podemos minimizar los falsos negativos usando un clasificador SVM? ¿Hay alguna forma de ajustar los hiperparámetros para favorecer los falsos positivos sobre los falsos negativos?

Pierre-Antoine
fuente
2
No necesita cambiar la forma en que optimiza su SVM, solo necesita cambiar a qué valor de decisión declara que una observación es negativa o positiva. Ajusta eso al gusto.
Sycorax dice Reinstate Monica
@Sycorax ¿Podrías dar más detalles?
Pierre-Antoine
3
La salida de un SVM es un número real, una distancia (con signo) del hiperplano X. Una función de decisión dice que paraX>C, es positivo; de lo contrario es negativo, para algunos específicosC. Tu puedes cambiarCpara cambiar el contenido de una matriz de confusión / las estimaciones de TPR, FPR, FNR, TNR.
Sycorax dice Reinstate Monica
1
Creo que esta pregunta sería más directa sobre el tema si enfatizara los principios estadísticos o matemáticos más generales en lugar de cómo hacer esto en sklearn. (Siento que mis comentarios demuestran que, en esencia, esta pregunta es de naturaleza estadística.)
Sycorax dice Reinstate Monica
Edite según lo sugerido por Sycorax; como lo indica la respuesta resumida en los comentarios, entonces sería responsable aquí.
Glen_b: reinstala a Monica

Respuestas:

4

La implementación de Scikit learn del clasificador binario SVM no le permite establecer un umbral de corte como lo han sugerido los otros comentarios / respuestas. En lugar de dar probabilidades de clase, aplica un límite predeterminado para darle la membresía de la clase, por ejemplo, 1 o 2.

Para minimizar los falsos negativos, puede establecer pesos más altos para las muestras de entrenamiento etiquetadas como clase positiva, de forma predeterminada, los pesos se establecen en 1 para todas las clases. Para cambiar esto, use el hiperparámetro class_weight.

Idealmente, debe evitar elegir un límite y simplemente proporcionar las probabilidades de clase a los usuarios finales que luego pueden decidir qué límite aplicar al tomar decisiones basadas en el clasificador.

Una mejor métrica para comparar clasificadores es una función de puntuación adecuada, consulte https://en.wikipedia.org/wiki/Scoring_rule y el score()método en el módulo clasificador svm sklearn.svm.SVC.

Sandeep S. Sandhu
fuente
1

Como muchos modelos predictivos, SVM generará puntajes de probabilidad y aplicará el umbral a la probabilidad para convertirlo en etiquetas positivas o negativas.

Como, @Sycorax mencionó en el comentario, puede ajustar el umbral de corte para ajustar el equilibrio entre falso positivo y falso negativo.

Aquí hay un ejemplo en R.

library(kernlab)
library(mlbench)
graphics.off()
set.seed(0)

d=mlbench.2dnormals(500)
plot(d)
# using 2nd order polynominal expansion
svp <- ksvm(d$x,d$classes,type="C-svc",kernel="polydot",
            kpar=list(degree=2),C=10,prob.model=T)
plot(svp)

p=predict(svp,d$x, type="prob")[,1]

cut_off=0.5
caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))

cut_off=0.8
caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))

Tenga en cuenta que cuando cambiamos cut_off, la matriz de confusión (falso positivo, falso negativo, etc.) cambia

> caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))
Confusion Matrix and Statistics

          Reference
Prediction   1   2
         1 253  16
         2  38 193

               Accuracy : 0.892           
                 95% CI : (0.8614, 0.9178)
    No Information Rate : 0.582           
    P-Value [Acc > NIR] : < 2.2e-16       

                  Kappa : 0.7813          
 Mcnemar's Test P-Value : 0.004267        

            Sensitivity : 0.8694          
            Specificity : 0.9234          
         Pos Pred Value : 0.9405          
         Neg Pred Value : 0.8355          
             Prevalence : 0.5820          
         Detection Rate : 0.5060          
   Detection Prevalence : 0.5380          
      Balanced Accuracy : 0.8964          

       'Positive' Class : 1               


> cut_off=0.8

> caret::confusionMatrix(d$classes,ifelse(p<cut_off,2,1))
Confusion Matrix and Statistics

          Reference
Prediction   1   2
         1 223  46
         2  10 221

               Accuracy : 0.888          
                 95% CI : (0.857, 0.9143)
    No Information Rate : 0.534          
    P-Value [Acc > NIR] : < 2.2e-16      

                  Kappa : 0.7772         
 Mcnemar's Test P-Value : 2.91e-06       

            Sensitivity : 0.9571         
            Specificity : 0.8277         
         Pos Pred Value : 0.8290         
         Neg Pred Value : 0.9567         
             Prevalence : 0.4660         
         Detection Rate : 0.4460         
   Detection Prevalence : 0.5380         
      Balanced Accuracy : 0.8924         

       'Positive' Class : 1      
Haitao Du
fuente