Arbres de décision en pleine croissance

Comme tous les modèles de machine learning supervisé, les arbres de décision un ensemble d'exemples d'entraînement. L'entraînement optimal d'un arbre de décision un problème NP-difficile. Par conséquent, l'entraînement est généralement effectué à l'aide d'une méthode heuristique, un algorithme d'apprentissage facile à créer qui donne une réponse non optimale, mais proche de optimal, l'arbre de décision.

La plupart des algorithmes utilisés pour entraîner les arbres de décision fonctionnent avec une division gloutonne et stratégie de vaincre. L'algorithme commence par créer un nœud unique (la racine) et et pousse l'arbre de décision de manière récursive.

Au niveau de chaque nœud, toutes les conditions possibles sont évaluées et notées. La l'algorithme sélectionne le "meilleur" la condition, c'est-à-dire celle dont le score. Pour l'instant, sachez simplement que le score est une métrique en corrélation avec le une tâche et des conditions sont sélectionnées pour maximiser cette métrique.

Par exemple, dans le Palmer Manchots (utilisé pour les exemples de code plus loin dans ce cours), la plupart des modèles Adelie et Chinstrap les manchots ont un bec supérieur à 16 mm, alors que la plupart des Gentoo les manchots ont un bec plus petit. Par conséquent, la condition bill_length_mm ≥ 16 permet d'obtenir des prédictions presque parfaites pour le Les manchots papou, mais qui ne peuvent pas différencier entre Adelies et Chinstraps. L'algorithme choisira probablement cette condition.

Une condition menant à deux feuilles. La condition est 'bill_length_mm >= 16'.
Si c'est le cas, il s'agit de la feuille "Adelie" ou "Chinstrap".  Si ce n’est pas le cas, la feuille
est « Gentoo ».

<ph type="x-smartling-placeholder"></ph> Figure 7. La première étape pour faire pousser un arbre.

 

L'algorithme se répète ensuite de manière récursive et indépendante sur les deux nœuds enfants. Lorsqu'aucune condition satisfaisante n'est trouvée, le nœud devient une feuille. La feuille la prédiction est déterminée comme étant la valeur d'étiquette la plus représentative dans les exemples.

L'algorithme est le suivant:

def train_decision_tree(training_examples):
  root = create_root() # Create a decision tree with a single empty root.
  grow_tree(root, training_examples) # Grow the root node.
  return root

def grow_tree(node, examples):
  condition = find_best_condition(examples) # Find the best condition.

  if condition is None:
    # No satisfying conditions were found, therefore the grow of the branch stops.
    set_leaf_prediction(node, examples)
    return

  # Create two childrens for the node.
  positive_child, negative_child = split_node(node, condition)

  # List the training examples used by each children.
  negative_examples = [example for example in examples if not condition(example)]
  positive_examples = [example for example in examples if condition(example)]

  # Continue the growth of the children.
  grow_tree(negative_child, negative_examples)
  grow_tree(positive_child, positive_examples)

Passons en revue les étapes d'entraînement d'un arbre de décision particulier dans plus en détail.

Étape 1:Créez une racine:

Nœud avec un point d&#39;interrogation.

Étape 2:Développer le nœud 1. Condition "x1 ≥ 1" a été trouvé. Deux nœuds enfants sont créés:

Un nœud racine
   conduisant à deux nœuds non définis.

Étape 3:Développer le nœud 2. Aucune condition satisfaisante n'a été trouvée. Ainsi, le nœud dans une feuille:

Une racine
   qui mène à deux nœuds non définis.

Étape 4:Développer le nœud 3. Condition "x2 ≥ 0,5" a été trouvé. Deux enfants les nœuds sont créés.

Un nœud racine, un
et trois feuilles.

Il existe d'autres méthodes pour faire pousser des arbres de décision. Une alternative populaire consiste à optimiser les nœuds de manière globale au lieu d'utiliser une stratégie de division et de conquête.

Code YDF
Dans YDF, les arbres de décision sont cultivés selon le principe de la division gloutonne pour régner décrit ci-dessus par défaut. Vous pouvez également activer avec le paramètre growing_strategy="BEST_FIRST_GLOBAL". Voir <ph type="x-smartling-placeholder"></ph> consultez la documentation.

Selon le nombre et le type de caractéristiques d'entrée, le nombre de les conditions possibles pour un nœud donné peuvent être énormes, généralement infinies. Par exemple, pour une condition de seuil $\mathrm{feature}_i \geq t$, la combinaison de tous les possible valeurs de seuil pour $t \in \mathbb{R}$ est infini.

La routine responsable de la recherche du meilleur état s'appelle la splitter. Comme il doit tester un grand nombre de conditions possibles, les diviseurs sont les goulots d'étranglement lors de l'entraînement d'un arbre de décision.

Le score maximisé par le séparateur dépend de la tâche. Exemple :

  • Gain d'informations et Gini (tous deux abordés plus tard) sont couramment utilisées pour la classification.
  • L'erreur quadratique moyenne est couramment utilisée pour la régression.

Il existe de nombreux algorithmes de fractionnement, chacun prenant en charge différemment les éléments suivants:

  • le type de caractéristiques ; par exemple, numérique, catégorielle, textuelle
  • La tâche ; (classification binaire, classification à plusieurs classes, etc.) classification, régression
  • Le type de condition par exemple, une condition de seuil, une condition in-set, condition oblique
  • les critères de régularisation ; par exemple, des séparateurs exacts ou approximatifs pour les conditions de seuil

En outre, il existe des variantes de fractionnement équivalentes avec différents compromis concernant l'utilisation de la mémoire, l'utilisation du processeur, la distribution des calculs, etc.

Code YDF
Dans YDF, les séparateurs sont sélectionnés implicitement à partir de ceux détectés automatiquement (ou le type de caractéristique, les hyperparamètres et l'estimation la vitesse de chaque séparateur (pendant l'entraînement, YDF exécute un petit modèle pour prédire la vitesse de chaque séparateur candidat).