Comment faire en sorte que les arbres de la forêt aléatoire votent en décimales mais pas en binaire

9

Ma question concerne la classification binaire, disons séparer les bons clients des mauvais clients, mais pas la régression ou la classification non binaire. Dans ce contexte, une forêt aléatoire est un ensemble d'arbres de classification. Pour chaque observation, chaque arbre vote «oui» ou «non», et le vote moyen de tous les arbres est la probabilité finale pour la forêt.

Ma question concerne la modification du comportement des arbres sous-jacents: comment pouvons-nous modifier la fonction randomForest (du package randomForest de R) afin que chaque arbre vote une décimale au lieu d'un binaire oui / non. Pour mieux comprendre ce que je veux dire par décimale, réfléchissons au fonctionnement des arbres de décision.

Un arbre de décision entièrement développé a 1 bonne ou 1 mauvaise instance dans ses nœuds terminaux. Supposons que je limite la taille du nœud terminal à 100. Ensuite, les nœuds terminaux vont ressembler à:

Node1 = 80 mauvais, 20 bons
Node2 = 51 mauvais, 49 bons
Node3 = 10 mauvais, 90 bons

Remarquez, même si Node1 et Node2 votent «mauvais», leur «force de méchanceté» est très différente. C'est ce que je recherche. Au lieu de les faire produire 1 ou 0 (ce qui est le comportement par défaut), peut-on modifier le package R pour qu'ils votent 80/100, 51/100, 10/100, etc.?

FatihAkici
la source
Je voulais juste inclure le lien suivant vers une discussion connexe: stackoverflow.com/questions/22409019/…
FatihAkici
Vous voulez dire que vous voulez les probabilités prédites réelles , pas seulement la classe prédite la plus probable.
smci
Oui @smci exactement.
FatihAkici

Réponses:

10

C'est un point subtil qui varie d'un logiciel à l'autre. Il existe deux méthodes principales que je connais:

  1. Feuilles binaires - Chaque feuille vote à la majorité. Voici comment randomForestfonctionne R, même en utilisantpredict(..., type="prob")
  2. Feuilles de proportion - Chaque feuille renvoie la proportion des échantillons d'apprentissage appartenant à chaque classe. Voilà comment ça sklearn.ensemble.RandomForestClassifier.predict_probamarche. Dans une autre réponse, @ usεr11852 souligne que le rangerpackage de R fournit également cette fonctionnalité. Heureusement, je peux attester que mon utilisation limitée rangerest aussi beaucoup, beaucoup plus rapide que randomForest.

Je ne pense pas qu'il existe un moyen facilerandomForest d'utiliser la méthode des feuilles proportionnelles, car le logiciel R est en fait juste un crochet dans un programme C & FORTRAN. Sauf si vous aimez modifier le code de quelqu'un d'autre, vous devrez soit écrire le vôtre, soit trouver une autre implémentation logicielle.

Sycorax dit de réintégrer Monica
la source
Merci beaucoup, Sycorax. Pensez-vous que le code source des R randomForest peut être modifié pour accompagner cela?
FatihAkici
Avec suffisamment de ressources, tout logiciel peut être modifié pour faire n'importe quoi. D'un autre côté, randomForestc'est juste une interface R dans le code FORTRAN, donc cela peut prendre des ressources considérables à accomplir.
Sycorax dit Réintégrer Monica le
@FatihAkici En fait, on dirait que je me suis trompé. Le code compilé est un port C du code FORTRAN original de Breiman.
Sycorax dit Réintégrer Monica le
5
J'ai travaillé sur le package randomForest pendant un été 2015 dans le cadre d'une REU. Il est certainement possible de modifier le code pour ce faire, mais c'est un peu délicat car il s'agit en fait de C-Fortran mixte. La plupart du code "externe" est C, tandis que quelques fonctions de base restent dans Fortran et sont liées après la compilation. Malheureusement, cela fait trop longtemps que je n'ai pas vu le code pour savoir où chercher. mais je suggère d'être prêt à travailler à la fois en C et en Fortran si vous souhaitez modifier le package.
chipbuster le
2

Utilisez simplement predict.randomForest(..., type="prob"). Vous faites une bonne chose .

Stephan Kolassa
la source
2
Stephan, merci pour votre réponse, mais ce n'est pas ce que je recherche. Le code que vous avez mentionné prend la moyenne des votes d'arbre binaire sous-jacent, mais j'essaie d'avoir les arbres sous-jacents de vote décimal. Donc dans une forêt de 3 arbres, je ne veux pas (1 + 1 + 0) / 3, plutôt (.80 + .51 + .10) / 3. Cela a-t-il du sens?
FatihAkici
2
Cela a du sens, et c'est le comportement du classificateur de forêt aléatoire dans sklearn: scikit-learn.org/stable/modules/generated/…
psarka
1
Ah, je vois votre point. Désolé, alors j'ai mal compris. A en juger par la page d'aide et en regardant predict.allles norm.votesparamètres et, cela ne semble pas être possible. Si vous le voulez vraiment, vous devrez probablement coder votre propre forêt aléatoire. Je suis d'accord avec @psarka que cela est parfaitement logique. (Je supprimerais cette réponse, mais nous perdrions cette discussion dans les commentaires.)
Stephan Kolassa
Ce fut en effet une discussion très fructueuse, chers Stephan et @psarka. Je vous remercie!
FatihAkici