Algoritmi di classificazione - Albero decisionale

Introduzione all'albero decisionale

In generale, l'analisi dell'albero decisionale è uno strumento di modellazione predittiva che può essere applicato a molte aree. Gli alberi decisionali possono essere costruiti mediante un approccio algoritmico in grado di suddividere il set di dati in modi diversi in base a condizioni diverse. Le decisioni tress sono gli algoritmi più potenti che rientrano nella categoria degli algoritmi supervisionati.

Possono essere utilizzati sia per attività di classificazione che per attività di regressione. Le due entità principali di un albero sono i nodi decisionali, dove i dati vengono divisi e se ne vanno, dove abbiamo ottenuto il risultato. Di seguito è riportato l'esempio di un albero binario per prevedere se una persona è in forma o inadatta fornendo varie informazioni come età, abitudini alimentari e abitudini di esercizio:

Nell'albero decisionale di cui sopra, le domande sono i nodi decisionali e i risultati finali sono foglie. Abbiamo i seguenti due tipi di alberi decisionali:

  • Classification decision trees- In questo tipo di alberi decisionali, la variabile decisionale è categorica. L'albero decisionale sopra è un esempio di albero decisionale di classificazione.

  • Regression decision trees - In questo tipo di alberi decisionali, la variabile decisionale è continua.

Implementazione dell'algoritmo dell'albero decisionale

Indice Gini

È il nome della funzione di costo utilizzata per valutare le suddivisioni binarie nel set di dati e funziona con la variabile di destinazione categoriale "Success" o "Failure".

Maggiore è il valore dell'indice di Gini, maggiore è l'omogeneità. Un valore dell'indice di Gini perfetto è 0 e il peggiore è 0,5 (per un problema di classe 2). L'indice di Gini per una divisione può essere calcolato con l'aiuto dei seguenti passaggi:

  • Innanzitutto, calcola l'indice di Gini per i sotto-nodi utilizzando la formula p ^ 2 + q ^ 2, che è la somma del quadrato della probabilità di successo e fallimento.

  • Successivamente, calcola l'indice di Gini per la divisione utilizzando il punteggio Gini ponderato di ciascun nodo di quella divisione.

L'algoritmo CART (Classification and Regression Tree) utilizza il metodo Gini per generare divisioni binarie.

Creazione divisa

Una divisione fondamentalmente include un attributo nel set di dati e un valore. Possiamo creare una divisione nel set di dati con l'aiuto delle seguenti tre parti:

  • Part1: Calculating Gini Score - Abbiamo appena discusso questa parte nella sezione precedente.

  • Part2: Splitting a dataset- Può essere definito come la separazione di un set di dati in due elenchi di righe aventi l'indice di un attributo e un valore di suddivisione di tale attributo. Dopo aver ottenuto i due gruppi - destro e sinistro, dal set di dati, possiamo calcolare il valore della divisione utilizzando il punteggio di Gini calcolato nella prima parte. Il valore di divisione deciderà in quale gruppo risiederà l'attributo.

  • Part3: Evaluating all splits- La parte successiva dopo aver trovato il punteggio Gini e la divisione del set di dati è la valutazione di tutte le suddivisioni. A tal fine, innanzitutto, dobbiamo controllare ogni valore associato a ciascun attributo come suddivisione candidata. Quindi dobbiamo trovare la migliore divisione possibile valutando il costo della divisione. La migliore suddivisione verrà utilizzata come nodo nell'albero decisionale.

Costruire un albero

Come sappiamo che un albero ha nodo radice e nodi terminali. Dopo aver creato il nodo radice, possiamo costruire l'albero seguendo due parti:

Parte 1: creazione del nodo terminale

Durante la creazione dei nodi terminali dell'albero decisionale, un punto importante è decidere quando interrompere la crescita dell'albero o creare ulteriori nodi terminali. Può essere fatto utilizzando due criteri, ovvero la profondità massima dell'albero e i record minimi del nodo, come segue:

  • Maximum Tree Depth- Come suggerisce il nome, questo è il numero massimo di nodi in un albero dopo il nodo radice. Dobbiamo smettere di aggiungere nodi terminali una volta che un albero ha raggiunto la massima profondità, cioè una volta che un albero ha ottenuto il numero massimo di nodi terminali.

  • Minimum Node Records- Può essere definito come il numero minimo di modelli di addestramento di cui è responsabile un dato nodo. Dobbiamo smettere di aggiungere nodi terminali una volta che l'albero ha raggiunto questi record di nodo minimi o al di sotto di questo minimo.

Il nodo terminale viene utilizzato per fare una previsione finale.

Part2: divisione ricorsiva

Poiché abbiamo capito quando creare i nodi terminali, ora possiamo iniziare a costruire il nostro albero. La divisione ricorsiva è un metodo per costruire l'albero. In questo metodo, una volta creato un nodo, possiamo creare i nodi figli (nodi aggiunti a un nodo esistente) in modo ricorsivo su ogni gruppo di dati, generati dividendo il set di dati, chiamando la stessa funzione ancora e ancora.

Predizione

Dopo aver costruito un albero decisionale, dobbiamo fare una previsione al riguardo. Fondamentalmente, la previsione implica la navigazione dell'albero decisionale con la riga di dati specificatamente fornita.

Possiamo fare una previsione con l'aiuto della funzione ricorsiva, come fatto sopra. La stessa routine di previsione viene chiamata di nuovo con i nodi sinistro o destro figlio.

Presupposti

Le seguenti sono alcune delle ipotesi che facciamo durante la creazione dell'albero decisionale:

  • Durante la preparazione degli alberi decisionali, il set di addestramento funge da nodo radice.

  • Il classificatore dell'albero decisionale preferisce che i valori delle caratteristiche siano categoriali. Nel caso in cui si desideri utilizzare valori continui, devono essere discretizzati prima della creazione del modello.

  • In base ai valori dell'attributo, i record vengono distribuiti in modo ricorsivo.

  • Verrà utilizzato un approccio statistico per posizionare gli attributi in qualsiasi posizione del nodo, come il nodo radice o il nodo interno.

Implementazione in Python

Esempio

Nell'esempio seguente, implementeremo il classificatore dell'albero decisionale su Pima Indian Diabetes -

Innanzitutto, inizia con l'importazione dei pacchetti Python necessari -

import pandas as pd
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split

Successivamente, scarica il set di dati iris dal suo collegamento web come segue:

col_names = ['pregnant', 'glucose', 'bp', 'skin', 'insulin', 'bmi', 'pedigree', 'age', 'label']
pima = pd.read_csv(r"C:\pima-indians-diabetes.csv", header=None, names=col_names)
pima.head()
pregnant    glucose  bp    skin  insulin  bmi   pedigree    age   label
0       6         148      72    35     0       33.6    0.627     50      1
1       1         85       66    29     0       26.6    0.351     31      0
2       8         183      64     0     0       23.3    0.672     32      1
3       1         89       66    23     94      28.1    0.167     21      0
4       0         137      40    35     168     43.1    2.288     33      1

Ora, dividi il set di dati in caratteristiche e variabile di destinazione come segue:

feature_cols = ['pregnant', 'insulin', 'bmi', 'age','glucose','bp','pedigree']
X = pima[feature_cols] # Features
y = pima.label # Target variable

Successivamente, divideremo i dati in train e test split. Il codice seguente suddividerà il set di dati in 70% di dati di addestramento e 30% di dati di test -

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=1)

Quindi, addestrare il modello con l'aiuto della classe DecisionTreeClassifier di sklearn come segue:

clf = DecisionTreeClassifier()
clf = clf.fit(X_train,y_train)

Finalmente dobbiamo fare previsioni. Può essere fatto con l'aiuto del seguente script:

y_pred = clf.predict(X_test)

Successivamente, possiamo ottenere il punteggio di precisione, la matrice di confusione e il rapporto di classificazione come segue:

from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
result = confusion_matrix(y_test, y_pred)
print("Confusion Matrix:")
print(result)
result1 = classification_report(y_test, y_pred)
print("Classification Report:",)
print (result1)
result2 = accuracy_score(y_test,y_pred)
print("Accuracy:",result2)

Produzione

Confusion Matrix:
[[116 30]
[ 46 39]]
Classification Report:
            precision   recall   f1-score    support
      0       0.72      0.79       0.75     146
      1       0.57      0.46       0.51     85
micro avg     0.67      0.67       0.67     231
macro avg     0.64      0.63       0.63     231
weighted avg  0.66      0.67       0.66     231

Accuracy: 0.670995670995671

Visualizzazione dell'albero decisionale

L'albero decisionale sopra può essere visualizzato con l'aiuto del seguente codice:

from sklearn.tree import export_graphviz
from sklearn.externals.six import StringIO
from IPython.display import Image
import pydotplus

dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,
      filled=True, rounded=True,
      special_characters=True,feature_names = feature_cols,class_names=['0','1'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('Pima_diabetes_Tree.png')
Image(graph.create_png())