Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
Ya estoy inscrito ¿Todavía no tienes acceso? Nuestros Planes
1
respuesta

08 Desafío: hora de la práctica

  1. La normalización de datos es una tarea importante para mantener todos los valores numéricos en una misma escala y garantizar que todas las características tengan el mismo impacto en el modelo. En esta tarea, realiza la normalización de la base de datos usando el MinMaxScaler.

  2. Con los datos normalizados, podemos utilizar el modelo KNN, que hace cálculos de distancia para encontrar los vecinos más cercanos. En esta actividad, crea un modelo KNN usando el KNeighborsClassifier con los datos normalizados y evalúa el rendimiento en los datos de prueba, también normalizados.

  3. Después de construir los modelos, es el momento de comparar los resultados y seleccionar aquel que tiene el mejor rendimiento. En este desafío, evalúa la tasa de acierto de los modelos DummyClassifier, DecisionTreeClassifier y KNeighborsClassifier que fueron construidos en los otros desafíos utilizando el método score y, a continuación, almacena el modelo con mejor precisión en un archivo pickle. 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.

  4. Después de que el modelo está en producción, ya puede ser utilizado para clasificar nuevos datos. En este desafío, realiza la lectura de los archivos pickle de los modelos que fueron guardados en el desafío anterior y utiliza los modelos para hacer la predicción del siguiente registro:

nuevo_dato = 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]
})

import pandas as pd
import pickle
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import OneHotEncoder, LabelEncoder, MinMaxScaler
from sklearn.dummy import DummyClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier

df = pd.read_csv('/content/churn.csv')
df = df.drop(columns=['id_cliente'])

X = df.drop(columns=['churn'])
y = df['churn']

# Preprocesamiento Categórico
cat_cols = ['pais', 'sexo_biologico']
ohe = OneHotEncoder(drop='if_binary', sparse_output=False)
X_cat = ohe.fit_transform(X[cat_cols])
X_cat_df = pd.DataFrame(X_cat, columns=ohe.get_feature_names_out(cat_cols))
X_full = pd.concat([X.drop(columns=cat_cols).reset_index(drop=True), X_cat_df], axis=1)

# División Estratificada
X_train, X_test, y_train, y_test = train_test_split(
    X_full, y, test_size=0.25, random_state=42, stratify=y
)

# Normalización
scaler = MinMaxScaler()
# Es vital hacer fit solo en el entrenamiento para evitar el sesgo de información
X_train_norm = scaler.fit_transform(X_train)
X_test_norm = scaler.transform(X_test)

# Entrenamiento de Modelos
# KNN (Requiere datos normalizados obligatoriamente)
knn = KNeighborsClassifier()
knn.fit(X_train_norm, y_train)
knn_score = knn.score(X_test_norm, y_test)

dummy = DummyClassifier(strategy='most_frequent').fit(X_train, y_train)
dt = DecisionTreeClassifier(max_depth=4, random_state=42).fit(X_train, y_train)

# Comparación y Exportación
scores = {
    'Dummy': dummy.score(X_test, y_test),
    'Árbol de Decisión': dt.score(X_test, y_test),
    'KNN': knn_score
}

print("Desempeño de los modelos:", scores)
# Seleccionamos el mejor (En este caso, el Árbol de Decisión)
mejor_modelo = dt 

with open('mejor_modelo.pkl', 'wb') as f:
    pickle.dump(mejor_modelo, f)
with open('onehot_encoder.pkl', 'wb') as f:
    pickle.dump(ohe, f)
with open('scaler.pkl', 'wb') as f:
    pickle.dump(scaler, f)

# Clasificación de Nuevo Dato
nuevo_dato = 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]
})

# Carga de Pickles
modelo_prod = pickle.load(open('mejor_modelo.pkl', 'rb'))
ohe_prod = pickle.load(open('onehot_encoder.pkl', 'rb'))

nuevo_cat = ohe_prod.transform(nuevo_dato[['pais', 'sexo_biologico']])
nuevo_cat_df = pd.DataFrame(nuevo_cat, columns=ohe_prod.get_feature_names_out(['pais', 'sexo_biologico']))
nuevo_X = pd.concat([nuevo_dato.drop(columns=['pais', 'sexo_biologico']), nuevo_cat_df], axis=1)

# Predicción
prediccion = modelo_prod.predict(nuevo_X)
print(f"\nPredicción para el nuevo cliente: {'Abandona (Churn)' if prediccion[0] == 1 else 'Se mantiene (No Churn)'}")

Ingrese aquí la descripción de esta imagen para ayudar con la accesibilidad

1 respuesta

Hola César, espero que estés bien

Parece que has seguido correctamente los pasos para normalizar los datos, entrenar los modelos y seleccionar el mejor. Sin embargo, hay un detalle que podrías ajustar para asegurar que el nuevo dato se procese de la misma manera que los datos de entrenamiento.

En el código para predecir el nuevo dato, asegúrate de aplicar también la normalización con el MinMaxScaler que guardaste. Aquí tienes cómo podrías ajustar esa parte:

# Carga de Pickles
modelo_prod = pickle.load(open('mejor_modelo.pkl', 'rb'))
ohe_prod = pickle.load(open('onehot_encoder.pkl', 'rb'))
scaler_prod = pickle.load(open('scaler.pkl', 'rb'))

# Transformación del nuevo dato
nuevo_cat = ohe_prod.transform(nuevo_dato[['pais', 'sexo_biologico']])
nuevo_cat_df = pd.DataFrame(nuevo_cat, columns=ohe_prod.get_feature_names_out(['pais', 'sexo_biologico']))
nuevo_X = pd.concat([nuevo_dato.drop(columns=['pais', 'sexo_biologico']), nuevo_cat_df], axis=1)

# Normalización del nuevo dato
nuevo_X_norm = scaler_prod.transform(nuevo_X)

# Predicción
prediccion = modelo_prod.predict(nuevo_X_norm)
print(f"\nPredicción para el nuevo cliente: {'Abandona (Churn)' if prediccion[0] == 1 else 'Se mantiene (No Churn)'}")

Este ajuste asegura que el nuevo dato sea normalizado de la misma manera que los datos de entrenamiento, lo cual es crucial para obtener una predicción precisa.

Espero haber ayudado y buenos estudios!