web-dev-qa-db-fra.com

Comment fonctionne la fonction pred_proba () de sklearn.svm.svc en interne?

J'utilise sklearn.svm.svc de scikit-learn pour faire une classification binaire. J'utilise sa fonction Predict_Proba () pour obtenir des estimations de probabilité. Quelqu'un peut-il me dire comment predict_proba () calcule en interne la probabilité?

38
user2115183

Scikit-learn utilise LibSVM en interne, et cela à son tour utilise mise à l'échelle Platt , comme détaillé dans cette note des auteurs de LibSVM , pour calibrer le SVM pour produire des probabilités en plus de la classe prévisions.

La mise à l'échelle de Platt nécessite d'abord de former le SVM comme d'habitude, puis d'optimiser les vecteurs de paramètres [~ # ~] a [~ # ~] et [~ # ~] b [~ # ~] tel que

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

f(X) est la distance signée d'un échantillon de l'hyperplan (méthode decision_function de scikit-learn). Vous pouvez reconnaître le sigmoïde logistique dans cette définition, la même fonction que la régression logistique et les réseaux neuronaux utilisent pour transformer les fonctions de décision en estimations de probabilité.

Attention: le paramètre B, le "intercept" ou le "biais" ou tout ce que vous voulez appeler, peut rendre les prédictions basées sur les estimations de probabilité de ce modèle incompatibles avec celles que vous obtenez de la décision SVM fonction f. Par exemple. supposons que f(X) = 10, alors la prédiction pour X est positive; mais si B = -9.9 et A = 1, alors P(y|X) = .475. Je tire ces chiffres de nulle part, mais vous avez remarqué que cela peut se produire dans la pratique.

En effet, la mise à l'échelle de Platt entraîne un modèle de probabilité au-dessus des sorties du SVM sous une fonction de perte d'entropie croisée. Pour éviter que ce modèle ne soit trop adapté, il utilise une validation croisée interne en cinq, ce qui signifie que la formation des SVM avec probability=True Peut être beaucoup plus coûteuse qu'un SVM non probabiliste à la vanille.

67
Fred Foo

En fait, j'ai trouvé une réponse légèrement différente selon laquelle ils ont utilisé ce code pour convertir la valeur de décision en probabilité

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

Ici, les valeurs A et B peuvent être trouvées dans le fichier modèle (probA et probB). Il offre un moyen de convertir la probabilité en valeur de décision et donc en perte de charnière.

Utilisez ce ln (0) = -200.

0
user1165814