[PYTHON] [Apprentissage automatique] Comprendre les arbres de décision de scikit-learn et des mathématiques

1. Objet

Si vous voulez essayer l'apprentissage automatique, n'importe qui peut utiliser scicit-learn etc. pour l'implémenter relativement facilement. Cependant, afin d'obtenir des résultats au travail ou d'améliorer votre niveau ** Vous pouvez voir que l'explication "Je ne connais pas le contexte, mais j'ai obtenu ce résultat" est évidemment faible **.

Dans cet article, ** 2 à 3 visent «J'aime la théorie, je vais donc essayer d'utiliser scikit-learn en premier», et 4 et suivants visent «Comprendre le contexte des mathématiques» **.

2. Qu'est-ce qu'un arbre de décision?

Dans Wikipedia, il y a une description comme suit.

Les arbres de décision sont créés pour aider à prendre des décisions. L'arbre décisif est une forme particulière de structure en bois.

C'est un peu difficile à mettre en mots, mais en un mot, c'est un modèle qui subdivise le jugement d'une personne comme une structure arborescente et fait avancer le jugement.

C'est encore difficile à comprendre, alors donnons un exemple concret.


Exemple spécifique

En supposant que vous soyez un agent immobilier, vous souhaitez présélectionner des chambres faciles à choisir pour les jeunes femmes et des chambres qui ne le sont pas. Par conséquent, à partir des 13 dernières données, nous avons collecté des informations sur les chambres effectivement sélectionnées parmi les jeunes femmes, les chambres non sélectionnées et les chambres.

キャプチャ1.PNG
Certains étages Taille de la piècem^2 verrouillage automatique Si vous l'empruntez
Propriété 1 4 30 Oui
Propriété 2 5 45 Rien
Propriété 3 3 32 Oui
Propriété 4 1 20 Oui
Propriété 5 6 35 Oui
Propriété 6 3 40 Oui
Propriété 7 4 38 Oui
Propriété 8 1 20 Rien ×
Propriété 9 2 18 Rien ×
Propriété 10 1 20 Rien ×
Propriété 11 1 22 Rien ×
Propriété 12 1 24 Oui ×
Propriété 13 3 25 Rien ×

Cette fois, j'ai donné un exemple facile à comprendre, mais au moment de choisir une pièce, je pense que nous devrions penser comme suit.

キャプチャ2.PNG

La condition qui arrive en haut est différente pour chaque personne, mais par exemple, je déteste un peu le premier étage, réfléchissez d'abord à savoir s'il s'agit du deuxième étage ou plus, et si c'est le deuxième étage ou plus, ce serait bien d'avoir un verrouillage automatique Louer une chambre. Au contraire, même si elle n'est pas au 2ème étage ou au-dessus (la chambre au 1er étage), si la chambre est d'une certaine taille, vous pouvez la louer, ou si elle est au 1er étage et qu'elle est petite, ne la louez pas. Je pense que je vais y réfléchir.

** C'est exactement la structure de l'arbre, et c'est l'arbre de décision qui branche les conditions de cette manière pour prendre des décisions. ** **

Alors, comment la branche de cette condition est-elle déterminée? L'exemple que je viens de donner est une explication intuitive, et je pense qu'il n'avait aucun fondement.

Ce qui ressort ici est «l'impureté». Des détails seront donnés dans le dernier chapitre des mathématiques, mais l'arbre de décision décide de la branche de la condition en fonction de cette impureté. En bref, je souhaite diviser les données d'origine le plus proprement possible (dans cet exemple, une chambre louée ou non) L'indice de ce «propre» est «impureté».

Pour ceux qui ne sont pas sûrs, afin de classer clairement les variables objectives (empruntées / non empruntées cette fois), l'arbre de décision utilise l'indice d'impureté pour juger de la structure de l'arbre qui se ramifie joliment. Ce n'est pas grave si vous pensez que vous réussissez.

3. Arbre déterminé par scicit-learn

(1) Importation des bibliothèques requises

Importez les éléments suivants nécessaires pour créer un arbre de décision. (De plus, importez numpy etc.)

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier, export_graphviz
#Vous trouverez ci-dessous des outils pour visualiser les arbres de décision
import graphviz
import pydotplus
from IPython.display import Image
from sklearn.externals.six import StringIO

(2) Préparation des données

Définissez les informations telles que le nombre d'étages, la taille de la pièce, si elle est verrouillée automatiquement et si la salle a été louée ou non comme données comme indiqué ci-dessous (le contenu est le même que le tableau de données donné au début).

data = pd.DataFrame({
        "buy(y)":[True,True,True,True,True,True,True,False,False,False,False,False,False],
        "high":[4, 5, 3, 1, 6, 3, 4, 1, 2, 1, 1,1,3],
        "size":[30, 45, 32, 20, 35, 40, 38, 20, 18, 20, 22,24,25],
        "autolock":[1, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0,1,0]
    })

(3) Construction du modèle

(I) Mise en forme des données

Tout d'abord, nous allons organiser la forme des données pour construire le modèle.

y = data.loc[:,["buy(y)"]]
X = data.loc[:,["high", "size","autolock"]]

Puisqu'il ne s'agit pas d'un article sur la grammaire python, je vais omettre les détails, mais je vais organiser X et y sous une forme à déterminer avec scikit-learn.

(Ii) Construction du modèle

C'est finalement le code du bâtiment modèle.

clf = DecisionTreeClassifier()
clf = clf.fit(X, y)

Voilà pour un modèle simple. Nous allons créer un modèle d'arbre de décision pour une variable appelée clf! L'image est que le clf est ajusté (= appris) avec les X et y préparés dans la ligne suivante.

(3) Visualisation du modèle

◆ Code de visualisation

S'il s'agit d'un modèle simple, il se termine par (2), mais l'un des avantages de l'arbre de décision est la "haute lisibilité". En termes simples, "il est facile pour les personnes qui ne connaissent pas grand-chose à l'apprentissage automatique de comprendre pourquoi le modèle a produit ce résultat".

Visualisons le processus de jugement de la structure arborescente.


dot_data = StringIO() #emplacement de stockage des informations du fichier de points
export_graphviz(clf, out_file=dot_data,  
                     feature_names=["high", "size","autolock"],#Ici pour modifier
                     class_names=["False","True"],#Modifiez ici (Pourquoi Fase,J'évoquerai si c'est le vrai ordre plus tard
                     filled=True, rounded=True,  
                     special_characters=True) 
graph = pydotplus.graph_from_dot_data(dot_data.getvalue()) 
Image(graph.create_png())

Lorsque vous exécutez le code ci-dessus, vous verrez une figure comme celle ci-dessous. キャプチャ5.PNG

◆ Comment voir la branche

J'ai pu le visualiser ci-dessus! Il y a beaucoup d'articles et de sites qui se terminent par, mais je ne savais pas comment lire ce chiffre, et j'ai eu du mal au début, je vais donc ajouter un bref aperçu.

** (a) Boîte bleu clair en haut ** C'est le tout premier état. Le gini suivant montre l'état actuel. ―――――――――――――――――――――――――――――――――――――――――――― coefficient de gini: 0,497 échantillon (nombre de données): 13 value: Les données sont divisées en 6 et 7, et plus True est affiché en tant que classe. ―――――――――――――――――――――――――――――――――――――――――――― ** * À propos de l'ordre des valeurs ** Comme il y a peu de données cette fois, vous pouvez voir que 7 est Vrai, mais s'il y a beaucoup de données, même si le nombre est affiché comme valeur, vous devez savoir quelles données (Vrai est Faux dans ce cas). pense. Dans ce cas, écrivez comme suit.


clf = DecisionTreeClassifier()#C'est la même chose qu'avant
clf = clf.fit(X, y)#C'est la même chose qu'avant
print(clf.classes_)#Ajouter ici

Ensuite, dans ce cas, [False, True] s'affiche. En d'autres termes, vous pouvez voir que l'ordre des valeurs est False, True.

C'est la raison pour laquelle j'ai écrit class_names = ["False", "True"], # dans le code de visualisation ici (j'expliquerai pourquoi l'ordre est Fase, True plus tard) `` **. Puisque l'ordre est False, True dans DecisionTreeClassifier (), si vous ne créez pas class_names dans le même ordre, vous vous retrouverez avec le nom opposé lorsque vous le visualisez, alors soyez prudent. (J'ai trébuché un peu ici)

** (b) 2e ligne, encadré bleu à droite ** Il se réfère au cas où la taille (taille de la pièce) n'est pas inférieure à 27,5 $ m ^ 2 $ (= 27,5 $ m ^ 2 $ ou plus) à la première branche, auquel cas le coefficient gini est 0 et l'échantillon (nombre de données). 6 et True sont divisés en 6 morceaux.

Cela signifie que si une chambre est plus grande que 27,5 $ m ^ 2 $, vous pouvez toujours la louer! Puisque le coefficient Gini est 0, c'est-à-dire que l'impureté est 0, aucune autre ramification n'est possible, et c'est la fin.

Ci-dessous, vous pouvez voir les autres branches de la même manière.

C'est la fin de l'implémentation de l'arbre de décision avec scicit-learn et le flux de visualisation.

(4) Dans le monde réel ...

Cela n'a pas de sens de finir de faire un modèle. Dans le monde réel, il est nécessaire d'utiliser ce modèle de prédiction pour prédire si une nouvelle salle sera louée ou non lorsque des données seront obtenues dans le futur. Vous avez noté les données de deux nouvelles salles. Stockez-le dans une variable comme indiqué ci-dessous.

z = pd.DataFrame({
        "high":[2, 3],
        "size":[25, 18],
        "autolock":[1,0]
    })
z2 = z[["high", "size","autolock"]].values

Ce que je veux faire, c'est appliquer les données supplémentaires ci-dessus au modèle d'arbre de décision (clf) construit avec scicit-learn plus tôt et prédire si la salle est susceptible d'être louée.

y_est = clf.predict(z2)
y_est

Si vous faites cela, le résultat sera affiché comme "([False, False])". En d'autres termes, malheureusement, il semble probable que ces deux chambres ne puissent pas être louées, il est donc nécessaire d'adopter une stratégie de vente à des groupes cibles autres que les jeunes femmes.

Il y a beaucoup d'autres détails, mais je pense qu'il est bon d'essayer d'abord de mettre en œuvre un arbre de décision orthodoxe.

4. Comprendre l'arbre de décision à partir des mathématiques

En passant, jusqu'à 3, j'ai essayé d'implémenter le flux de construction d'un modèle d'arbre de décision en utilisant scicit-learn → visualisation → prédiction en utilisant de nouvelles données. Ici, je voudrais clarifier comment le modèle d'arbre de décision de ce flux est calculé mathématiquement.

Pour cela, il est nécessaire de parler d '«impureté» et de «quantité d'information» introduites dans la première moitié, et d' «entropie» et de «coefficient géni» comme indicateurs pour mesurer l'impureté.

(I) Impur

Dans la première moitié, l'arbre de décision a déclaré qu'il construirait un processus de jugement basé sur les impuretés. De façon un peu plus détaillée, l'impureté est ** "un indicateur de la variation des données" **.

Par exemple, en classification, si elle peut être complètement classée, la pureté sera de 0, et en régression, si la distribution des données dans un nœud est de 0, la pureté sera de 0.

Par conséquent, l'arbre de décision essaie de rendre cette impureté aussi petite que possible (proche de 0). Il existe des indices «entropie» et «coefficient géni» pour mesurer cette impureté. Pour entrer dans cette explication, nous couvrirons la quantité d'informations ci-dessous.

(Ii) Quantité d'informations

Ici, je voudrais supprimer grossièrement l'idée de la quantité d'informations. La quantité d'informations est ** "un indice qui quantifie le degré de surprise lorsque vous connaissez l'événement" **.

Par exemple, vous parliez à un ami et avez entendu: Qu'est-ce qui est le plus surprenant? キャプチャ3.PNG

Premièrement: il semble que tout ira bien à Okinawa demain. Deuxièmement: M. Hanyu du patinage artistique semble être aussi bon qu'un professionnel du rugby. (C'est juste une histoire fantastique)

Évidemment, la deuxième histoire est plus surprenante. Parce que, dans la deuxième histoire, j'ai eu des informations sur un événement peu probable. Dans ce cas, on peut dire que le second a plus d'informations.

Cette quantité d'informations est définie comme suit dans le monde de la théorie de l'information.

I(x) = -\log_{2} P(x)

Dans le cas précédent, par exemple, si la probabilité qu'Okinawa se dégage est de 0,8 et que la probabilité de Hanyu que le rugby soit aussi grand qu'un professionnel est de 0,01, la quantité d'informations peut être calculée comme suit.

Quantité d'informations sur l'événement lorsque Okinawa efface: $ - \ log_ {2} 0,8 = 0,322 $ Montant d'information de l'événement de Hanyu: $ - \ log_ {2} 0,01 = 6,644 $

La quantité d'informations sur les événements de Hanyu est extrêmement importante!

※référence※ Vous pouvez facilement calculer $ \ log $ avec Wolfram Alpha sur le site suivant. (Entrez "-log2 (0.8)" dans la barre qui apparaît ci-dessus et la valeur sera renvoyée.) https://www.wolframalpha.com/

Jusqu'à présent, nous avons expliqué la quantité d'informations. Avec ce contenu, passons à l'histoire de l'entropie.

(Iii) Entropie

◆ À propos de l'entropie

L'entropie est un indice qui fait la moyenne de la quantité d'informations en (i) et montre le degré de variation de la quantité d'informations.

La plupart ont une faible entropie lorsque le même événement est observé plusieurs fois. En revanche, si un événement différent se produit à chaque fois que vous observez, l'entropie est élevée.

Par exemple, le temps à Okinawa comme celui que j'ai mentionné plus tôt est toujours ensoleillé, donc l'entropie est faible. En revanche, le temps à Kanto n'est pas toujours ensoleillé, il est nuageux et pluvieux, on peut donc dire que l'entropie est excellente.

L'entropie est définie comme suit.

H = \sum_{i=1}P(x_i)I(x_i) = -\sum_{i=1}P(x_i)\log_{2}P(x_i)

Dans le cas précédent, par exemple, disons qu'Okinawa a une probabilité claire de 0,8, une probabilité nuageuse de 0,05 et une probabilité de pluie de 0,15. Et si la probabilité de dégager Kanto est de 0,6, la probabilité de nébulosité est de 0,2 et la probabilité de pluie est de 0,2, chaque entropie peut être calculée comme suit.

Entropie météo d'Okinawa: 0.884

Entropie météo de Kanto: 0,953

Étant donné que l'entropie de la météo à Kanto est plus grande, vous pouvez voir que la quantité d'informations varie.

◆ À propos de la relation entre l'entropie et la pureté

L'arbre de décision a déclaré qu'il essaie de réduire la pureté autant que possible. Quant à la relation entre l'entropie et la pureté, ** la plus faible pureté signifie 0 entropie, et plus la pureté est élevée, plus l'entropie est élevée **.

L'impureté a montré le degré de variation des données, et l'entropie a également montré le degré de variation dans la quantité d'informations, de sorte qu'il peut être facile à comprendre intuitivement.

◆ À propos de l'arbre de décision et de l'entropie

Alors, comment l'entropie est-elle spécifiquement calculée et le modèle construit dans l'arbre de décision?

Il ** calcule la différence entre l'entropie avant branchement et l'entropie après branchement, recherche la condition de branchement qui maximise la différence et construit le modèle **.

Ce serait long à écrire avec des mots, mais le fait est que pour faire de l'arbre de décision un bon modèle, nous voulons minimiser l'impureté des données, c'est-à-dire réduire l'entropie.

Pour cela, il est nécessaire de rechercher une condition de branchement dans laquelle l'entropie après la branche suivante est plus petite que celle de la branche précédente, c'est-à-dire que la différence entre l'entropie avant la branche et l'entropie après la branche est aussi grande que possible. Ce sera.

(Iv) Coefficient de Gini

◆ À propos du coefficient de Gini

En plus de l'entropie, il existe un coefficient de Gini comme indice pour mesurer les impuretés. Le coefficient de Gini est un indice qui fait la moyenne de la probabilité d'erreur de classification **.

De manière un peu plus détaillée, si la probabilité que la classe $ x_i $ soit sélectionnée au niveau d'un nœud $ t $ est $ P (X_i \ mid t) $, le coefficient de Gini est défini comme la valeur attendue de la probabilité d'erreur de classification au niveau d'un nœud. .. En d'autres termes, il s'agit d'un indicateur de la probabilité de mal classer **.

Le coefficient de Gini est défini comme suit.

G(t) = \sum_{i=1}^{K}P(x_i \mid t)\left(1-P(x_i \mid t)\right) = 1-\sum_{i=1}^{K}P(x_i \mid t)^2

◆ À propos de la relation entre le coefficient de Gini et l'impureté

L'arbre de décision a déclaré qu'il essaie de réduire la pureté autant que possible. Quant à la relation entre le coefficient de Gini et la pureté, ** la pureté la plus faible a une entropie 0, et plus la pureté est élevée, plus l'entropie (maximum 1) **.

◆ À propos de l'arbre de décision et du coefficient de Gini

Cette plage est omise car l'idée est la même que celle ci-dessus "◆ À propos de l'arbre de décision et de l'entropie". Construisez une branche conditionnelle de sorte que la différence entre le coefficient de Gini avant branchement et le coefficient de Gini après branchement soit aussi grande que possible.

(V) Résumé

Comme décrit ci-dessus, l'arbre de décision est un modèle qui construit un processus de jugement tel que la structure d'un arbre, et le critère de jugement était de minimiser "l'impureté" qui représente la variation des données.

Les indices pour mesurer l'impureté sont «l'entropie indiquant le degré de variation des événements» et le «coefficient géni indiquant le degré de classification erronée susceptible de se produire», et dans les deux cas, la différence entre avant et après la ramification est la plus grande. C'était dans les coulisses que l'arbre de décision établissait de telles conditions de ramification.

Nous avons également examiné des formules spécifiques pour les coefficients d'entropie et de Gini.

clf = DecisionTreeClassifier(criterion="gini")
clf = clf.fit(X, y)

5. Conclusion

Comment était-ce? Ma pensée est: "Je ne peux pas interpréter même si on me montre un code très compliqué depuis le début, donc je ne me soucie pas de la précision une fois, donc je vais essayer d'implémenter une série de flux de base avec scicit-learn, etc." Je pense que c'est très important.

Cependant, une fois que je m'y suis habitué, je pense qu'il est très important de comprendre comment ils fonctionnent dans les coulisses à partir d'un fond mathématique.

Je pense que de nombreux contenus sont difficiles à comprendre, mais j'espère que cela aidera à approfondir ma compréhension.

Recommended Posts

[Apprentissage automatique] Comprendre les arbres de décision de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la SVM à la fois à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la régression logistique à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la régression linéaire simple à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la régression multiple linéaire à partir de scikit-learn et des mathématiques
[Apprentissage automatique] Comprendre la décorrélation des mathématiques
[Apprentissage automatique] Étudions l'arbre de décision
[Apprentissage automatique] Prédiction FX à l'aide de l'arbre de décision
Vue d'ensemble des techniques d'apprentissage automatique apprises grâce à scikit-learn
Apprentissage automatique facile avec scikit-learn et flask ✕ Application Web
L'apprentissage automatique pratique avec Scikit-Learn et TensorFlow-TensorFlow a abandonné -
Créez un environnement d'apprentissage automatique scikit-learn avec VirtualBox et Ubuntu
[Apprentissage automatique] Comprendre la forêt aléatoire
Apprentissage automatique et optimisation mathématique
Machine Learning: Supervisé - Arbre de décision
[Apprentissage automatique] Comprenez à partir des mathématiques que la normalisation se traduit par une moyenne de 0 et un écart type de 1.
[Apprentissage automatique] Comprenez à partir des mathématiques pourquoi le coefficient de corrélation varie de -1 à 1.
Prédire l'avenir avec l'apprentissage automatique - Prédire les cours futurs des actions avec l'arbre de décision de scikit-learn
[Note de lecture] Apprentissage automatique pratique avec Scikit-Learn, Keras et TensorFlow Chapitre 1
Importance de l'apprentissage automatique et de l'apprentissage par mini-lots
Apprentissage automatique ③ Résumé de l'arbre de décision
Classification et régression dans l'apprentissage automatique
SVM essayant l'apprentissage automatique avec scikit-learn
Organisez des plateformes d'apprentissage automatique et d'apprentissage en profondeur
[Apprentissage automatique] OOB (Out-Of-Bag) et son ratio
scikit-learn Comment utiliser le résumé (apprentissage automatique)
Prévision du cours des actions à l'aide de l'apprentissage automatique (scikit-learn)
[Apprentissage automatique] Classification des sujets LDA à l'aide de scikit-learn
Utiliser le groupe d'API d'apprentissage automatique A3RT de Python
Notes personnelles et liens sur l'apprentissage automatique ① (Machine learning)
Résumé de la classification et de la mise en œuvre des algorithmes d'apprentissage automatique
Créer un environnement pour Python et l'apprentissage automatique (macOS)
"Tutoriels OpenCV-Python" et "Système d'apprentissage automatique pratique"
Visualisez l'arbre de décision scikit-learn avec Treemap de Plotly