La conversion de LinearSVC de la fonction de décision de probabilités (Scikit apprendre python )
- Je utiliser les SVM linéaire de scikit learn (LinearSVC) pour le problème de classification binaire. Je comprends que LinearSVC peut me donner le prédit de les étiquettes, et la décision scores, mais je voulais estimations de probabilité (la confiance dans l'étiquette). Je veux continuer à utiliser LinearSVC à cause de la vitesse (par rapport à sklearn.svm.SVC linéaire, noyau) Est-il raisonnable d'utiliser la fonction logistique pour convertir la décision scores de probabilités?
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)
Je veux vérifier si elle fait sens pour obtenir des estimations de Probabilité simplement comme [1 /(1 + exp(-x)) ] où x est la décision score.
Sinon, existe-il d'autres options wrt classificateurs que je peux utiliser pour le faire efficacement?
Grâce.
Vous devez vous connecter pour publier un commentaire.
J'ai pris un coup d'oeil à l'api dans sklearn.svm.* de la famille. Tous les modèles ci-dessous, par exemple,
commune interface qui fournit un
paramètre du modèle. Si ce paramètre est défini sur True, libsvm permettra de former une probabilité de transformation de modèle sur le dessus de la SVM sorties basé sur l'idée de Platt Mise À L'Échelle. La forme de la transformation est similaire à la fonction logistique comme vous l'avez souligné, cependant, deux des constantes
A
etB
sont appris dans un post-traitement de l'étape. Voir aussi cette stackoverflow post pour plus de détails.En fait, je ne sais pas pourquoi ce post-traitement n'est pas disponible pour LinearSVC. Sinon, vous devez simplement appeler
predict_proba(X)
pour obtenir la probabilité d'estimation.Bien sûr, si vous venez de demander un naïf logistique transformer, il ne sera pas effectuer ainsi que d'une approche calibrée comme Platt Mise À L'Échelle. Si vous pouvez comprendre le souligner algorithme de platt mise à l'échelle, probablement, vous pouvez écrire votre propre ou de contribuer à la scikit-learn svm de la famille. 🙂 Aussi n'hésitez pas à utiliser les quatre SVM variations de soutien
predict_proba
.LinearSVC
, et aussi parce queLogisticRegression
est déjà disponible (bien que linéaire SVM + Platt mise à l'échelle peut avoir des avantages sur droite LR, je n'ai jamais essayé). Le Platt mise à l'échelle dansSVC
vient de LibSVM.SVC(kernel='linear', **kwargs)
etCalibratedClassifier(LinearSVC(**kwargs))
, mais j'ai obtenu des résultats différents...scikit-learn offre CalibratedClassifierCV qui peut être utilisé pour résoudre ce problème: il vous permet d'ajouter de la probabilité de sortie de LinearSVC ou de tout autre classificateur qui implémente decision_function méthode:
Guide de l'utilisateur a une belle section sur que. Par défaut CalibratedClassifierCV+LinearSVC obtiendrez vous Platt mise à l'échelle, mais il offre également d'autres options (isotonique méthode de régression), et il n'est pas limité à SVM classificateurs.
base_estimator__C
maisGridSearchCV
ne pas avaler ça.base_estimator__C
semble correct. Je suggère de fournir un exemple complet et l'ouverture d'une nouvelle question.Si vous voulez de la vitesse, puis il suffit de remplacer les SVM avec
sklearn.linear_model.LogisticRegression
. Qui utilise exactement le même algorithme de formation commeLinearSVC
, mais avec le journal de la perte de la place de la charnière de la perte.À l'aide de [1 /(1 + exp(-x))] produit des probabilités, dans un sens formel (les numéros entre zéro et un), mais ils n'adhère pas à tout justifiable modèle de probabilité.
Si ce que votre voulez vraiment est une mesure de la confiance plutôt que les probabilités, vous pouvez utiliser la méthode
LinearSVC.decision_function()
. Voir la la documentation.