Student Alessio Gallucci Professor Elio Piccolo TESINA INTELLIGENZA ARTIFICIALE 2015 2016 Benchmark Classification Model On Kaggle Santander Challange vers.1.0
AGENDA Background SLIDE 3 Database SLIDE 4-5 Benchmark SLIDE 6-7 Bias-Variance SLIDE 8-9 vers.1.0 2/9
BACKGROUND Kaggle Kaggle è la più grande comunità di data scientist, statistici, e esperti di machine learning. Questa comunità ha risolto molti dei più complessi problemi proposti da moltepli aziende leader nel mondo. Il format classico è quello della competizione/challange in cui un azienda propone una sfida da risolvere è in cambio mette a disposizione un premio di vario genere (spesso in denaro o posto di lavoro). Inoltre mette a disposizione un training set su cui allenarsi e tiene segreto un test set nel quale andrà a misurare e classificare le soluzioni proposte dagli utenti Kaggle. Santander Santader propone ricca Challange su Kaggle con in premio 60.000$ di montepremi. Il problema che vuole risolvere è capire il prima possibile se un cliente è contento o meno del servizio offerto infatti la soddisfazione del cliente è una misura importante di successo della banca. Inoltre è difficile capire se un cliente non è soddisfatto prima che esso lasci la banca e sia quindi un cliente perso. Santader chiede di identificare i clienti in maniera preventiva in modo che essa poi possa agire prima che il cliente lasci la banca. Il database che essa offre contiente 370 attributi anonimi per un totale di circa 75.000 esempi come training set. vers.1.0 3/9
DATABASE DESCRIPTION TARGET Il numero di clienti scontenti nel training set è molto basso, circa il 4% come mostra il grafico a torta qui di fianco. Questo sbilanciamento nelle etichette di classe complica molto tutte le fasi del modello di previsione. Un problema in questo tipo di problemi è che molte misure di performance vengono distorte e non rappresentano più un indice di bontà del modello. Si pensi per esempio all'accuratezza (predizioni corrette / totale elementi) che paradossalmente potrebbe essere del 96% per il classificatore banale che assegna a qualsiasi dato di input il valore 0 ovvero contento. Per queste ragioni si è scelto di usare come misura di performance l'auc ovvero l'area sotto la curve ROC. 0:Contenti TARGET 1:Scontenti vers.1.0 4/9
DATABASE DESCRIPTION Dimensioni TARGET Gli attributi non vengono descritti nella challenge è sta alla nostra abilità capirne il significato. Vi sono inizialmente 370 attributi tutti di tipo numerico e si distribuiscono in binari, interi, reali il che complica l'analisi in quanto bisogna fare attenzione ad usare modelli che non capiscono la differenza nel dominio degli attributi oppure effettuare una normalizzazione prima. Il training set inoltre contiente 76020 esempi numero relativamente grande, ma non necessariamente sufficiente per allenare modelli complessi quali le reti neurali artificiali considerando anche la bassa frequenza della classe positiva. INFORMAZIONI TRAINING SET Int64Index: 76020 entries, 1 to 151838 Columns: 370 entries, var3 to TARGET dtypes: float64(111), int64(259) memory usage: 215.2 MB vers.1.0 5/9
BENCHMARK Numero di attributi 227. Il numero di attributi si riduce in prima istanza a 306 eliminando le colonne con deviazione standard nulla (colonne costanti) e poi eliminando le colonne duplicate. Da 306 a 227 è stata chiamata la funzione SelectKBest di sklearn. Vista la complessità del database gli unici modelli che possono competere alla gara sono quelli ensamble (insiemi di classificatori deboli) oppure le reti neurali come si evince dal grafico delle curve AUC generate con parametri base di tutti i modelli. vers.1.0 6/9
BENCHMARK CODE PYTHON-SKLEARN VARIABLES GP = {'seed':22*7}; np.random.seed(gp['seed']) Models = [GradientBoostingClassifier(), MLPClassifier(), AdaBoostClassifier(), RandomForestClassifier(n_estimators=50,max_depth=5), DecisionTreeClassifier(max_depth=25,class_weight={0:0.96,1:0.04}), KNeighborsClassifier(n_neighbors=5), GaussianNB()] Labels = ['GrdBoost','MLPNN','AdaBoost','RndForest','DecisionTree','KNN','NaiveBayes'] LOADING AND PREPROCESSING training = pd.read_csv("input/train.csv",index_col = 0) training = training.replace(-999999,2) fdupl = sfs.list_duplicate(training); fcost = sfs.list_constant(training); fall = list(training) fsel = [f for f in fall if (f not in fcost and f not in fdupl)] id_training = training.index X = training[fsel].iloc[:,:-1]; y = training.target X = StandardScaler().fit(X).transform(X) X = SelectKBest(f_classif, k=227).fit(x, y).transform(x) RUNNING MODELS X_train, X_test, y_train, y_test = cv.train_test_split(x1_train, y1_train, test_size=0.33) for clf,lab in zip(models,labels): print("processing", lab) y_score = clf.fit(x_train,y_train).predict_proba(x_test) fpr, tpr, thresholds = roc_curve(y_test, y_score[:,1]) roc_auc = auc(fpr, tpr) vers.1.0 7/9
BIAS-VARIANCE TRADEOFF DECISION TREE Analizziamo la il trade-off tra bias e variance nel caso dell albero decisione in quanto è il classificatore debole più usato negli ensamble. Come si può notare dal grafico un ottimo valore di profondità massima dell albero è 9 ovvero quando si distaccano la curva dell errore nel training set e nel test set. Chiaramente negli ensamble si lavorerà con una profondità massima più piccola (eg. 6) in modo da non fare overfitting. vers.1.0 8/9
BIAS-VARIANCE CODE PYTHON-SKLEARN MODEL clf = DecisionTreeClassifier(class_weight={0: 0.96, 1: 0.04}, criterion='gini', max_depth=3, max_features=0.85, max_leaf_nodes=none, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, presort=false, random_state=none, splitter='best') X_train, X_test, y_train, y_test = cv.train_test_split(x, y, test_size=0.75) auc_test = []; auc_train = [] dep_list = [6,9,12,15,18,21,24,27,30,33] ITERATION ON DEPTH for n_dep in dep_list: clf.max_depth = n_dep clf.fit(x_train,y_train).predict_proba(x_test) y_score = clf.predict_proba(x_test) y_score_train = clf.predict_proba(x_train) fpr, tpr, thresholds = roc_curve(y_test, y_score[:,1]) fpr_train, tpr_train, thresholds_train = roc_curve(y_train, y_score_train[:,1]) auc_test.append(auc(fpr, tpr)); auc_train.append(auc(fpr_train,tpr_train) vers.1.0 9/9