sklearn scikit poly learn forest python scikit-learn svm libsvm

python - scikit - sklearn



Probabilidades confusas del predict_proba del svm de scikit-learn (1)

Tal como lo establece la documentación , no hay garantía de que predict_proba y predict den resultados consistentes en SVC. Simplemente puede usar decision_function . Eso es cierto tanto para SVM lineal como kernel.

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 svm''s predic_proba () tienen dos comportamientos diferentes cuando utilizo dos conjuntos de datos estándar diferentes: el iris y los dígitos.

El primer caso se evalúa con el caso "iris" con el código python a continuación, y funciona razonablemente que la clase obtenga 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 del predict (): 0.97181088 para la muestra n. ° 1 y 0.96961523 para la muestra n. ° 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 etiquetas de salida del predict () con una probabilidad de 0.00190932 para la muestra n.º 1 y 0.00220549 para la muestra # 2.

D = datasets.load_digits()

Productos:

(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 ofrece una solución para usar SVM lineal con decision_function (). Sin embargo, debido a mi tarea, todavía tengo que centrarme en el kernel chi-cuadrado para SVM.

Alguna solución?