Logo Studenta

CLIENTES_BANCO

Esta es una vista previa del archivo. Inicie sesión para ver el archivo original

# -*- coding: utf-8 -*-
"""
Practica de clientes de banco.... 
a continuacion en la siguiente practica disenaremos una red neuronal capaz de predecir que clientes dejaran el banco
en funcion al comportamiento registrado, lugar de residencia, etc...
Autor:Eduardo Antonio Rodriguez Guerra
"""
#Importamos libreris
import numpy as np #libreria para ingresar datos en forma de arreglos 
#Esta es para meter los datos en forma de arreglos [s,2,d,s,d].....
#from numpy.np import np as np
from numpy import loadtxt as Load
#Las de tensorflow son lobrerias que nos permiten disenar las redes neuronales 
from tensorflow.keras.models import Sequential as Sequential
from tensorflow.keras.layers import Dense as Dense
#Esta libreria nos permite analizar los datos 
from sklearn.model_selection import train_test_split as Test
"""
Indicaciones de la tabla en excel
RowNumber-----> Numero de fila
CustomerId-----> Indentificacion de cliente
Surname----->	apellido 
CreditScore----->	puntuacion de credito
Geography----->	geografia
Gender----->	genero masculino o femenino
Age----->	 Edad
Tenure----->	anos que el cliente a durado en el banco
Balance----->	Balance
NumOfProducts----->	Numero de productos 
HasCrCard----->	 Posee tarjeta de credito 0+no y 1=si
IsActiveMember----->	Es miembro activo?? 0=no y 1=si
EstimatedSalary----->	Salario estuimado 
Exited-----> Permanecio si o NO...... 0=no, si=1
"""
# Cargamos el dataset
#Loadtxt es una funcion que me permite cargar datos de un archivo .csv a fin de manejarlos en forma de arreglo, pero ya que la tabla tiene en su interior datos del tipo string
#debemos especificar que se incluya dentro del arreglo dichos datos
dataset = Load(r'C:\Users\DELL 7280\Documents\LALO TEC LAGUNA\NOVENO SEMESTRE\Inteligencia artificial\Archivos de problema de diabetes\Churn_Modelling.csv', delimiter=',', dtype=str)
#Hasta ahora hemos visto que las redes neuronales requieren de entradas numericas para leer e interpretar los datos, por eso, luego de que en conjunto con un experto, o en su defecto de manera empirica
#Concluyamos que datos les seran utiles a la red neuronal para estimar el resultado, despues de eso, en este caso hay datos tipo string, como el nombre del pais y el genero, 
#tendremos que pasar a numericos
x_genero=dataset[1:10001,5] #seleccionamos la primera columna con categorias string, masculino o femenino y las pasamos a 1=masculino y 0=femenino
x_genero_num=np.where(x_genero=='Male',1,0)
#para paises
x_pais=dataset[1:10001,4]
x_pais_num=np.where(x_pais=='France',0,np.where(x_pais=='Germany',1,2))
#Basicamente usamos la funcion np.where para asignar un numero dependiendo de la categoria
#Ahora vemos que en el balance hay valores con una amplia diferencia, citando a cierta maestra de programacion "mi instinto salvaje" me dice que siempre y cuando tenga una cantidad decente en el banco, obvio no lo dejara 
x_balance=dataset[1:10001,8]
#Si el balance es mayor de 5000 entonces sera un 1 y si es menor sera un cero, ya que los numeros estaban en formatode texto, los converti a flotante para hacer la comparacion y al final obtuve un entero 1 o 0
x_balance_num=nueva_columna = np.where(x_balance.astype(float) > 5000.0, 1, 0)
#Lo que sigue es clasificar los salarios ya que tambien hay una gran brecha entre el mas grande y elmas chico, por ende lo clasificare en alto, bajo y medio
#ya que opino que la gente con un salario bajo tiene mayor tencencia a ser cliente del credito ofrecido por el banco al igual que la gente con buen salario tiene la tendencia de quedase y confiarle al banco su dinero
x_salario=dataset[1:10001,12] 
#Si gana poco aparece 0, si gana medio 1 y si gana mucho 2
x_salario_num=np.where(x_salario.astype(float)<10000.0 ,0,np.where(x_salario.astype(float)<100000.0 ,1,2))
#Ya por ultimo otro dato que considero importante son los puntos de credito que tiene cada uno en un sondeo rapido me percate que muy pocos exceden el 800 y la mayoria no baja del 500
x_creditopoints=dataset[1:10001,3]
x_creditopoints_num=np.where(x_creditopoints.astype(float)<500.0 ,0,np.where(x_creditopoints.astype(float)<700.0 ,1,2))
#Ahora juntamos las columnas que nos serviran como entradas
x_FULL=np.vstack((x_creditopoints_num, x_pais_num , x_genero_num,dataset[1:10001,6].astype(int),dataset[1:10001,7].astype(int),x_balance_num ,dataset[1:10001,9].astype(int),dataset[1:10001,10].astype(int),dataset[1:10001,11].astype(int),x_salario_num )).T
y=dataset[1:10001,13].astype(int)
#Preparamos los datos para el entrenamiento
x_FULL_train, x_FULL_test, y_train, y_test = Test(x_FULL, y, test_size=0.25, random_state=30)
#Parametros de la arquitectura 4 capas OCULTAS de 6 neuronas, y una capa de salida con una sola neurona
oculta1 = Dense(units=15, input_shape=[10])
oculta2 = Dense(units=15,activation="tanh")
oculta3 = Dense(units=15,activation="tanh")
oculta4 = Dense(units=15,activation="tanh")
salida = Dense(units=1, activation='sigmoid')
modelo = Sequential([oculta1, oculta2,oculta3,oculta4, salida])
# compile the keras model
modelo.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
# fit the keras model on the dataset
modelo.fit(x_FULL_train , y_train, epochs=150, batch_size=10,verbose=True)
#Si los resultados me agradaron guardar pesos
#COMO GUARDAR MODELOS NEURONALES
#libreria utilizada
from tensorflow.keras.models import save_model
#Guardamos en formato.h5, toda la informacion dentro de la variable modelo en este caso la estructura y los pesos de la red neuronal, luego del entremiento ideal para guardar buenos resultados
save_model(modelo, "pesos_CLIENTES_de_BANCO.h5")
# evaluate the keras model
_, accuracy = modelo.evaluate(x_FULL_train , y_train)
print('Accuracy: %.2f' % (accuracy*100))
#Ya por ultimo realizaremos las predicciones
predicciones = modelo.predict(x_FULL_test)
print(predicciones[0:10],max(predicciones),min(predicciones))
for i in range(10):
	print('%s => %d (expected %d)' % (x_FULL_test [i].tolist(), predicciones[i], y_test[i]))
predicciones = (modelo.predict(x_FULL_test) > 0.1).astype(int)
print(predicciones[0:10],max(predicciones),min(predicciones))
for i in range(10):
	print('%s => %d (expected %d)' % (x_FULL_test [i].tolist(), predicciones[i], y_test[i]))

Continuar navegando