L'Élagage Des Arbres De Décision

Salut les gars ci-dessous est un extrait de l'arbre de décision comme il est assez énorme.

L'Élagage Des Arbres De Décision

Comment faire de l'arbre cesser de croître quand le plus bas valeur dans un nœud de moins de 5 ans. Voici le code pour produire de l'arbre de décision. Sur SciKit - Decission De L'Arbre nous pouvons voir que la seule façon de le faire est par min_impurity_decrease mais je ne suis pas sûr de comment elle fonctionne.

import numpy as np
import pandas as pd
from sklearn.datasets import make_classification
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier
X, y = make_classification(n_samples=1000,
n_features=6,
n_informative=3,
n_classes=2,
random_state=0,
shuffle=False)
# Creating a dataFrame
df = pd.DataFrame({'Feature 1':X[:,0],
'Feature 2':X[:,1],
'Feature 3':X[:,2],
'Feature 4':X[:,3],
'Feature 5':X[:,4],
'Feature 6':X[:,5],
'Class':y})
y_train = df['Class']
X_train = df.drop('Class',axis = 1)
dt = DecisionTreeClassifier( random_state=42)                
dt.fit(X_train, y_train)
from IPython.display import display, Image
import pydotplus
from sklearn import tree
from sklearn.tree import _tree
from sklearn import tree
import collections
import drawtree
import os  
os.environ["PATH"] += os.pathsep + 'C:\\Anaconda3\\Library\\bin\\graphviz'
dot_data = tree.export_graphviz(dt, out_file = 'thisIsTheImagetree.dot',
feature_names=X_train.columns, filled   = True
, rounded  = True
, special_characters = True)
graph = pydotplus.graph_from_dot_file('thisIsTheImagetree.dot')  
thisIsTheImage = Image(graph.create_png())
display(thisIsTheImage)
#print(dt.tree_.feature)
from subprocess import check_call
check_call(['dot','-Tpng','thisIsTheImagetree.dot','-o','thisIsTheImagetree.png'])

Mise à jour

Je pense que min_impurity_decrease peut être aussi un moyen d'aider à atteindre l'objectif. Comme peaufinage min_impurity_decrease ne fait tailler l'arbre. Quelqu'un peut-il m'expliquer min_impurity_decrease.

Je suis en train d'essayer de comprendre l'équation de scikit apprendre, mais je ne suis pas sûr de ce qui est la valeur de right_impurity et left_impurity.

N = 256
N_t = 256
impurity = ??
N_t_R = 242
N_t_L = 14
right_impurity = ??
left_impurity = ??
New_Value = N_t / N * (impurity - ((N_t_R / N_t) * right_impurity)
- ((N_t_L / N_t) * left_impurity))
New_Value

Mise à jour 2

Au lieu de l'élagage à une certaine valeur, nous pruneau sous certaines conditions.
comme
Nous n'avons divisé à 6/4 et 5/5, mais pas à 6000/4 ou 5000/5. Disons que si une valeur est en dessous d'un certain pourcentage en comparaison avec sa valeur voisine dans le nœud, plutôt que d'une certaine valeur.

      11/9
/       \
6/4       5/5
/   \     /   \
6/0  0/4  2/2  3/3
  • Quelle est la valeur que représentent-ils? min_impurity_decrease est applicable à la division qui peut se produire dans un nœud, et de ne pas considérer une valeur du noeud courant, mais l'augmentation de la pureté dans les enfants si l'on veut diviser le nœud.
  • le valeur terme est dans l'arbre de décision sous le terme d'échantillons
  • La gauche et la droite de l'impureté sont les impuretés des échantillons dans le gauche de l'enfant et de droit de l'enfant, respectivement. (calculé par le critère argument)
  • Je ne pense pas que vous serez en mesure de le faire avec la decission de l'arbre de SciKit, à moins que vous le saviez peut-être le max-depth ou le nombre d'échantillons lorsque la valeur de moins de 5 ans va se produire. Peut-être qu'il est possible de parcourir l'arbre après la construction? L'arbre est situé dans tree_ de l'objet classificateur
  • Vous devez spécifier quel est le critère qui vous êtes en utilisant: soit de gini ou l'entropie. Vous ne pouvez pas mettre en place votre propre fonction.
  • Pas selon la documentation: "le Critère : string, optionnel (par défaut=”gini”) => La fonction de mesure de la qualité d'une division. Les critères pris en charge sont “gini” pour le coefficient de Gini de l'impureté et de “l'entropie” pour le gain d'informations."
  • N'est-ce pas juste min_samples_split?
  • min_samples split est pour le nombre total d'échantillons dans le nœud. La question est, la valeur la plus basse dans le nœud. par exemple [400, 1] vous voulez qu'il cesse de fractionnement. À l'aide de min_samples_split, il sera toujours divisés
  • Jetez un oeil à cette discussion, ressemble à un problème similaire à essayer de résoudre.
  • vous avez absolument raison ! C'est exactement ma question

InformationsquelleAutor | 2018-03-22