Professional Documents
Culture Documents
[ 7. Anexos. ]
Anexo 4: Código para la extracción de resultados.
# Models
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
# Resampling techniques
from imblearn.under_sampling import RandomUnderSampler
from imblearn.under_sampling import CondensedNearestNeighbour
from imblearn.under_sampling import EditedNearestNeighbours
from imblearn.under_sampling import RepeatedEditedNearestNeighbours
from imblearn.under_sampling import TomekLinks
from imblearn.under_sampling import NearMiss
from imblearn.over_sampling import SMOTE
from imblearn.over_sampling import ADASYN
from imblearn.over_sampling import RandomOverSampler
from imblearn.combine import SMOTETomek
# Performance metrics
from sklearn.metrics import precision_recall_fscore_support
from sklearn.metrics import plot_confusion_matrix
from sklearn.metrics import roc_curve
from sklearn.metrics import plot_roc_curve
from sklearn.metrics import log_loss
from sklearn.metrics import auc
from sklearn.metrics import roc_auc_score
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score
from sklearn.metrics import accuracy_score
from sklearn.metrics import confusion_matrix
# Visualization
import matplotlib.pyplot as plt
import seaborn as sns
import random
import itertools
105
TRABAJO FIN DE MÁSTER
Joaquín García Abad
Comparativa de técnicas de balanceo de datos.
Máster en Análisis de Datos para la
Aplicación a un caso real para la predicción de fuga de
Inteligencia de los Negocios
clientes
[ 7. Anexos. ]
import matplotlib.pyplot as plt
import matplotlib.pyplot as plt
from itertools import cycle
lines = ["-","--","-.",":"]
linecycler = cycle(lines)
# algorithms list
sampler = [rus, enn, tml, nm3, ros, smo, ada, smt]
# algorithms labels list
alias = ['rus', 'enn', 'tml', 'nm3', 'ros', 'smot', 'adas', 'smo_tl']
# algorithms names list
method = ['Random Under Sampling', 'Edited nearest neighbours' , 'Tomek Links', 'Near Miss 3', 'Random Over Sampling', 'SMOTE',
'ADASYN', 'SMOTE&TomekLinks']
# methods dataframe
method_df = pd.DataFrame({'method_name':method, 'alias':alias,'sampler':sampler})
'''Gives the performance results of a logistic regression after applying different data balancing methods.
Parameters:
normalize = 'true'
X_train: splnormalize = 'true'it data containing the predictors from the training set.
106
TRABAJO FIN DE MÁSTER
Joaquín García Abad
Comparativa de técnicas de balanceo de datos.
Máster en Análisis de Datos para la
Aplicación a un caso real para la predicción de fuga de
Inteligencia de los Negocios
clientes
[ 7. Anexos. ]
X_test: split data containing the predictors from the test set.
y_train: split data containing variable to predict from the training set.
y_test: split data containing variable to predict from the training set.
classifier: classification method.
Returns:
pandas.dataframe: Pandas dataframe with the ordered results of the implementations.'''
# Results dataframe
performance_metrics_df = pd.DataFrame(columns=['Method', 'Accuracy', 'Precision', 'Recall', 'F1-score', 'AUC','AP', 'Log-
loss'])
# Base model
base_model = classifier.fit(X_train, y_train)
y_pred_test_base = base_model.predict(X_test)
y_pred_test_proba_base = base_model.predict_proba(X_test)[::,1]
107
TRABAJO FIN DE MÁSTER
Joaquín García Abad
Comparativa de técnicas de balanceo de datos.
Máster en Análisis de Datos para la
Aplicación a un caso real para la predicción de fuga de
Inteligencia de los Negocios
clientes
[ 7. Anexos. ]
metrics_base.insert(0,technique_name_base)
metrics_base = pd.Series(metrics_base, index = performance_metrics_df.columns)
performance_metrics_df = performance_metrics_df.append(metrics_base,ignore_index=True)
# Modelo
model = classifier.fit(X_train_rs, y_train_rs)
y_pred_test = model.predict(X_test)
y_pred_test_proba = model.predict_proba(X_test)[::,1]
#Insertar resultados
technique_name = classifier_label +'_'+ alias
metrics = []
metrics.append(accuracy_score(y_pred_test, y_test)) # accuracy
metrics = metrics + list(precision_recall_fscore_support(y_pred_test, y_test, average='binary')[0:3]) # precision, recall
& F1
108
TRABAJO FIN DE MÁSTER
Joaquín García Abad
Comparativa de técnicas de balanceo de datos.
Máster en Análisis de Datos para la
Aplicación a un caso real para la predicción de fuga de
Inteligencia de los Negocios
clientes
[ 7. Anexos. ]
metrics.append(roc_auc_score(y_test, y_pred_test_proba)) # AUC
metrics.append(average_precision_score (y_test, y_pred_test_proba, average = 'samples')) # Average Precision
metrics.append(log_loss(y_test,y_pred_test_proba)) # LogLoss
metrics = [round(num, 5) for num in metrics]
metrics.insert(0,technique_name)
metrics = pd.Series(metrics, index = performance_metrics_df.columns)
performance_metrics_df = performance_metrics_df.append(metrics,ignore_index=True)
# Confusion matrixes.
cm_train = confusion_matrix(y_train, y_pred_train, normalize = 'true')
cm_test = confusion_matrix(y_test, y_pred_test, normalize = 'true')
109
TRABAJO FIN DE MÁSTER
Joaquín García Abad
Comparativa de técnicas de balanceo de datos.
Máster en Análisis de Datos para la
Aplicación a un caso real para la predicción de fuga de
Inteligencia de los Negocios
clientes
[ 7. Anexos. ]
print(classifier_label +'_'+ alias + ' metrics extracted...')
fig = plt.figure(figsize=(12,10))
110
TRABAJO FIN DE MÁSTER
Joaquín García Abad
Comparativa de técnicas de balanceo de datos.
Máster en Análisis de Datos para la
Aplicación a un caso real para la predicción de fuga de
Inteligencia de los Negocios
clientes
[ 7. Anexos. ]
plt.xticks(np.arange(0., 1.1, step=0.1))
plt.xlabel("1-especificidad", fontsize=15)
plt.show()
fig = plt.figure(figsize=(12,10))
return performance_metrics_df
111