• Non ci sono risultati.

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