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.
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.
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.
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)'}")