# 1) Normalización de datos usando el MinMaxScaler
from sklearn.preprocessing import MinMaxScaler
# Instanciamos el escalador de Min-Max
normalizacion_desafio = MinMaxScaler()
X_train_desafio_normalizado = normalizacion_desafio.fit_transform(X_train_desafio)
pd.DataFrame(X_train_desafio_normalizado)
# 2) KNN
from sklearn.neighbors import KNeighborsClassifier
knn_desafio = KNeighborsClassifier()
knn_desafio.fit(X_train_desafio_normalizado, y_train_desafio)
X_test_desafio_normalizado = normalizacion_desafio.transform(X_test_desafio)
knn_desafio.score(X_test_desafio_normalizado, y_test_desafio)
# Resultado: 0.8172
# 3) Seleccionar mejor modelo: Dummy, Árbol o KNN y almacenar modelo con mejor precisión
# Los modelos de transformación también necesitan ser almacenados, que es el caso del OneHotEncoder
# y del MinMaxScaler, en caso de que el KNN tenga el mejor rendimiento.
lista_desafio = [ ('dummy', dummy_desafio, X_test_desafio),
('de árbol', modelo_arbol_desafio, X_test_desafio),
('knn', knn_desafio, X_test_desafio_normalizado)]
for i in lista_desafio:
print(f'La exactitud del modelo {i[0]}: {i[1].score(i[2],y_test_desafio)}')
# Resultados:
# Dummy: 79.64%
# Árbol: 84.64%
# KNN: 81.72%
# Como el modelo de árbol tiene el mejor desempeño, será el modelo a serializar
# Serializamos el transformador one-hot
with open('modelo_onehotencoder_desafio.pkl','wb') as archivo:
pickle.dump(one_hot_desafio,archivo)
# Serializamos el modelo de árbol ganador
with open('modelo_champion_desafio.pkl','wb') as archivo:
pickle.dump(modelo_arbol_desafio,archivo)
# 4) Predicción de nuevo registro
# Creamos un nuevo ejemplo para hacer predicción
nuevo_registro = pd.DataFrame({
'score_credito': [850],
'pais':['Francia'],
'sexo_biologico':['Hombre'],
'edad': [27],
'años_de_cliente': [3],
'saldo': [56000],
'servicios_adquiridos': [1],
'tiene_tarjeta_credito': [1],
'miembro_activo': [1],
'salario_estimado': [85270.00]
})
# Convertimos el diccionario en un DataFrame
nuevo_registro = pd.DataFrame(nuevo_registro)
nuevo_registro
# Cargamos el one-hot encoder serializado
modelo_one_hot_desafio_generado = pd.read_pickle('/content/modelo_onehotencoder_desafio.pkl')
# Cargamos el modelo campeón serializado
modelo_arbol_desafio_generado = pd.read_pickle('/content/modelo_champion_desafio.pkl')
# Transformamos el nuevo dato con el mismo one-hot usado en entrenamiento
nuevo_registro = modelo_one_hot_desafio_generado.transform(nuevo_registro)
# Usamos el modelo serializado para predecir si el cliente se adherirá al plan
print((lambda r: "Con estas características, el modelo predice que el cliente SÍ se irá de la compañia."
if r[0] == 1 else "Con estas características, el modelo predice que el cliente NO se irá de la compañia.")(modelo_arbol_desafio_generado.predict(nuevo_registro)))