Progettazione modello
6.4 Scelta delle variabili
6.4.3 Ensemble
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).
6.4 – Scelta delle variabili
Random Forest
Come in precedenza, per l’implementazione del modello Random Forest si è deciso di utilizzare, in merito alla fase di training del sistema, sia l’intero database a disposizione che una divisione del database in training set e testing set, rispettivamente pari a 23 e 13:
#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)
Pertanto, si procede a generare il classificatore RandomForestClassifier, scegliendo in maniera opportuna gli iperparametri del modello, si continua addestrando il modello Random Forest e si conclude calcolando la predizione sui dati in esame:
#implementing a Random F o r e s t C l a s s i f i e r
r f _ c l a s s = R a n d o m F o r e s t C l a s s i f i e r ( n_estimators =100 , c r i t e r i o n= ’ g i n i ’ , oob_score=True )
#f i t t i n g the Random F o r e s t model
r f _ o b j e c t = r f _ c l a s s . f i t ( X_train1 , np . ar r a y ( y_train1 ) . r a v e l ( ) )
#g e t t i n g the p r e d i c t i o n f o r the data r f _ p r e d i c t i o n = r f _ o b j e c t . p r e d i c t ( X_test1 )
In ultima analisi, si osserva la performance del modello, comparando i risultati ottenuti:
#computing the accuracy
p r i n t( ’ Accuracy s c o r e : ’ , accuracy_score ( y_test1 , r f _ p r e d i c t i o n ) )
#p r i n t i n g the oob_score
p r i n t( ’OOB−Score : ’ , r f _ o b j e c t . oob_score_ )
#v i s u a l i z i n g the c o n f u s i o n matrix
mat = confusion_matrix ( y_test1 , r f _ p r e d i c t i o n )
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 ( )
Come è facile osservare analizzando le figure6.8e 6.9, le prestazioni sono nettamente migliori in tutte le applicazioni: nel caso di “flag di status S/A - impresa” si ottiene un incremento di Accuracy pari allo 0,44% sul testing set e all’1,78% sul database completo;
nel caso di “flag di status S/A+L - impresa” si ottiene un risultato ancora superiore, con un incremento di Accuracy pari al 2,53% sul testing set e al 12,57% sul database completo.
Tuttavia, l’obiettivo di questa applicazione non consiste nel valutare le performance del modello in merito alla capacità di classificare le imprese sane e le imprese anomale presenti nel database, quanto piuttosto utilizzare questo algoritmo per mettere in evidenza le variabili più discriminanti, in modo da generare un processo di feature selection.
Per ottenere questo risultato, si utilizza la funzione feature_importances_, che consente di determinare l’importanza relativa di ciascuna delle variabili analizzate dal modello, utilizzando come metrica il Gain per definire il concetto di importanza:
#p l o t t i n g the v a r i a b l e s i n o r d e r o f importance gain = r f _ c l a s s . feature_importances_
p l t . rcParams [ ’ f i g u r e . f i g s i z e ’ ] = ( 1 5 , 1 5 )
sorted_idx = r f _ c l a s s . feature_importances_ . a r g s o r t ( )
p l t . barh ( d f _ i n d i c a t o r i . columns [ sorted_idx ] , r f _ c l a s s . feature_importances_ [ sorted_idx p l t . x l a b e l ( ’Random F o r e s t Feature Importance ’ )] )
p l t . x l a b e l ( ’ Balance Sheet Rat ios ’ ) p l t . show ( )
Progettazione modello
Accuracy= 0,9849
0 1
0
1
5188 75
5 25
Actual label
Predictedlabel
Flag di status S/A
0 1000 2000 3000 4000 5000 6000
Accuracy= 0,9046
0 1
0
1
4484 434
71 304
Actual label
Predictedlabel
Flag di status S/A+L
0 1000 2000 3000 4000 5000 6000
Figura 6.8. Random Forest (testing set).
Accuracy= 0,9999
0 1
0
1
15585 2
0 292
Actual label
Predictedlabel
Flag di status S/A
0 1000 2000 3000 4000 5000 6000
Accuracy= 0,9999
0 1
0
1
13706 2
0 2171
Actual label
Predictedlabel
Flag di status S/A+L
0 1000 2000 3000 4000 5000 6000
Figura 6.9. Random Forest (database).
In questo modo, è possibile rappresentare graficamente le variabili del problema in ordine di importanza relativa, come visibile in figura6.10, suddividendo i risultati nei due flag di output in esame: “flag di status S/A - impresa” e “flag di status S/A+L - impresa”.
Come facilmente intuibile, i due modelli producono in output risultati differenti, anche se, è doveroso sottolineare come la maggior parte degli indicatori più diagnostici risultino in comune a entrambi i modelli, dimostrando in qualche modo il loro significato economico.
6.4 – Scelta delle variabili
Figura 6.10. Processo di feature selection utilizzando Random Forest.
Progettazione modello
XGBoost
In modo analogo, è possibile utilizzare un modello alternativo, ovvero XGBoost, seguendo gli stessi passi seguiti in precedenza per il modello Random Forest e sintetizzati di seguito.
Allora, prima di tutto, per l’implementazione del modello XGBoost si è deciso di utilizzare, in merito alla fase di training del sistema, sia l’intero database a disposizione che una divisione del database in training set e testing set, rispettivamente pari a 23 e 13:
#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 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)
Successivamente, si procede a costruire il classificatore XGBClassifier, scegliendo in maniera opportuna gli iperparametri del modello, si prosegue addestrando il modello XGBoost e si termina calcolando la predizione sui dati in esame:
#implementing a XGBoost C l a s s i f i e r
xg_class = ( xgb . XGBClassifier ( n_estimators =100 ,max_depth=5, l e a r n i n g _ r a t e =0.1 , subsample =0.5) )
#f i t t i n g the XGBoost model
xg_object = xg_class . f i t ( X_train1 , np . ar r a y ( y_train1 ) . r a v e l ( ) )
#g e t t i n g the p r e d i c t i o n f o r the data x g _ p r e d i c t i o n = xg_object . p r e d i c t ( X_test1 )
Per ultima cosa, si osserva la performance del modello, comparando i risultati ottenuti:
#computing the accuracy
p r i n t( ’ Accuracy s c o r e : ’ , accuracy_score ( y_test1 , x g _ p r e d i c t i o n ) )
#v i s u a l i z i n g the c o n f u s i o n matrix
mat = confusion_matrix ( y_test1 , x g _ p r e d i c t i o n )
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 ( )
Anche in questo caso, analizzando le figure6.11e6.12, le prestazioni sono leggermente migliori nelle varie applicazioni: nel caso di “flag di status S/A - impresa” si ottiene un incremento di Accuracy pari allo 0,39% sul testing set e all’1,24% sul database completo;
nel caso di “flag di status S/A+L - impresa” si ottiene un risultato di nuovo superiore, con un incremento di Accuracy pari al 1,76% sul testing set e al 4,74% sul database completo.
A questo riguardo, sebbene entrambi i modelli, Random Forest e XGBoost, consen-tano di raggiungere ottimi livelli di Accuracy, è comunque possibile mettere in evidenza come Random Forest permetta di ottenere risultati ancora migliori rispetto a XGBoost, soprattutto nel caso di “flag di status S/A+L - impresa”.
A questo punto, si utilizza la funzione feature_importances_ indicata in precedenza, per determinare l’importanza relativa di ciascuna delle variabili analizzate dal modello, utilizzando come metrica il Gain per definire il concetto di importanza:
#p l o t t i n g the v a r i a b l e s i n o r d e r o f importance gain = xg_class . feature_importances_
p l t . rcParams [ " f i g u r e . f i g s i z e " ] = ( 1 5 , 1 5 )
sorted_idx = xg_class . feature_importances_ . a r g s o r t ( )
p l t . barh ( d f _ i n d i c a t o r i . columns [ sorted_idx ] , xg_class . feature_importances_ [ sorted_idx p l t . x l a b e l ( " XGboost Feature Importance " )] )
p l t . x l a b e l ( ’ Balance Sheet Ratios ’ ) p l t . show ( )
6.4 – Scelta delle variabili
Accuracy= 0,9843
0 1
0
1
5188 78
5 22
Actual label
Predictedlabel
Flag di status S/A
0 1000 2000 3000 4000 5000 6000
Accuracy = 0,8978
0 1
0
1
4465 446
95 287
Actual label
Predictedlabel
Flag di status S/A+L
0 1000 2000 3000 4000 5000 6000
Figura 6.11. XGBoost (testing set).
Accuracy= 0,9946
0 1
0
1
15585 86
0 208
Actual label
Predictedlabel
Flag di status S/A
0 1000 2000 3000 4000 5000 6000
Accuracy = 0,9303
0 1
0
1
13590 990
116 1183
Actual label
Predictedlabel
Flag di status S/A+L
0 1000 2000 3000 4000 5000 6000
Figura 6.12. XGBoost (database).
Come risultato, è possibile effettuare le medesime considerazioni indicate in precedenza, rappresentando graficamente le variabili del problema in ordine di importanza relativa, come visibile in figura6.13, suddividendo sempre i risultati nei due flag di output in esame:
“flag di status S/A - impresa” e “flag di status S/A+L - impresa”.
Progettazione modello
Figura 6.13. Processo di feature selection utilizzando XGBoost.
6.5 – Modello di credit scoring