Descarga la aplicación para disfrutar aún más
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]))
Compartir