A continuación muestro un ejemplo de Clasificación de Clientes para Identificar la Deserción de clientes lo que tambien se conoce como CHURN.
Estos ejemplos / casos / tareas son tomados del curso de Redes Neuronales Artificiales en los Negocios de la Maestria en Ciencia de Datos de la Universidad Ricardo Palma a cargo del Ing. Mirko Rodriguez.
Para este ejemplo usaremos:
- Red Neuronal con Keras y TensorFlow
- Tipo de Aprendizaje Supervisado
- Algoritmo de Aprendizaje Adam
Todo el código mostrado a continuación a sido probado en Google Colab sobre Python 3.X
Empezamos descargando la data en csv hosteado en fragote.com que utilizaremos:
%%bash
if [ ! -f "clientes_data.csv" ]; then
wget www.fragote.com/data/clientes_data.csv
fi
ls -l
Agregamos la funciones necesarias para poder hacer nuestro modelo predictivo / análisis:
# Funciones
import numpy as np
from sklearn.metrics import confusion_matrix
from sklearn.utils.multiclass import unique_labels
from sklearn.externals import joblib
import seaborn as sns
import matplotlib.pyplot as plt
def plot_confusion_matrix(y_true, y_pred,
normalize=False,
title=None):
"""
Esta función imprime y traza la matriz de confusión.
La normalización se puede aplicar configurando `normalize=True`.
"""
if not title:
if normalize:
title = 'Matriz de Confusión Normalizada'
else:
title = 'Matriz de Confusión sin Normalizar'
# Calculando la Matriz de Confusion
cm = confusion_matrix(y_true, y_pred)
# solo usar las etiquetas que se tienen en la data
classes = unique_labels(y_true, y_pred)
if normalize:
cm = cm.astype('float') / cm.sum(axis=1)[:, np.newaxis]
print("Matriz de Confusión Normalizada")
else:
print('Matriz de Confusión sin Normalizar')
print(cm)
fig, ax = plt.subplots()
im = ax.imshow(cm, interpolation='nearest', cmap=plt.cm.Blues)
ax.figure.colorbar(im, ax=ax)
ax.grid(linewidth=.0)
# Queremos mostrar todos los puntos...
ax.set(xticks=np.arange(cm.shape[1]),
yticks=np.arange(cm.shape[0]),
# ... etiquetando la lista de datos
xticklabels=classes, yticklabels=classes,
title=title,
ylabel='True label',
xlabel='Predicted label')
# rotando las etiquedas de los puntos.
plt.setp(ax.get_xticklabels(), rotation=45, ha="right",rotation_mode="anchor")
# Loop over data dimensions and create text annotations.
fmt = '.2f' if normalize else 'd'
thresh = cm.max() / 2.
for i in range(cm.shape[0]):
for j in range(cm.shape[1]):
ax.text(j, i, format(cm[i, j], fmt),
ha="center", va="center",
color="white" if cm[i, j] > thresh else "black")
fig.tight_layout()
plt.show()
return ax
def saveFile(object_to_save, scaler_filename):
joblib.dump(object_to_save, scaler_filename)
def loadFile(scaler_filename):
return joblib.load(scaler_filename)
def plotHistogram(dataset_final):
dataset_final.hist(figsize=(20,14), edgecolor="black", bins=40)
plt.show()
def plotCorrelations(dataset_final):
fig, ax = plt.subplots(figsize=(10,8)) # size in inches
g = sns.heatmap(dataset_final.corr(), annot=True, cmap="YlGnBu", ax=ax)
g.set_yticklabels(g.get_yticklabels(), rotation = 0)
g.set_xticklabels(g.get_xticklabels(), rotation = 45)
fig.tight_layout()
plt.show()
Preprocesando los datos del archivo csv:
# Importando librerías
import pandas as pd
import numpy as np
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
# Importando Datasets
dataset_csv = pd.read_csv('clientes_data.csv')
# Columnas de la data
print ("\nColumnas del DataSet: ")
print (dataset_csv.columns)
# Describir la data original
print ("\nDataset original:\n", dataset_csv.describe(include='all'))
# Dataset reducido
dataset = dataset_csv.iloc[:,3:14]
dataset_columns = dataset.columns
dataset_values = dataset.values
# Describir la data truncada
print ("\nDataset reducido: ")
print("\n",dataset.head())
# Revisamos los tipos de datos de las Columnas
print ("\nTipos de Columnas del Dataset: ")
print(dataset.dtypes)
Columnas del DataSet:
Index(['NumeroFila', 'DNI', 'Apellido', 'ScoreCrediticio', 'Pais', 'Genero',
'edad', 'Tenure', 'Balance', 'NumDeProducts', 'TieneTarjetaCredito',
'EsMiembroActivo', 'SalarioEstimado', 'Abandono'],
dtype='object')
Dataset original:
NumeroFila DNI ... SalarioEstimado Abandono
count 10000.00000 1.000000e+04 ... 10000.000000 10000.000000
unique NaN NaN ... NaN NaN
top NaN NaN ... NaN NaN
freq NaN NaN ... NaN NaN
mean 5000.50000 1.569094e+07 ... 100090.239881 0.203700
std 2886.89568 7.193619e+04 ... 57510.492818 0.402769
min 1.00000 1.556570e+07 ... 11.580000 0.000000
25% 2500.75000 1.562853e+07 ... 51002.110000 0.000000
50% 5000.50000 1.569074e+07 ... 100193.915000 0.000000
75% 7500.25000 1.575323e+07 ... 149388.247500 0.000000
max 10000.00000 1.581569e+07 ... 199992.480000 1.000000
[11 rows x 14 columns]
Dataset reducido:
ScoreCrediticio Pais Genero ... EsMiembroActivo SalarioEstimado Abandono
0 619 France Female ... 1 101348.88 1
1 608 Spain Female ... 1 112542.58 0
2 502 France Female ... 0 113931.57 1
3 699 France Female ... 0 93826.63 0
4 850 Spain Female ... 1 79084.10 0
[5 rows x 11 columns]
Tipos de Columnas del Dataset:
ScoreCrediticio int64
Pais object
Genero object
edad int64
Tenure int64
Balance float64
NumDeProducts int64
TieneTarjetaCredito int64
EsMiembroActivo int64
SalarioEstimado float64
Abandono int64
dtype: object
Codificamos las columnas de caracteres a números, Genero / Pais
#Codificando datos categóricos:
labelEncoder_X_1 = LabelEncoder()
dataset_values[:, 1] = labelEncoder_X_1.fit_transform(dataset_values[:, 1])
labelEncoder_X_2 = LabelEncoder()
dataset_values[:, 2] = labelEncoder_X_2.fit_transform(dataset_values[:, 2])
print ("\nDataset Categorizado: \n", dataset_values)
Dataset Categorizado:
[[619 0 0 ... 1 101348.88 1]
[608 2 0 ... 1 112542.58 0]
[502 0 0 ... 0 113931.57 1]
...
[709 0 0 ... 1 42085.58 1]
[772 1 1 ... 0 92888.52 1]
[792 0 0 ... 0 38190.78 0]]
Escalando y normalizando los features (StandardScaler: (x-u)/s): mean = 0 and standard deviation = 1
# Escalamiento/Normalización de Features (StandardScaler: (x-u)/s)
stdScaler = StandardScaler()
dataset_values[:,0:10] = stdScaler.fit_transform(dataset_values[:,0:10])
# Dataset final normalizado
dataset_final = pd.DataFrame(dataset_values,columns=dataset_columns, dtype = np.float64)
print("\nDataset Final:")
print(dataset_final.describe(include='all'))
print("\n", dataset_final.head())
Dataset Final:
ScoreCrediticio Pais ... SalarioEstimado Abandono
count 1.000000e+04 1.000000e+04 ... 1.000000e+04 10000.000000
mean -4.870326e-16 5.266676e-16 ... -1.580958e-17 0.203700
std 1.000050e+00 1.000050e+00 ... 1.000050e+00 0.402769
min -3.109504e+00 -9.018862e-01 ... -1.740268e+00 0.000000
25% -6.883586e-01 -9.018862e-01 ... -8.535935e-01 0.000000
50% 1.522218e-02 -9.018862e-01 ... 1.802807e-03 0.000000
75% 6.981094e-01 3.065906e-01 ... 8.572431e-01 0.000000
max 2.063884e+00 1.515067e+00 ... 1.737200e+00 1.000000
[8 rows x 11 columns]
ScoreCrediticio Pais ... SalarioEstimado Abandono
0 -0.326221 -0.901886 ... 0.021886 1.0
1 -0.440036 1.515067 ... 0.216534 0.0
2 -1.536794 -0.901886 ... 0.240687 1.0
3 0.501521 -0.901886 ... -0.108918 0.0
4 2.063884 1.515067 ... -0.365276 0.0
[5 rows x 11 columns]
Graficamos la Distribution de los datos y la matriz de Correlación:
# Distribuciones de la data y Correlaciones
print("\n Histogramas:")
plotHistogram(dataset_final)
print("\n Correlaciones:")
plotCorrelations(dataset_final)
Histogramas:
Correlaciones:
Dividiendo data en conjuntos de Entrenamiento y Prueba en 80% para entrenamientos y 20% para pruebas:
# Obteniendo valores a procesar
X = dataset_final.iloc[:, 0:10].values
y = dataset_final.iloc[:, 10].values
# Dividiendo el Dataset en sets de Training y Test
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0)
Despues que ya preparamos la data generamos la red neuronal:
# Importando Keras y Tensorflow
from keras.models import Sequential
from keras.layers import Dense
from keras.initializers import RandomUniform
# Inicializando la Red Neuronal
neural_network = Sequential()
# kernel_initializer Define la forma como se asignará los Pesos iniciales Wi
initial_weights = RandomUniform(minval = -0.5, maxval = 0.5)
# Agregado la Capa de entrada y la primera capa oculta
# 10 Neuronas en la capa de entrada y 8 Neuronas en la primera capa oculta
neural_network.add(Dense(units = 8, kernel_initializer = initial_weights, activation = 'relu', input_dim = 10))
# Agregando capa oculta
neural_network.add(Dense(units = 5, kernel_initializer = initial_weights, activation = 'relu'))
# Agregando capa oculta
neural_network.add(Dense(units = 4, kernel_initializer = initial_weights, activation = 'relu'))
# Agregando capa de salida
neural_network.add(Dense(units = 1, kernel_initializer = initial_weights, activation = 'sigmoid'))
Hemos generado una capa de entrada con 10 neuronas, 8 neuronas para la primera capa oculta, 5 neuronas para la segunda capa oculta, 4 para le tercera capa oculta y la capa de salida con 1 neurona.
Vemos la arquitectura de la red:
# Imprimir Arquitectura de la Red
neural_network.summary()
Model: "sequential_1"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_1 (Dense) (None, 8) 88
_________________________________________________________________
dense_2 (Dense) (None, 5) 45
_________________________________________________________________
dense_3 (Dense) (None, 4) 24
_________________________________________________________________
dense_4 (Dense) (None, 1) 5
=================================================================
Total params: 162
Trainable params: 162
Non-trainable params: 0
_________________________________________________________________
Compilando y Entrenando el modelo utilizando 100 epocas:
# Compilando la Red Neuronal
# optimizer: Algoritmo de optimización | binary_crossentropy = 2 Classes
# loss: error
neural_network.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# Entrenamiento
neural_network.fit(X_train, y_train, batch_size = 32, epochs = 100)
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1033: The name tf.assign_add is deprecated. Please use tf.compat.v1.assign_add instead.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:1020: The name tf.assign is deprecated. Please use tf.compat.v1.assign instead.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:3005: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.
Epoch 1/100
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:190: The name tf.get_default_session is deprecated. Please use tf.compat.v1.get_default_session instead.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:197: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:207: The name tf.global_variables is deprecated. Please use tf.compat.v1.global_variables instead.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:216: The name tf.is_variable_initialized is deprecated. Please use tf.compat.v1.is_variable_initialized instead.
WARNING:tensorflow:From /usr/local/lib/python3.6/dist-packages/keras/backend/tensorflow_backend.py:223: The name tf.variables_initializer is deprecated. Please use tf.compat.v1.variables_initializer instead.
8000/8000 [==============================] - 7s 832us/step - loss: 0.5679 - acc: 0.7696
Epoch 2/100
8000/8000 [==============================] - 1s 174us/step - loss: 0.4454 - acc: 0.8071
Epoch 3/100
8000/8000 [==============================] - 1s 173us/step - loss: 0.4205 - acc: 0.8233
Epoch 4/100
8000/8000 [==============================] - 1s 171us/step - loss: 0.4033 - acc: 0.8350
Epoch 5/100
8000/8000 [==============================] - 1s 180us/step - loss: 0.3872 - acc: 0.8442
Epoch 6/100
8000/8000 [==============================] - 1s 159us/step - loss: 0.3743 - acc: 0.8485
Epoch 7/100
8000/8000 [==============================] - 1s 162us/step - loss: 0.3659 - acc: 0.8480
Epoch 8/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3612 - acc: 0.8498
Epoch 9/100
8000/8000 [==============================] - 1s 162us/step - loss: 0.3585 - acc: 0.8520
Epoch 10/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3564 - acc: 0.8524
Epoch 11/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3548 - acc: 0.8538
Epoch 12/100
8000/8000 [==============================] - 1s 166us/step - loss: 0.3537 - acc: 0.8548
Epoch 13/100
8000/8000 [==============================] - 1s 173us/step - loss: 0.3531 - acc: 0.8533
Epoch 14/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3521 - acc: 0.8556
Epoch 15/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3513 - acc: 0.8536
Epoch 16/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3510 - acc: 0.8551
Epoch 17/100
8000/8000 [==============================] - 1s 160us/step - loss: 0.3497 - acc: 0.8561
Epoch 18/100
8000/8000 [==============================] - 1s 167us/step - loss: 0.3493 - acc: 0.8553
Epoch 19/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.3491 - acc: 0.8562
Epoch 20/100
8000/8000 [==============================] - 1s 154us/step - loss: 0.3477 - acc: 0.8559
Epoch 21/100
8000/8000 [==============================] - 1s 178us/step - loss: 0.3474 - acc: 0.8562
Epoch 22/100
8000/8000 [==============================] - 1s 181us/step - loss: 0.3461 - acc: 0.8580
Epoch 23/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3454 - acc: 0.8558
Epoch 24/100
8000/8000 [==============================] - 1s 167us/step - loss: 0.3444 - acc: 0.8569
Epoch 25/100
8000/8000 [==============================] - 1s 182us/step - loss: 0.3428 - acc: 0.8582
Epoch 26/100
8000/8000 [==============================] - 1s 180us/step - loss: 0.3425 - acc: 0.8574
Epoch 27/100
8000/8000 [==============================] - 2s 194us/step - loss: 0.3410 - acc: 0.8591
Epoch 28/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3403 - acc: 0.8600
Epoch 29/100
8000/8000 [==============================] - 1s 171us/step - loss: 0.3396 - acc: 0.8613
Epoch 30/100
8000/8000 [==============================] - 2s 192us/step - loss: 0.3385 - acc: 0.8611
Epoch 31/100
8000/8000 [==============================] - 1s 163us/step - loss: 0.3378 - acc: 0.8609
Epoch 32/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3371 - acc: 0.8611
Epoch 33/100
8000/8000 [==============================] - 1s 171us/step - loss: 0.3366 - acc: 0.8608
Epoch 34/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3361 - acc: 0.8618
Epoch 35/100
8000/8000 [==============================] - 1s 172us/step - loss: 0.3361 - acc: 0.8621
Epoch 36/100
8000/8000 [==============================] - 1s 174us/step - loss: 0.3360 - acc: 0.8626
Epoch 37/100
8000/8000 [==============================] - 1s 162us/step - loss: 0.3353 - acc: 0.8599
Epoch 38/100
8000/8000 [==============================] - 1s 159us/step - loss: 0.3354 - acc: 0.8629
Epoch 39/100
8000/8000 [==============================] - 1s 174us/step - loss: 0.3353 - acc: 0.8622
Epoch 40/100
8000/8000 [==============================] - 1s 156us/step - loss: 0.3345 - acc: 0.8619
Epoch 41/100
8000/8000 [==============================] - 1s 156us/step - loss: 0.3343 - acc: 0.8631
Epoch 42/100
8000/8000 [==============================] - 1s 169us/step - loss: 0.3348 - acc: 0.8619
Epoch 43/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.3340 - acc: 0.8606
Epoch 44/100
8000/8000 [==============================] - 1s 183us/step - loss: 0.3342 - acc: 0.8621
Epoch 45/100
8000/8000 [==============================] - 1s 172us/step - loss: 0.3335 - acc: 0.8631
Epoch 46/100
8000/8000 [==============================] - 1s 164us/step - loss: 0.3339 - acc: 0.8624
Epoch 47/100
8000/8000 [==============================] - 1s 166us/step - loss: 0.3333 - acc: 0.8630
Epoch 48/100
8000/8000 [==============================] - 1s 167us/step - loss: 0.3336 - acc: 0.8611
Epoch 49/100
8000/8000 [==============================] - 1s 164us/step - loss: 0.3331 - acc: 0.8630
Epoch 50/100
8000/8000 [==============================] - 1s 171us/step - loss: 0.3333 - acc: 0.8635
Epoch 51/100
8000/8000 [==============================] - 1s 162us/step - loss: 0.3331 - acc: 0.8629
Epoch 52/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3333 - acc: 0.8609
Epoch 53/100
8000/8000 [==============================] - 1s 171us/step - loss: 0.3327 - acc: 0.8625
Epoch 54/100
8000/8000 [==============================] - 1s 177us/step - loss: 0.3325 - acc: 0.8624
Epoch 55/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3327 - acc: 0.8624
Epoch 56/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3325 - acc: 0.8629
Epoch 57/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3330 - acc: 0.8619
Epoch 58/100
8000/8000 [==============================] - 1s 164us/step - loss: 0.3326 - acc: 0.8625
Epoch 59/100
8000/8000 [==============================] - 1s 170us/step - loss: 0.3327 - acc: 0.8624
Epoch 60/100
8000/8000 [==============================] - 1s 177us/step - loss: 0.3322 - acc: 0.8638
Epoch 61/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.3323 - acc: 0.8635
Epoch 62/100
8000/8000 [==============================] - 1s 182us/step - loss: 0.3318 - acc: 0.8618
Epoch 63/100
8000/8000 [==============================] - 1s 187us/step - loss: 0.3318 - acc: 0.8640
Epoch 64/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3315 - acc: 0.8640
Epoch 65/100
8000/8000 [==============================] - 1s 177us/step - loss: 0.3317 - acc: 0.8650
Epoch 66/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3318 - acc: 0.8625
Epoch 67/100
8000/8000 [==============================] - 1s 165us/step - loss: 0.3319 - acc: 0.8629
Epoch 68/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3317 - acc: 0.8631
Epoch 69/100
8000/8000 [==============================] - 1s 182us/step - loss: 0.3318 - acc: 0.8649
Epoch 70/100
8000/8000 [==============================] - 1s 169us/step - loss: 0.3316 - acc: 0.8634
Epoch 71/100
8000/8000 [==============================] - 1s 179us/step - loss: 0.3313 - acc: 0.8636
Epoch 72/100
8000/8000 [==============================] - 1s 159us/step - loss: 0.3317 - acc: 0.8642
Epoch 73/100
8000/8000 [==============================] - 1s 173us/step - loss: 0.3310 - acc: 0.8626
Epoch 74/100
8000/8000 [==============================] - 1s 172us/step - loss: 0.3317 - acc: 0.8650
Epoch 75/100
8000/8000 [==============================] - 1s 184us/step - loss: 0.3320 - acc: 0.8629
Epoch 76/100
8000/8000 [==============================] - 1s 180us/step - loss: 0.3315 - acc: 0.8644
Epoch 77/100
8000/8000 [==============================] - 1s 163us/step - loss: 0.3313 - acc: 0.8636
Epoch 78/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3316 - acc: 0.8635
Epoch 79/100
8000/8000 [==============================] - 1s 156us/step - loss: 0.3315 - acc: 0.8639
Epoch 80/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3311 - acc: 0.8625
Epoch 81/100
8000/8000 [==============================] - 1s 179us/step - loss: 0.3310 - acc: 0.8638
Epoch 82/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3308 - acc: 0.8638
Epoch 83/100
8000/8000 [==============================] - 1s 164us/step - loss: 0.3310 - acc: 0.8645
Epoch 84/100
8000/8000 [==============================] - 1s 166us/step - loss: 0.3307 - acc: 0.8645
Epoch 85/100
8000/8000 [==============================] - 1s 164us/step - loss: 0.3307 - acc: 0.8626
Epoch 86/100
8000/8000 [==============================] - 1s 153us/step - loss: 0.3304 - acc: 0.8624
Epoch 87/100
8000/8000 [==============================] - 1s 165us/step - loss: 0.3308 - acc: 0.8658
Epoch 88/100
8000/8000 [==============================] - 1s 182us/step - loss: 0.3306 - acc: 0.8651
Epoch 89/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3305 - acc: 0.8645
Epoch 90/100
8000/8000 [==============================] - 1s 156us/step - loss: 0.3300 - acc: 0.8650
Epoch 91/100
8000/8000 [==============================] - 1s 156us/step - loss: 0.3308 - acc: 0.8640
Epoch 92/100
8000/8000 [==============================] - 1s 177us/step - loss: 0.3305 - acc: 0.8634
Epoch 93/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.3304 - acc: 0.8647
Epoch 94/100
8000/8000 [==============================] - 2s 192us/step - loss: 0.3301 - acc: 0.8647
Epoch 95/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3302 - acc: 0.8634
Epoch 96/100
8000/8000 [==============================] - 1s 178us/step - loss: 0.3307 - acc: 0.8644
Epoch 97/100
8000/8000 [==============================] - 1s 160us/step - loss: 0.3306 - acc: 0.8636
Epoch 98/100
8000/8000 [==============================] - 1s 169us/step - loss: 0.3308 - acc: 0.8635
Epoch 99/100
8000/8000 [==============================] - 1s 173us/step - loss: 0.3303 - acc: 0.8632
Epoch 100/100
8000/8000 [==============================] - 1s 156us/step - loss: 0.3299 - acc: 0.8640
<keras.callbacks.History at 0x7f4c83f1f5c0>
Después de las 100 épocas se puede observar que el modelo tiene un Accuracy de 86.4%
Hacemos la predicción con nuestros 50 primeros datos de prueba tomando a los mayores de 0.5 como abandono y a los menores o iguales como no abandono.
# Haciendo predicción de los resultados del Test
y_pred = neural_network.predict(X_test)
y_pred_norm = (y_pred > 0.5)
y_pred_norm = y_pred_norm.astype(int)
y_test = y_test.astype(int)
# 50 primeros resultados a comparar
print("\nPredicciones (50 primeros):")
print("\n\tReal", "\t", "Predicción(N)","\t", "Predicción(O)")
for i in range(50):
print(i, '\t', y_test[i], '\t ', y_pred_norm[i], '\t \t', y_pred[i])
Predicciones (50 primeros):
Real Predicción(N) Predicción(O)
0 0 [0] [0.25591797]
1 1 [0] [0.31653506]
2 0 [0] [0.16617256]
3 0 [0] [0.07125753]
4 0 [0] [0.06709316]
5 1 [1] [0.9561175]
6 0 [0] [0.01982319]
7 0 [0] [0.0801284]
8 1 [0] [0.16028535]
9 1 [1] [0.76239324]
10 0 [0] [0.03265542]
11 0 [0] [0.21288738]
12 0 [0] [0.29622465]
13 0 [0] [0.28117135]
14 1 [1] [0.6112473]
15 1 [0] [0.3089583]
16 0 [0] [0.08254933]
17 0 [0] [0.07191664]
18 0 [0] [0.08332911]
19 0 [0] [0.10069495]
20 0 [1] [0.5985567]
21 0 [0] [0.00851977]
22 0 [0] [0.04273018]
23 0 [0] [0.0951266]
24 0 [0] [0.00786319]
25 0 [0] [0.16710573]
26 0 [0] [0.12770015]
27 0 [0] [0.03628084]
28 0 [0] [0.35433203]
29 0 [0] [0.35582292]
30 0 [0] [0.02590874]
31 1 [0] [0.4530319]
32 0 [0] [0.10775042]
33 0 [0] [0.02804729]
34 0 [0] [0.32664955]
35 0 [0] [0.02045524]
36 0 [0] [0.01842964]
37 0 [0] [0.02650151]
38 0 [0] [0.02766502]
39 0 [0] [0.1354188]
40 0 [0] [0.12443781]
41 1 [0] [0.42804298]
42 1 [0] [0.46373382]
43 0 [0] [0.04600218]
44 0 [1] [0.6296924]
45 0 [0] [0.05090821]
46 0 [0] [0.3721879]
47 0 [0] [0.12022552]
48 0 [1] [0.5840349]
49 0 [0] [0.00435194]
Aplicando la Matriz de Confusión:
# Aplicando la Matriz de Confusión
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred_norm)
print ("\nMatriz de Confusión: \n", cm)
Matriz de Confusión:
[[1499 96]
[ 196 209]]
Graficando la Matriz de Confusión:
plot_confusion_matrix(y_test, y_pred_norm, normalize=False,title="Matriz de Confusión: Abandono de clientes")
Matriz de Confusión sin Normalizar
[[1499 96]
[ 196 209]]
Agregamos una nueva arquitectura:
Entrada => 10
Oculta => 8/4
Salida => 1
# Inicializando la Red Neuronal
neural_network2 = Sequential()
# kernel_initializer Define la forma como se asignará los Pesos iniciales Wi
initial_weights = RandomUniform(minval = -0.5, maxval = 0.5)
neural_network2.add(Dense(units = 8, kernel_initializer = initial_weights, activation = 'relu', input_dim = 10))
neural_network2.add(Dense(units = 4, kernel_initializer = initial_weights, activation = 'relu'))
# Agregando capa de salida
neural_network2.add(Dense(units = 1, kernel_initializer = initial_weights, activation = 'sigmoid'))
# Imprimir Arquitectura de la Red
neural_network2.summary()
Model: "sequential_2"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_5 (Dense) (None, 8) 88
_________________________________________________________________
dense_6 (Dense) (None, 4) 36
_________________________________________________________________
dense_7 (Dense) (None, 1) 5
=================================================================
Total params: 129
Trainable params: 129
Non-trainable params: 0
_________________________________________________________________
Entrenando la El Modelo 2
# Compilando la Red Neuronal
# optimizer: Algoritmo de optimización | binary_crossentropy = 2 Classes
# loss: error
neural_network2.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# Entrenamiento
neural_network2.fit(X_train, y_train, batch_size = 32, epochs = 100)
Epoch 1/100
8000/8000 [==============================] - 2s 208us/step - loss: 0.6309 - acc: 0.7251
Epoch 2/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.4994 - acc: 0.7960
Epoch 3/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.4579 - acc: 0.7962
Epoch 4/100
8000/8000 [==============================] - 1s 173us/step - loss: 0.4301 - acc: 0.8054
Epoch 5/100
8000/8000 [==============================] - 1s 152us/step - loss: 0.4111 - acc: 0.8207
Epoch 6/100
8000/8000 [==============================] - 1s 142us/step - loss: 0.3908 - acc: 0.8379
Epoch 7/100
8000/8000 [==============================] - 1s 145us/step - loss: 0.3766 - acc: 0.8441
Epoch 8/100
8000/8000 [==============================] - 1s 163us/step - loss: 0.3682 - acc: 0.8490
Epoch 9/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3637 - acc: 0.8508
Epoch 10/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3604 - acc: 0.8521
Epoch 11/100
8000/8000 [==============================] - 1s 167us/step - loss: 0.3585 - acc: 0.8535
Epoch 12/100
8000/8000 [==============================] - 1s 145us/step - loss: 0.3569 - acc: 0.8544
Epoch 13/100
8000/8000 [==============================] - 1s 158us/step - loss: 0.3557 - acc: 0.8538
Epoch 14/100
8000/8000 [==============================] - 1s 145us/step - loss: 0.3547 - acc: 0.8556
Epoch 15/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3541 - acc: 0.8555
Epoch 16/100
8000/8000 [==============================] - 1s 171us/step - loss: 0.3533 - acc: 0.8568
Epoch 17/100
8000/8000 [==============================] - 1s 173us/step - loss: 0.3527 - acc: 0.8568
Epoch 18/100
8000/8000 [==============================] - 1s 167us/step - loss: 0.3519 - acc: 0.8576
Epoch 19/100
8000/8000 [==============================] - 1s 146us/step - loss: 0.3516 - acc: 0.8581
Epoch 20/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.3509 - acc: 0.8584
Epoch 21/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.3508 - acc: 0.8575
Epoch 22/100
8000/8000 [==============================] - 1s 160us/step - loss: 0.3502 - acc: 0.8586
Epoch 23/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.3500 - acc: 0.8585
Epoch 24/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.3497 - acc: 0.8579
Epoch 25/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3493 - acc: 0.8591
Epoch 26/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.3486 - acc: 0.8569
Epoch 27/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.3489 - acc: 0.8579
Epoch 28/100
8000/8000 [==============================] - 1s 158us/step - loss: 0.3486 - acc: 0.8595
Epoch 29/100
8000/8000 [==============================] - 1s 163us/step - loss: 0.3483 - acc: 0.8582
Epoch 30/100
8000/8000 [==============================] - 1s 152us/step - loss: 0.3484 - acc: 0.8575
Epoch 31/100
8000/8000 [==============================] - 1s 145us/step - loss: 0.3476 - acc: 0.8590
Epoch 32/100
8000/8000 [==============================] - 1s 148us/step - loss: 0.3478 - acc: 0.8585
Epoch 33/100
8000/8000 [==============================] - 1s 150us/step - loss: 0.3474 - acc: 0.8578
Epoch 34/100
8000/8000 [==============================] - 1s 158us/step - loss: 0.3472 - acc: 0.8592
Epoch 35/100
8000/8000 [==============================] - 1s 148us/step - loss: 0.3468 - acc: 0.8595
Epoch 36/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3467 - acc: 0.8585
Epoch 37/100
8000/8000 [==============================] - 1s 159us/step - loss: 0.3467 - acc: 0.8590
Epoch 38/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.3462 - acc: 0.8579
Epoch 39/100
8000/8000 [==============================] - 1s 159us/step - loss: 0.3462 - acc: 0.8586
Epoch 40/100
8000/8000 [==============================] - 1s 172us/step - loss: 0.3458 - acc: 0.8587
Epoch 41/100
8000/8000 [==============================] - 1s 154us/step - loss: 0.3458 - acc: 0.8598
Epoch 42/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3462 - acc: 0.8587
Epoch 43/100
8000/8000 [==============================] - 1s 162us/step - loss: 0.3454 - acc: 0.8578
Epoch 44/100
8000/8000 [==============================] - 1s 156us/step - loss: 0.3455 - acc: 0.8581
Epoch 45/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.3452 - acc: 0.8582
Epoch 46/100
8000/8000 [==============================] - 1s 160us/step - loss: 0.3454 - acc: 0.8579
Epoch 47/100
8000/8000 [==============================] - 1s 153us/step - loss: 0.3453 - acc: 0.8584
Epoch 48/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3452 - acc: 0.8587
Epoch 49/100
8000/8000 [==============================] - 1s 154us/step - loss: 0.3450 - acc: 0.8582
Epoch 50/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3447 - acc: 0.8591
Epoch 51/100
8000/8000 [==============================] - 1s 153us/step - loss: 0.3448 - acc: 0.8586
Epoch 52/100
8000/8000 [==============================] - 1s 156us/step - loss: 0.3445 - acc: 0.8596
Epoch 53/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.3443 - acc: 0.8579
Epoch 54/100
8000/8000 [==============================] - 1s 147us/step - loss: 0.3441 - acc: 0.8586
Epoch 55/100
8000/8000 [==============================] - 1s 148us/step - loss: 0.3439 - acc: 0.8590
Epoch 56/100
8000/8000 [==============================] - 1s 148us/step - loss: 0.3436 - acc: 0.8608
Epoch 57/100
8000/8000 [==============================] - 1s 160us/step - loss: 0.3439 - acc: 0.8596
Epoch 58/100
8000/8000 [==============================] - 1s 154us/step - loss: 0.3435 - acc: 0.8591
Epoch 59/100
8000/8000 [==============================] - 1s 159us/step - loss: 0.3433 - acc: 0.8594
Epoch 60/100
8000/8000 [==============================] - 1s 148us/step - loss: 0.3426 - acc: 0.8603
Epoch 61/100
8000/8000 [==============================] - 1s 148us/step - loss: 0.3429 - acc: 0.8595
Epoch 62/100
8000/8000 [==============================] - 1s 151us/step - loss: 0.3427 - acc: 0.8609
Epoch 63/100
8000/8000 [==============================] - 1s 145us/step - loss: 0.3426 - acc: 0.8606
Epoch 64/100
8000/8000 [==============================] - 1s 151us/step - loss: 0.3424 - acc: 0.8608
Epoch 65/100
8000/8000 [==============================] - 1s 151us/step - loss: 0.3420 - acc: 0.8608
Epoch 66/100
8000/8000 [==============================] - 1s 163us/step - loss: 0.3423 - acc: 0.8610
Epoch 67/100
8000/8000 [==============================] - 1s 153us/step - loss: 0.3417 - acc: 0.8598
Epoch 68/100
8000/8000 [==============================] - 1s 165us/step - loss: 0.3418 - acc: 0.8621
Epoch 69/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.3416 - acc: 0.8603
Epoch 70/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.3414 - acc: 0.8614
Epoch 71/100
8000/8000 [==============================] - 1s 150us/step - loss: 0.3413 - acc: 0.8619
Epoch 72/100
8000/8000 [==============================] - 1s 166us/step - loss: 0.3408 - acc: 0.8609
Epoch 73/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3411 - acc: 0.8625
Epoch 74/100
8000/8000 [==============================] - 1s 165us/step - loss: 0.3409 - acc: 0.8600
Epoch 75/100
8000/8000 [==============================] - 1s 141us/step - loss: 0.3405 - acc: 0.8604
Epoch 76/100
8000/8000 [==============================] - 1s 165us/step - loss: 0.3406 - acc: 0.8605
Epoch 77/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3405 - acc: 0.8616
Epoch 78/100
8000/8000 [==============================] - 1s 163us/step - loss: 0.3404 - acc: 0.8608
Epoch 79/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.3399 - acc: 0.8618
Epoch 80/100
8000/8000 [==============================] - 1s 172us/step - loss: 0.3400 - acc: 0.8606
Epoch 81/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3399 - acc: 0.8600
Epoch 82/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3399 - acc: 0.8598
Epoch 83/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.3397 - acc: 0.8604
Epoch 84/100
8000/8000 [==============================] - 1s 164us/step - loss: 0.3397 - acc: 0.8613
Epoch 85/100
8000/8000 [==============================] - 1s 166us/step - loss: 0.3394 - acc: 0.8616
Epoch 86/100
8000/8000 [==============================] - 1s 155us/step - loss: 0.3393 - acc: 0.8598
Epoch 87/100
8000/8000 [==============================] - 1s 153us/step - loss: 0.3394 - acc: 0.8611
Epoch 88/100
8000/8000 [==============================] - 1s 159us/step - loss: 0.3393 - acc: 0.8613
Epoch 89/100
8000/8000 [==============================] - 1s 153us/step - loss: 0.3392 - acc: 0.8604
Epoch 90/100
8000/8000 [==============================] - 1s 160us/step - loss: 0.3392 - acc: 0.8606
Epoch 91/100
8000/8000 [==============================] - 1s 153us/step - loss: 0.3391 - acc: 0.8608
Epoch 92/100
8000/8000 [==============================] - 1s 165us/step - loss: 0.3391 - acc: 0.8595
Epoch 93/100
8000/8000 [==============================] - 1s 158us/step - loss: 0.3389 - acc: 0.8619
Epoch 94/100
8000/8000 [==============================] - 1s 144us/step - loss: 0.3392 - acc: 0.8611
Epoch 95/100
8000/8000 [==============================] - 1s 145us/step - loss: 0.3392 - acc: 0.8601
Epoch 96/100
8000/8000 [==============================] - 1s 143us/step - loss: 0.3388 - acc: 0.8596
Epoch 97/100
8000/8000 [==============================] - 1s 146us/step - loss: 0.3390 - acc: 0.8615
Epoch 98/100
8000/8000 [==============================] - 1s 145us/step - loss: 0.3389 - acc: 0.8614
Epoch 99/100
8000/8000 [==============================] - 1s 151us/step - loss: 0.3387 - acc: 0.8592
Epoch 100/100
8000/8000 [==============================] - 1s 162us/step - loss: 0.3386 - acc: 0.8608
<keras.callbacks.History at 0x7f4c84735860>
Como podemos ver después de 100 épocas con la nueva arquitectura tenemos 86% de accuracy.
Revisamos la matriz de confusión:
# Haciendo predicción de los resultados del Test
y_pred = neural_network2.predict(X_test)
y_pred_norm = (y_pred > 0.5)
y_pred_norm = y_pred_norm.astype(int)
y_test = y_test.astype(int)
plot_confusion_matrix(y_test, y_pred_norm, normalize=False,title="Matriz de Confusión: Abandono de clientes")
Matriz de Confusión sin Normalizar
[[1520 75]
[ 206 199]]
Agregamos una nueva arquitectura:
Entrada => 10
Oculta => 9/7/5
Salida => 1
# Inicializando la Red Neuronal
neural_network3 = Sequential()
# kernel_initializer Define la forma como se asignará los Pesos iniciales Wi
initial_weights = RandomUniform(minval = -0.5, maxval = 0.5)
neural_network3.add(Dense(units = 9, kernel_initializer = initial_weights, activation = 'relu', input_dim = 10))
neural_network3.add(Dense(units = 7, kernel_initializer = initial_weights, activation = 'relu'))
neural_network3.add(Dense(units = 5, kernel_initializer = initial_weights, activation = 'relu'))
# Agregando capa de salida
neural_network3.add(Dense(units = 1, kernel_initializer = initial_weights, activation = 'sigmoid'))
# Imprimir Arquitectura de la Red
neural_network3.summary()
Model: "sequential_3"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
dense_8 (Dense) (None, 9) 99
_________________________________________________________________
dense_9 (Dense) (None, 7) 70
_________________________________________________________________
dense_10 (Dense) (None, 5) 40
_________________________________________________________________
dense_11 (Dense) (None, 1) 6
=================================================================
Total params: 215
Trainable params: 215
Non-trainable params: 0
_________________________________________________________________
# Compilando la Red Neuronal
# optimizer: Algoritmo de optimización | binary_crossentropy = 2 Classes
# loss: error
neural_network3.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
# Entrenamiento
neural_network3.fit(X_train, y_train, batch_size = 32, epochs = 100)
Epoch 1/100
8000/8000 [==============================] - 2s 216us/step - loss: 0.5574 - acc: 0.7860
Epoch 2/100
8000/8000 [==============================] - 1s 174us/step - loss: 0.4544 - acc: 0.7969
Epoch 3/100
8000/8000 [==============================] - 1s 160us/step - loss: 0.4302 - acc: 0.8099
Epoch 4/100
8000/8000 [==============================] - 1s 183us/step - loss: 0.4141 - acc: 0.8233
Epoch 5/100
8000/8000 [==============================] - 1s 170us/step - loss: 0.3949 - acc: 0.8340
Epoch 6/100
8000/8000 [==============================] - 1s 183us/step - loss: 0.3783 - acc: 0.8467
Epoch 7/100
8000/8000 [==============================] - 1s 187us/step - loss: 0.3683 - acc: 0.8530
Epoch 8/100
8000/8000 [==============================] - 2s 190us/step - loss: 0.3644 - acc: 0.8540
Epoch 9/100
8000/8000 [==============================] - 1s 174us/step - loss: 0.3611 - acc: 0.8561
Epoch 10/100
8000/8000 [==============================] - 1s 166us/step - loss: 0.3602 - acc: 0.8553
Epoch 11/100
8000/8000 [==============================] - 1s 169us/step - loss: 0.3586 - acc: 0.8560
Epoch 12/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3570 - acc: 0.8566
Epoch 13/100
8000/8000 [==============================] - 1s 172us/step - loss: 0.3565 - acc: 0.8558
Epoch 14/100
8000/8000 [==============================] - 2s 189us/step - loss: 0.3553 - acc: 0.8562
Epoch 15/100
8000/8000 [==============================] - 1s 180us/step - loss: 0.3549 - acc: 0.8551
Epoch 16/100
8000/8000 [==============================] - 1s 174us/step - loss: 0.3536 - acc: 0.8561
Epoch 17/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3533 - acc: 0.8562
Epoch 18/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3523 - acc: 0.8560
Epoch 19/100
8000/8000 [==============================] - 1s 169us/step - loss: 0.3511 - acc: 0.8568
Epoch 20/100
8000/8000 [==============================] - 1s 171us/step - loss: 0.3512 - acc: 0.8566
Epoch 21/100
8000/8000 [==============================] - 1s 170us/step - loss: 0.3509 - acc: 0.8584
Epoch 22/100
8000/8000 [==============================] - 2s 188us/step - loss: 0.3497 - acc: 0.8572
Epoch 23/100
8000/8000 [==============================] - 1s 181us/step - loss: 0.3487 - acc: 0.8570
Epoch 24/100
8000/8000 [==============================] - 1s 177us/step - loss: 0.3490 - acc: 0.8572
Epoch 25/100
8000/8000 [==============================] - 1s 180us/step - loss: 0.3484 - acc: 0.8572
Epoch 26/100
8000/8000 [==============================] - 1s 172us/step - loss: 0.3477 - acc: 0.8589
Epoch 27/100
8000/8000 [==============================] - 1s 162us/step - loss: 0.3467 - acc: 0.8570
Epoch 28/100
8000/8000 [==============================] - 1s 184us/step - loss: 0.3466 - acc: 0.8578
Epoch 29/100
8000/8000 [==============================] - 1s 165us/step - loss: 0.3462 - acc: 0.8584
Epoch 30/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.3459 - acc: 0.8576
Epoch 31/100
8000/8000 [==============================] - 1s 178us/step - loss: 0.3457 - acc: 0.8571
Epoch 32/100
8000/8000 [==============================] - 2s 193us/step - loss: 0.3450 - acc: 0.8589
Epoch 33/100
8000/8000 [==============================] - 1s 181us/step - loss: 0.3440 - acc: 0.8581
Epoch 34/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3438 - acc: 0.8585
Epoch 35/100
8000/8000 [==============================] - 1s 187us/step - loss: 0.3437 - acc: 0.8600
Epoch 36/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3431 - acc: 0.8580
Epoch 37/100
8000/8000 [==============================] - 1s 172us/step - loss: 0.3425 - acc: 0.8589
Epoch 38/100
8000/8000 [==============================] - 1s 166us/step - loss: 0.3419 - acc: 0.8596
Epoch 39/100
8000/8000 [==============================] - 1s 174us/step - loss: 0.3416 - acc: 0.8585
Epoch 40/100
8000/8000 [==============================] - 1s 162us/step - loss: 0.3410 - acc: 0.8596
Epoch 41/100
8000/8000 [==============================] - 1s 166us/step - loss: 0.3407 - acc: 0.8601
Epoch 42/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3410 - acc: 0.8589
Epoch 43/100
8000/8000 [==============================] - 1s 182us/step - loss: 0.3401 - acc: 0.8595
Epoch 44/100
8000/8000 [==============================] - 1s 178us/step - loss: 0.3396 - acc: 0.8596
Epoch 45/100
8000/8000 [==============================] - 1s 183us/step - loss: 0.3393 - acc: 0.8586
Epoch 46/100
8000/8000 [==============================] - 2s 192us/step - loss: 0.3388 - acc: 0.8613
Epoch 47/100
8000/8000 [==============================] - 1s 171us/step - loss: 0.3388 - acc: 0.8600
Epoch 48/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3381 - acc: 0.8606
Epoch 49/100
8000/8000 [==============================] - 1s 169us/step - loss: 0.3378 - acc: 0.8621
Epoch 50/100
8000/8000 [==============================] - 1s 180us/step - loss: 0.3374 - acc: 0.8610
Epoch 51/100
8000/8000 [==============================] - 1s 159us/step - loss: 0.3378 - acc: 0.8616
Epoch 52/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3367 - acc: 0.8619
Epoch 53/100
8000/8000 [==============================] - 1s 167us/step - loss: 0.3367 - acc: 0.8622
Epoch 54/100
8000/8000 [==============================] - 1s 184us/step - loss: 0.3361 - acc: 0.8624
Epoch 55/100
8000/8000 [==============================] - 1s 177us/step - loss: 0.3351 - acc: 0.8611
Epoch 56/100
8000/8000 [==============================] - 1s 187us/step - loss: 0.3355 - acc: 0.8625
Epoch 57/100
8000/8000 [==============================] - 1s 186us/step - loss: 0.3348 - acc: 0.8610
Epoch 58/100
8000/8000 [==============================] - 1s 165us/step - loss: 0.3348 - acc: 0.8626
Epoch 59/100
8000/8000 [==============================] - 1s 184us/step - loss: 0.3349 - acc: 0.8630
Epoch 60/100
8000/8000 [==============================] - 1s 174us/step - loss: 0.3346 - acc: 0.8625
Epoch 61/100
8000/8000 [==============================] - 2s 188us/step - loss: 0.3347 - acc: 0.8604
Epoch 62/100
8000/8000 [==============================] - 1s 180us/step - loss: 0.3344 - acc: 0.8634
Epoch 63/100
8000/8000 [==============================] - 1s 182us/step - loss: 0.3340 - acc: 0.8629
Epoch 64/100
8000/8000 [==============================] - 1s 172us/step - loss: 0.3335 - acc: 0.8632
Epoch 65/100
8000/8000 [==============================] - 1s 177us/step - loss: 0.3340 - acc: 0.8631
Epoch 66/100
8000/8000 [==============================] - 2s 199us/step - loss: 0.3333 - acc: 0.8620
Epoch 67/100
8000/8000 [==============================] - 1s 185us/step - loss: 0.3331 - acc: 0.8631
Epoch 68/100
8000/8000 [==============================] - 1s 179us/step - loss: 0.3325 - acc: 0.8636
Epoch 69/100
8000/8000 [==============================] - 1s 185us/step - loss: 0.3325 - acc: 0.8628
Epoch 70/100
8000/8000 [==============================] - 2s 189us/step - loss: 0.3325 - acc: 0.8635
Epoch 71/100
8000/8000 [==============================] - 1s 182us/step - loss: 0.3322 - acc: 0.8626
Epoch 72/100
8000/8000 [==============================] - 1s 182us/step - loss: 0.3323 - acc: 0.8645
Epoch 73/100
8000/8000 [==============================] - 1s 179us/step - loss: 0.3325 - acc: 0.8638
Epoch 74/100
8000/8000 [==============================] - 1s 179us/step - loss: 0.3321 - acc: 0.8642
Epoch 75/100
8000/8000 [==============================] - 1s 185us/step - loss: 0.3320 - acc: 0.8620
Epoch 76/100
8000/8000 [==============================] - 1s 181us/step - loss: 0.3318 - acc: 0.8625
Epoch 77/100
8000/8000 [==============================] - 2s 188us/step - loss: 0.3316 - acc: 0.8641
Epoch 78/100
8000/8000 [==============================] - 1s 171us/step - loss: 0.3319 - acc: 0.8639
Epoch 79/100
8000/8000 [==============================] - 1s 163us/step - loss: 0.3320 - acc: 0.8642
Epoch 80/100
8000/8000 [==============================] - 1s 170us/step - loss: 0.3314 - acc: 0.8631
Epoch 81/100
8000/8000 [==============================] - 1s 180us/step - loss: 0.3313 - acc: 0.8618
Epoch 82/100
8000/8000 [==============================] - 1s 176us/step - loss: 0.3317 - acc: 0.8635
Epoch 83/100
8000/8000 [==============================] - 1s 161us/step - loss: 0.3315 - acc: 0.8644
Epoch 84/100
8000/8000 [==============================] - 1s 181us/step - loss: 0.3315 - acc: 0.8635
Epoch 85/100
8000/8000 [==============================] - 1s 171us/step - loss: 0.3311 - acc: 0.8642
Epoch 86/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3307 - acc: 0.8644
Epoch 87/100
8000/8000 [==============================] - 1s 177us/step - loss: 0.3316 - acc: 0.8644
Epoch 88/100
8000/8000 [==============================] - 1s 179us/step - loss: 0.3309 - acc: 0.8656
Epoch 89/100
8000/8000 [==============================] - 1s 175us/step - loss: 0.3312 - acc: 0.8632
Epoch 90/100
8000/8000 [==============================] - 1s 156us/step - loss: 0.3309 - acc: 0.8639
Epoch 91/100
8000/8000 [==============================] - 1s 185us/step - loss: 0.3308 - acc: 0.8638
Epoch 92/100
8000/8000 [==============================] - 1s 160us/step - loss: 0.3310 - acc: 0.8641
Epoch 93/100
8000/8000 [==============================] - 1s 164us/step - loss: 0.3302 - acc: 0.8638
Epoch 94/100
8000/8000 [==============================] - 1s 182us/step - loss: 0.3312 - acc: 0.8639
Epoch 95/100
8000/8000 [==============================] - 1s 178us/step - loss: 0.3305 - acc: 0.8651
Epoch 96/100
8000/8000 [==============================] - 1s 183us/step - loss: 0.3311 - acc: 0.8644
Epoch 97/100
8000/8000 [==============================] - 1s 169us/step - loss: 0.3303 - acc: 0.8640
Epoch 98/100
8000/8000 [==============================] - 1s 165us/step - loss: 0.3307 - acc: 0.8631
Epoch 99/100
8000/8000 [==============================] - 1s 157us/step - loss: 0.3306 - acc: 0.8645
Epoch 100/100
8000/8000 [==============================] - 1s 168us/step - loss: 0.3307 - acc: 0.8638
<keras.callbacks.History at 0x7f4c84823a20>
Se puede observar que se obtiene un acccuracy de 86.3%
# Haciendo predicción de los resultados del Test
y_pred = neural_network3.predict(X_test)
y_pred_norm = (y_pred > 0.5)
y_pred_norm = y_pred_norm.astype(int)
y_test = y_test.astype(int)
plot_confusion_matrix(y_test, y_pred_norm, normalize=False,title="Matriz de Confusión: Abandono de clientes")
Matriz de Confusión sin Normalizar
[[1526 69]
[ 214 191]]