Probabilidades confusas del predict_proba de svm de scikit-learn

Mi propósito es dibujar la curva PR por la probabilidad ordenada de cada muestra para una clase específica. Sin embargo, encontré que las probabilidades obtenidas por predict_proba () de svm tienen dos comportamientos diferentes cuando uso dos conjuntos de datos estándar diferentes: el iris y los dígitos.

El primer caso se evalúa con el caso del “iris” con el código de python a continuación, y funciona razonablemente que la clase tiene la mayor probabilidad.

D = datasets.load_iris() clf = SVC(kernel=chi2_kernel, probability=True).fit(D.data, D.target) output_predict = clf.predict(D.data) output_proba = clf.predict_proba(D.data) output_decision_function = clf.decision_function(D.data) output_my = proba_to_class(output_proba, clf.classes_) print D.data.shape, D.target.shape print "target:", D.target[:2] print "class:", clf.classes_ print "output_predict:", output_predict[:2] print "output_proba:", output_proba[:2] 

A continuación, produce las salidas como a continuación. Aparentemente, la probabilidad más alta de cada muestra coincide con las salidas de la predicción (): el 0.97181088 para la muestra # 1 y 0.96961523 para la muestra # 2.

 (150, 4) (150,) target: [0 0] class: [0 1 2] output_predict: [0 0] output_proba: [[ 0.97181088 0.01558693 0.01260218] [ 0.96961523 0.01702481 0.01335995]] 

Sin embargo, cuando cambio el conjunto de datos a “dígitos” con el siguiente código, las probabilidades revelan un fenómeno inverso, que la probabilidad más baja de cada muestra domina las tags de salida de predict () con una probabilidad de 0.00190932 para la muestra # 1 y 0.00220549 para la muestra # 2.

 D = datasets.load_digits() 

Salidas:

 (1797, 64) (1797,) target: [0 1] class: [0 1 2 3 4 5 6 7 8 9] output_predict: [0 1] output_proba: [[ 0.00190932 0.11212957 0.1092459 0.11262532 0.11150733 0.11208733 0.11156622 0.11043403 0.10747514 0.11101985] [ 0.10991574 0.00220549 0.10944998 0.11288081 0.11178518 0.11234661 0.11182221 0.11065663 0.10770783 0.11122952]] 

He leído esta publicación y lidera una solución para usar SVM lineal con decision_function (). Sin embargo, debido a mi tarea, todavía tengo que concentrarme en el núcleo chi-cuadrado para SVM.

¿Alguna solución?

Como se indica en la documentación , no hay garantía de que predict_proba y predict proporcionen resultados consistentes en SVC. Simplemente puedes usar decision_function . Esto es cierto tanto para el SVM lineal como para el kernel.