Progettazione modello
6.4 Scelta delle variabili
6.4.2 Albero decisionale
Random Forest e XGBoost rappresentano due modelli di intelligenza artificiale basati sul concetto di albero decisionale e, per questo motivo, si ritiene opportuno e interessante iniziare, per lo sviluppo di un processo di feature selection, dalla costruzione di un modello di albero decisionale singolo, utile come punto di partenza per svolgere le analisi successive.
Prima di procedere, è doveroso effettuare una precisazione sul database impiegato, in quanto il processo in questione è stato eseguito utilizzando contemporaneamente il dataset trasformato sia con i valori normalizzati MinMax che con i valori standardizzati Z-score, anche se con risultati praticamente identici in entrambe le applicazioni.
Implementazione
Per l’implementazione del modello di albero decisionale semplice si è scelto di utilizzare, in merito alla fase di training del modello, sia l’intero database a disposizione che una divisione del database in training set e testing set, rispettivamente pari a 23 e 13, ricorrendo alla funzione train_test_split:
#s p l i t t i n g d a t a s e t i n t o t r a i n i n g s e t and t e s t i n g s e t
X_train1 , X_test1 , y_train1 , y_test1 = t r a i n _ t e s t _ s p l i t ( d f _ i n d i c a t o r i , df_flag1 , t e s t _ s i z e =1/3 , random_state =42)
Dal momento che non si è interessati a impiegare il modello di albero decisionale per risolvere il problema di classificazione tra imprese sane e imprese anomale, si è ritenuto opportuno utilizzare non solo una divisione del database in training set e testing set, più corretta dal punto di vista teorico per la validazione dei risultati, ma anche l’intero database a disposizione, senza nessuna divisione, in modo da sfruttare tutta l’informazione contenuta al suo interno per individuare le variabili più significative.
A questo proposito, si inizializza il classificatore DecisionTreeClassifier, scegliendo adeguatamente gli iperparametri del modello, si addestra un albero decisionale singolo, utilizzando la funzione fit, e, infine, si predice il risultato, utilizzando la funzione predict:
#implementing a s i n g l e D e c i s i o n Tree model
c l f = D e c i s i o n T r e e C l a s s i f i e r ( random_state =42 , c r i t e r i o n= ’ g i n i ’ , max_depth=3)
#f i t t i n g the model
c l f = c l f . f i t ( X_train1 , y_train1 )
#p r e d i c t i n g the r e s u l t
y_pred1 = c l f . p r e d i c t ( X_test1 )
Per la definizione del modello di albero decisionale singolo si è deciso di utilizzare come criterio decisionale l’impurità di Gini, oltre che una limitata dimensione dell’albero, in modo da ottenere il giusto compromesso tra complessità e interpretabilità dei risultati.
Così facendo, è possibile osservare i risultati conseguiti dal modello appena prodotto, visualizzando graficamente la struttura dell’albero decisionale, con la funzione plot_tree:
#d e s c r i b i n g the model p l t . f i g u r e ( f i g s i z e =(20 ,10) ) t r e e . p l o t _ t r e e ( c l f ,
f i l l e d =True , rounded=True , feature_names=X_train1 . columns , class_names =[ ’ 0 ’ , ’ 1 ’ ] ,
f o n t s i z e =12) p l t . show ( )
Progettazione modello
In definitiva, è possibile controllare la predizione del modello sui dati, utilizzando, per comparare i risultati previsti e osservati, la matrice di confusione e l’Accuracy, rispetti-vamente tramite le funzioni confusion_matrix e accuracy_score, in modo da mostrare le performance del modello sia graficamente che analiticamente:
#computing the accuracy and v i s u a l i z i n g the c o n f u s i o n matrix p r i n t( ’ Accuracy : ’ , m e t r i c s . accuracy_score ( y_test1 , y_pred1 ) ) mat = confusion_matrix ( y_test1 , y_pred1 )
sns . heatmap ( mat . T, square=True , annot=True , cbar=False , fmt=" . 0 f " ) p l t . x l a b e l ( ’ Actual l a b e l ’ )
p l t . y l a b e l ( ’ P r e d i c t e d l a b e l ’ ) ; p l t . show ( )
Analisi risultati
Il modello di albero decisionale singolo risulta estremamente semplice, con l’obiettivo di studiare il database a disposizione e svolgere alcune interessanti osservazioni preliminari.
Con la visualizzazione grafica del modello, infatti, è possibile analizzare la struttura dell’albero decisionale e interpretarne i risultati: in ogni nodo decisionale si può osservare la variabile di decisione selezionata per dividere i dati e il valore assunto da quest’ultima, il valore del criterio di decisione adottato, il numero di osservazioni presenti in ogni ramo e, infine, l’esito finale della classificazione (figura6.4e6.5).
KCN ≤0,042 KCN ≤ −0,751
gini=0,036 samples=15879 value=[15585,294]
class=0
KN T /DT+ KN ≤ 0,264 KN T /DT+ KN ≤ −1,358
gini=0,214 samples=1002 value=[880,122]
class=0
KN/AT ≤0,448 KN/AT ≤ −0,524
gini=0,023 samples=14877 value=[14705,172]
class=0
AC/AT ≤0,289 AC/AT ≤ −1,223
gini=0,441 samples=283 value=[190,93]
class=0
DT L/DT ≤0,819 DT L/DT ≤2,056
gini=0,077 samples=719 value=[690,29]
class=0
M S ≤0,256 M S ≤ −1,237
gini=0,056 samples=4038 value=[3922,116]
class=0
M S ≤0,126 M S ≤ −1,919
gini=0,010 samples=10839 value=[10783,56]
class=0
gini=0,490 samples=100 value=[43,57]
class=1
gini=0,316 samples=183 value=[147,36]
class=0
gini=0,046 samples=683 value=[667,16]
class=0
gini=0,461 samples=36 value=[23,13]
class=0
gini=0,273 samples=135 value=[113,22]
class=0
gini=0,047 samples=3903 value=[3809,94]
class=0
gini=0,068 samples=283 value=[273,10]
class=0
gini=0,009 samples=10556 value=[10510,46]
class=0
Figura 6.4. Albero decisionale (flag di status S/A - impresa).
6.4 – Scelta delle variabili
KN/AT ≤0,201 KN/AT ≤ −1,573
gini=0,236 samples=15879 value=[13706,2173]
class=0
OF N/AT ≤0,228 OF N/AT ≤ −0,313
gini=0,436 samples=1032 value=[332,700]
class=1
AU −(P S − OS)/AT ≤ 0,498 AU −(P S − OS)/AT ≤ −0,368
gini=0,179 samples=14847 value=[13374,1473]
class=0
M S ≤0,494 M S ≤0,005 gini=0,370 samples=628 value=[154,474]
class=1
M S ≤0,438 M S ≤ −0,287
gini=0,493 samples=404 value=[178,226]
class=1
CB/CO ≤0,005 CB/CO ≤ −1,564
gini=0,358 samples=3201 value=[2454,747]
class=0
ln(F N) ≤ 0,422 ln(F N) ≤ −0,088
gini=0,117 samples=11646 value=[10920,726]
class=0
gini=0,344 samples=602 value=[133,469]
class=1
gini=0,311 samples=26 value=[21,5]
class=0
gini=0,421 samples=156 value=[47,109]
class=1
gini=0,498 samples=248 value=[131,117]
class=0
gini=0,444 samples=969 value=[647,322]
class=0
gini=0,308 samples=2232 value=[1807,425]
class=0
gini=0,207 samples=3986 value=[3518,468]
class=0
gini=0,065 samples=7660 value=[7402,258]
class=0
Figura 6.5. Albero decisionale (flag di status S/A+L - impresa).
Con la visualizzazione analitica del modello, invece, è possibile valutare le performance dell’albero decisionale, applicato ai due determinati problemi che si intende analizzare, ovvero “flag di status S/A - impresa” e “flag di status S/A+L - impresa”, utilizzando sia il database completo che il database diviso in training set e testing set (figura6.6e 6.7).
Nel primo problema, si è ottenuto rispettivamente una Accuracy del 98,05%, a fronte di un numero di imprese correttamente classificate pari a 5190 su un totale di imprese analizzate nel testing set pari a 5293, e una Accuracy del 98,24%, a fronte di un numero di imprese correttamente classificate pari a 15599 su un totale di imprese analizzate nel database pari a 15879.
Nel secondo problema, si è ottenuto rispettivamente una Accuracy dell’88,23%, a fronte di un numero di imprese correttamente classificate pari a 4670 su un totale di imprese analizzate nel testing set pari a 5293, e una Accuracy del 88,82%, a fronte di un numero di imprese correttamente classificate pari a 14104 su un totale di imprese analizzate nel database pari a 15879.
In realtà, non si è particolarmente interessati alle performance del modello, in quanto il modello di albero decisionale semplice non risulta sufficientemente adeguato per modellare la complessità che governa il fenomeno dell’insolvenza di una controparte. Tuttavia, è importante studiare questo modello poiché, rappresentando il componente fondamentale dei modelli Random Forest e XGBoost, costituisce il punto di partenza ideale.
Progettazione modello
Accuracy= 0,9805
0 1
0
1
5178 93
10 12
Actual label
Predictedlabel
Flag di status S/A
0 1000 2000 3000 4000 5000 6000
Accuracy= 0,8823
0 1
0
1
4494 553
70 176
Actual label
Predictedlabel
Flag di status S/A+L
0 1000 2000 3000 4000 5000 6000
Figura 6.6. Albero decisionale (testing set).
Accuracy= 0,9824
0 1
0
1
15542 237
43 57
Actual label
Predictedlabel
Flag di status S/A
0 1000 2000 3000 4000 5000 6000
Accuracy= 0,8882
0 1
0
1
13526 1595
180 578
Actual label
Predictedlabel
Flag di status S/A+L
0 1000 2000 3000 4000 5000 6000
Figura 6.7. Albero decisionale (database).