[PYTHON] Forêts aléatoires à comprendre au point

introduction

J'ai résumé l'algorithme de la forêt aléatoire afin que vous puissiez le comprendre en points. Aucune formule n'est utilisée. La description est basée sur l'hypothèse que vous avez une compréhension de l'arbre de décision, donc si vous souhaitez en savoir plus sur l'algorithme de l'arbre de décision, veuillez vous référer à ici.

référence

Pour comprendre la forêt aléatoire, je me suis référé à ce qui suit. Bien qu'il soit en anglais, il est expliqué en détail d'une manière facile à comprendre, veuillez donc vous y référer si vous souhaitez en savoir plus sur Random Forest.

Comment fonctionne Random Forest

Caractéristiques de la forêt aléatoire

Random forest est simplement un algorithme qui crée de nombreux arbres de décision et prend un vote majoritaire. Il a les caractéristiques suivantes et est très excellent.

-Très bonne précision --A pour effet de supprimer le surapprentissage

Dans cet article, j'expliquerai les points de l'algorithme de forêt aléatoire, y compris pourquoi il présente de telles caractéristiques.

4 points de base de la forêt aléatoire

Il y a quatre points principaux dans l'algorithme de forêt aléatoire. Si vous connaissez ces quatre, vous pouvez dire que vous pouvez comprendre le contour de la forêt aléatoire.

Point ①-Boot cerclage

La forêt aléatoire est une collection d'arbres décisifs. Nous prenons beaucoup d'arbres de décision pour créer une forêt, mais il y a un point sur la façon de fabriquer chaque arbre. Tout d'abord, comment sélectionner les données d'entraînement lors de la création d'un arbre de décision. Dans la forêt aléatoire, lors de la création de chaque arbre de décision, ** autorisez la duplication et l'échantillonnage ** de toutes les données, et utilisez ces données comme données d'apprentissage lors de la création de l'arbre de décision. Cette technique est appelée ** bootstrapping **.

サンプル1.png

Bien entendu, les mêmes données peuvent être incluses dans les données d'apprentissage car l'échantillonnage est effectué avec la duplication autorisée.

Point ②-Affiner les variables à utiliser

Il est également important d'affiner les variables utilisées lors de la création de nœuds (points de branchement) dans chaque arbre de décision. S'il y a des variables $ p $ dans la quantité totale de données, au lieu de les utiliser toutes pour créer chaque nœud, les variables $ m $ sont sélectionnées et utilisées au hasard. En tant que nombre, un nombre d'environ $ m = \ sqrt {p} $ est souvent utilisé.

サンプル3.png

Nous allons créer un grand nombre d'arbres de décision en répétant le processus de "① → ②". Normalement, vous créerez 100 arbres ou plus. (La valeur par défaut de la forêt aléatoire de sklearn est 100) En répétant le processus de "① → ②", divers arbres sont créés et la variété rend la forêt aléatoire plus efficace.

Point ③-ensachage

** Dans une forêt aléatoire, le résultat final est le résultat d'un vote majoritaire par chaque arbre **. La méthode de sélection des données d'apprentissage à utiliser pour chaque appareil d'apprentissage par bootstrap, en utilisant l'appareil d'apprentissage pour la prédiction et enfin en l'assemblant s'appelle ** Bagging **, et une forêt aléatoire en fait partie. (L'ensachage signifie l'agrégation bootstrap)

L'ensachage lui-même a pour effet de réduire la dispersion et d'éviter le sur-ajustement, il est donc utilisé dans de nombreux endroits autres que les forêts aléatoires.

Vérification du point ④-OOB (hors sac)

Lorsque les données sont échantillonnées par la méthode d'amorçage, ** les données qui n'y sont pas sélectionnées ** sont toujours générées. Il reste environ 1/3 des données d'origine, et ces données sont appelées ** données OOB (hors sac) **.

サンプル2.png

Le fait que ces données OOB ** peuvent estimer la précision de données inconnues sans validation croisée ni données de test séparées est également un point important.

Classez les données OOB à l'aide de la forêt aléatoire créée et vérifiez l'erreur de classification de la classification (dans le cas de la régression, vérifiez l'index tel que l'erreur quadratique minimale). Dans le cas de la classification, le pourcentage de ces données OOB mal classées est appelé une erreur OOB (out-of-bag-error).

Nous visons à maximiser la précision en ajustant le nombre de variables utilisées (point ②) en fonction du taux de cette erreur ** OOB. ** **

Autres points de forêt aléatoire

Les éléments suivants sont également présentés comme des points de forêt aléatoire.

--Gestion des valeurs manquantes et ** matrice de proximité ** (Proximités)

Ce n'est souvent pas mentionné dans la description des forêts aléatoires (je ne le savais même pas au début), mais je pense que c'est un facteur important pour faire des forêts aléatoires un algorithme efficace.

Traitement des valeurs manquantes

Une caractéristique majeure de Random Forest est qu'il peut gérer les valeurs manquantes sans problème. Si les données d'entraînement ont des valeurs manquantes, les valeurs manquantes sont estimées dans les étapes suivantes.

(1) Pour le moment, utilisez la valeur moyenne d'autres données comme valeur estimée de la valeur manquante. ↓ ② Créez un modèle de forêt aléatoire ↓ ③ ** Réestimer les valeurs manquantes à l'aide de la matrice de proximité **

Matrice de proximité

La matrice de proximité est un peu déroutante, mais elle est créée comme suit. Après avoir créé la forêt aléatoire, appliquez toutes les données (y compris les données d'entraînement et les données OOB) à la forêt aléatoire. Dans chaque arbre de décision de la forêt aléatoire, la sortie du résultat de la classification (ou de la régression) est sortie, mais les données où les nœuds d'extrémité sont au même endroit sont définies à proximité +1. Ajoutez-les à la matrice du nombre de données x le nombre de données pour créer une matrice de proximité.

サンプル4.png

La proximité est calculée pour chaque arbre déterminé dans la forêt aléatoire, divisée par le nombre d'arbres créés en dernier et normalisée pour être la matrice de proximité utilisée pour estimer la valeur manquante.

サンプル5.png

Estimation des valeurs manquantes à l'aide de la matrice de proximité

Random Forest utilise cette matrice de proximité pour estimer les valeurs manquantes. Tout d'abord, créez une forêt aléatoire en utilisant des données remplies de valeurs manquantes en moyenne. La valeur manquante est à nouveau estimée à l'aide de la matrice de proximité qui y est obtenue.

サンプル6.png

La valeur manquante est à nouveau estimée en utilisant cette proximité comme poids.

サンプル7.png

Estimez plus précisément la valeur manquante en répétant ce qui précède.

Cette ** matrice de proximité peut être utilisée non seulement pour estimer les valeurs manquantes, mais aussi pour représenter les relations entre les données. ** (1-Proximity Matrix) peut être considérée comme une matrice qui exprime la distance entre les données, de sorte que vous pouvez exprimer la relation entre les données en les transformant en une carte thermique ou un tracé bidimensionnel. (Notez que la forêt aléatoire de la bibliothèque sklearn n'a pas de fonction pour générer la matrice de proximité.)

Exécutez une forêt aléatoire

Ci-dessous, nous allons essayer d'exécuter une forêt aléatoire en utilisant sklearn. Les paramètres détaillés ne seront pas expliqués, donc si vous êtes intéressé, veuillez consulter la Référence.

Forêt aléatoire avec sklearn

Créons une forêt aléatoire à l'aide du jeu de données iris. Séparez les données des données d'entraînement et des données de test, puis créez une forêt aléatoire à l'aide des données d'entraînement. Les données de test sont utilisées pour vérifier l'exactitude. La précision utilisant les données OOB est également sortie, et comme décrit dans les caractéristiques de la forêt aléatoire mentionnées ci-dessus, vérifiez si la précision est proche de celle des données inconnues.

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
iris = load_iris()
data = iris['data']
target = iris['target']

X_train, X_test ,Y_train, Y_test = train_test_split(data, target, test_size = 0.7, shuffle = True, random_state = 42)

rf = RandomForestClassifier(oob_score =True)

rf.fit(X_train, Y_train)

print('test_data_accuracy:' + str(rf.score(X_test, Y_test)))
print('oob_data_accuracy:' + str(rf.score(X_train, rf.oob_decision_function_.argmax(axis = 1))))

Le résultat de sortie est ici.

test_data_accuracy:0.9428571428571428
oob_data_accuracy:0.9555555555555556

La précision était plus élevée lorsque les données OOB étaient vérifiées, mais les données de test ne sont pas le résultat d'une vérification croisée, elles peuvent donc se situer dans la plage d'erreur. En outre, lorsque la quantité totale de données est faible, la fiabilité de la précision lors de la vérification avec des données OOB semble faible.

Next Ensuite, je voudrais publier un article résumant le boosting de gradient.

Recommended Posts

Forêts aléatoires à comprendre au point
Résumé de la génération de nombres aléatoires par Numpy