Créer un «score de certitude» à partir des votes dans des forêts aléatoires?

36

Je cherche à former un classificateur qui établira une distinction entre les objets Type Aet ceux Type Bdont le nombre d’apprentissage est relativement important, soit environ 10 000 objets, dont la moitié environ Type Aet la moitié Type B. Le jeu de données comprend 100 entités continues détaillant les propriétés physiques des cellules (taille, rayon moyen, etc.). La visualisation des données dans des diagrammes de dispersion par paires et des diagrammes de densité nous indique qu'il existe un chevauchement important dans la distribution des cellules cancéreuses et normales dans de nombreuses caractéristiques.

J'explore actuellement les forêts aléatoires en tant que méthode de classification pour cet ensemble de données et j'ai obtenu de bons résultats. En utilisant R, les forêts aléatoires permettent de classer correctement environ 90% des objets.

Une des choses que nous voulons essayer de faire est de créer une sorte de "score de certitude" qui permettra de quantifier notre confiance en la classification des objets. Nous savons que notre classificateur ne sera jamais précis à 100%, et même si les prévisions sont très précises, nous voudrons des techniciens qualifiés pour identifier les objets véritablement Type Aet réellement Type B. Ainsi, au lieu de fournir des prédictions sans compromis d' Type Aou Type B, nous voulons présenter un score pour chaque objet qui décrira comment Aou Bun objet est. Par exemple, si nous concevons un score compris entre 0 et 10, un score de 0 peut indiquer qu'un objet est très similaire aux Type Aobjets, tandis qu'un score de 10 indique qu'un objet est très similaire Type B.

Je pensais que je pourrais utiliser les votes au sein des forêts aléatoires pour élaborer un tel score. Étant donné que la classification dans les forêts aléatoires est effectuée à la majorité des voix dans la forêt d’arbres générés, je suppose que les objets votés par 100% des arbres Type Adiffèrent des objets votés par, par exemple, 51% des arbres. être Type A.

Actuellement, j'ai essayé de définir un seuil arbitraire pour la proportion de votes qu'un objet doit recevoir pour être classé comme Type Aou Type B, et si le seuil n'est pas dépassé, il sera classé comme Uncertain. Par exemple, si je force la condition que 80% ou plus des arbres doivent être d'accord sur une décision pour qu'une classification soit validée, je trouve que 99% des prédictions de la classe sont correctes, mais qu'environ 40% des objets sont classés comme Uncertain.

Serait-il alors logique de tirer parti des informations de vote pour évaluer la certitude des prévisions? Ou suis-je dans la mauvaise direction avec mes pensées?

ialm
la source
Assurez-vous de disposer de jeux de données de formation et de test distincts. Veillez à utiliser le moins possible le moins possible votre matériel de test (idéalement une seule fois).
Boris Gorelik
@bgbg J'utilise un schéma de formation / validation / test dans une répartition 70/20/10. J'entraîne un modèle avec 70% des données et j'ajuste les paramètres en fonction des résultats obtenus avec l'ensemble de validation de 20%. Après avoir réglé les paramètres sur ces deux ensembles, j’évalue le modèle sur l’ensemble de test à 10%. Bien que Breiman affirme que le taux d'erreur OOB intégré rend la création d'un ensemble de test séparé redondant, je me méfie de sa demande.
ialm

Réponses:

19

Cela est parfaitement logique, et toutes les implémentations de forêts aléatoires avec lesquelles j'ai travaillé (telles que celle de MATLAB) fournissent également des sorties probabilistes.

Je n'ai pas travaillé avec la mise en œuvre de R, mais je serais choqué par l'absence d'un moyen simple d'obtenir des résultats indirects à partir des votes ainsi que d'une décision difficile à prendre.

Edit: Il suffit de jeter un coup d’œil sur R et predictif.randomForest affiche également les probabilités.

Benhamner
la source
1
Merci pour votre réponse. Vous avez raison, j'ai créé un script indiquant la proportion de votes reçus par chaque objet. Je me demande cependant à quel point ces votes seront utiles. Y a-t-il des étapes suivantes que vous recommandez? Devrais-je regarder la variabilité des proportions de vote à travers des séries supplémentaires de RF? Je comprends que RF a un élément stochastique. Existe-t-il des diagnostics que je devrais examiner?
ialm
3
@ Jonathan Vous pouvez essayer de regarder un graphique comportant la fraction d'objets réels d'une classe en fonction d'une fraction de votes pour cette classe dans la forêt. Je travaillais sur un problème qui nécessitait un score de confiance et il s’est avéré que j’ai réussi à obtenir une très belle courbe logistique.
@mbq Désolé, pouvez-vous préciser ce que vous entendez par là? Votre suggestion m'intéresse et j'y donnerai suite demain!
ialm
1
En outre, la variabilité dans une RF se situe au stade de la formation, de sorte que l'exécution d'échantillons de test à plusieurs reprises dans la RF ne changera pas les résultats. Je regarderais l'ASC par rapport au nombre d'arbres dans RF, pour m'assurer que vous en avez assez, puis optimisez le paramètre minimum de feuille en fonction de l'ASC.
Benhamner
2
@ Jonathan, je pense que mbq fait référence à quelque chose qui s'appelle calibration (bien qu'il puisse y avoir d'autres noms). Voir, par exemple, ces questions: Calibrage d'un classificateur boosté multi-classes , à quoi font référence les «valeurs réelles» dans une classification supervisée?
steffen
17

Si vous utilisez R, le pack caret vous évitera de réinventer la roue. Par exemple, le code suivant utilise la validation croisée pour choisir les paramètres de réglage d'un modèle de forêt aléatoire, puis génère la moyenne et l'écart type de précision pour chaque pli de validation croisée. Enfin, il calcule les probabilités de classe pour le modèle.

library(caret)
library(PerformanceAnalytics)
data(iris)

#Make a yes/no dataset
Dataset <- iris
Dataset$Class <- ifelse(Dataset$Species=='versicolor','Yes','No')
Dataset$Class  <- as.factor(Dataset$Class)
Dataset$Species<- NULL
chart.Correlation(Dataset[-5], col= Dataset$Class)

#Fit an RF model
model <- train(Class~.,Dataset,
                method='rf',TuneLength=3,
                trControl=trainControl(
                    method='cv',number=10,
                    classProbs = TRUE))
model$results

#Predict class probabilities (i.e. 'certainty' scores)
pred <- predict(model,iris,"prob")
head(pred)

Le point positif de caret est qu’il est très facile de comparer différents modèles prédictifs. Par exemple, si vous voulez essayer un SVM, vous pouvez remplacer le texte method='rf'avec method='svmLinear'ou method='svmRadial'. Vous pouvez également choisir vos paramètres de réglage en fonction de l' ASC plutôt que la précision en ajoutant une ligne au paramètre trainControl: summaryFunction=twoClassSummary.

Enfin, le package PerformanceAnalytics contient un peu de code chart.Correlation(Dataset[-5], col= Dataset$Class), qui n'est pas nécessaire pour construire le modèle, mais fournit une belle visualisation de votre jeu de données.

Zach
la source
Tu me rends fan du paquet caret. Je pense que je garderai un deuxième fil R ouvert juste pour essayer différentes méthodes de classification et laisser Caret faire le réglage de CV et de paramètres lui-même et voir si j'obtiens des résultats comparables.
ialm
@ Jonathan heureux de l'entendre! C'est un merveilleux forfait. Essayez la modelLookup()commande pour obtenir une liste de ce qui est possible.
Zach
Le probtype de predictest également disponible en utilisant randomForestpour former votre modèle (avec ou sans l'utilisation d'autres packages tels que caretou PerformanceAnalytics).
Hack-R
2

Le package randomForest dans R est un package plutôt convenable pour entrer dans les détails de votre analyse. Il vous fournit les votes (sous forme de fraction ou de nombre brut) et offre une capacité intégrée pour le réglage et la validation croisée. Il peut même vous donner plus d'informations sur vos fonctionnalités (si vous voulez savoir lesquelles de vos 100 le plus important en analyse).

Si vous utilisez déjà ce paquet, alors vous voulez peut-être le regarder de plus près et si vous ne l'utilisez pas, alors peut-être le vérifier.

utilisateur4673
la source