Mejorar El Rendimiento De Un Modelo De Aprendizaje Automático

Soner Yıldırım
Jul 21, 2020

Contents Outline

Mejorar El Rendimiento De Un Modelo De Aprendizaje Automático

Jul 21, 2020 7 minutes read

Diferentes enfoques para el rendimiento del modelo

En el post anterior, exploramos y analizamos un conjunto de datos sobre la pérdida de clientes. Luego, construimos un modelo de aprendizaje de máquina para predecir la pérdida de clientes que alcanzó una precisión de 91.7% en el conjunto de entrenamiento y 90.7% en el conjunto de prueba.

En este post, trabajaremos en:
Cómo mejorar la precisión (tanto en la clase positiva como en la negativa)
Cómo inclinar el enfoque del modelo más hacia la clase positiva


Lea también: 

Es importante señalar que la manera de aumentar el rendimiento de un modelo suele ser la recopilación de más datos. Sin embargo, puede que no siempre sea una opción disponible.
Volvamos a nuestro tema.

El modelo que construimos fue un clasificador de bosques aleatorios con hiper parámetros:

  • max_depth = 10 (Máxima profundidad de un árbol en el bosque)
  • n_estimadores = 200 (Número de árboles en el bosque)

Aquí está el rendimiento del modelo:

La primera y segunda matriz son matrices de confusión los datos aprendizaje y datos de prueba respectivamente. La matriz de confusión va más allá de la exactitud de la clasificación al mostrar las predicciones correctas e incorrectas (es decir, verdaderas o falsas) en cada clase.

Centrémonos primero en la exactitud y luego sumerjamonos profundamente en la matriz de confusión y las métricas relacionadas.

Una forma de mejorar el rendimiento de un modelo es buscar los hiper parámetros óptimos. Ajustar los hiper parámetros es como afinar el modelo. Hay muchos hiper parámetros en el bosque aleatorio, pero los más importantes son el número de árboles (n_estimadores) y la profundidad máxima de un árbol individual (max_profundidad).

Usaremos la clase de Scikit-learn de GridSearchCV. Permite seleccionar los mejores parámetros de un rango de valores. Vamos a crear primero un diccionario que incluya un conjunto de valores para n_estimadores y max_depth. Seleccionaré los valores alrededor de los que usamos anteriormente.

parameters = {'max_depth':[8,10,12,14], 
              'n_estimators':[175,200,225,250]}

Puedes probar con más valores o hiper parámetros. No hay una sola respuesta correcta. 
Ahora podemos pasar este diccionario a un objeto GridSearchCV junto con un estimador.

rf = RandomForestClassifier()
gridsearch = GridSearchCV(rf, param_grid=parameters, cv=5)
gridsearch.fit(X_train_selected, y_train)


El parámetro cv está haciendo la validación cruzada.

Hemos entrenado el objeto GridSearchCV. Veamos cuáles son los mejores parámetros:

gridsearch.best_params_
{'max_depth': 12, 'n_estimators': 225}
}

He ejecutado el GridSearchCV una vez más con valores alrededor de 12 y 225. Los mejores parámetros resultaron ser 13 y 235.

Veamos la matriz de confusión y la precisión con estos nuevos valores de hiper parámetros.

rf = RandomForestClassifier(max_depth=13, n_estimators=235)
rf.fit(X_train_selected, y_train)


y_pred = rf.predict(X_train_selected)
cm_train = confusion_matrix(y_train, y_pred)
print(cm_train)


y_test_pred = rf.predict(X_test_selected)
cm_test = confusion_matrix(y_test, y_test_pred)
print(cm_test)


train_acc = (cm_train[0][0] + cm_train[1][1]) / cm_train.sum()
test_acc = (cm_test[0][0] + cm_test[1][1]) / cm_test.sum()
print(f'Train accuracy is {train_acc}. Test accuracy is {test_acc}')

La precisión del conjunto de entrenamiento aumentó, pero no logramos nada en el conjunto de prueba. Si podemos recoger más datos, que suele ser la mejor manera de aumentar la precisión, la precisión de la prueba también podría mejorar con estos nuevos parámetros.

Si recuerdan el post anterior, habíamos eliminado las 4 características que son menos informativas en comparación con otras. En algunos casos, es una buena práctica eliminar las características menos informativas o no correlacionadas para no poner una carga de cálculo innecesaria en el modelo. Sin embargo, estas características eliminadas podrían mejorar ligeramente la precisión, por lo que se debe decidir entre la mejora del rendimiento y el esfuerzo de cálculo.

Yo jugué con los valores de los hiper parámetros y entrené con todas las características. Aquí está el resultado:


Hemos logrado un aumento de aproximadamente un 1% en la precisión de las pruebas, lo que también es una mejora en términos de la adaptación.
Nuestra tarea es predecir si un cliente se dará de baja (es decir, dejará de ser un cliente). Por lo tanto, el enfoque debe ser en la clase positiva (1). Tenemos que predecir todas las clases positivas (Exited=1) correctamente. Podemos permitirnos tener algunas predicciones erróneas sobre la clase negativa (Exited=0).

Tenemos que llevar la exactitud un paso más allá. Empecemos con la matriz de confusión.
Imagen del autor

  • Verdadero positivo (TP): Predicción de la clase positiva como positiva (ok)
  • Falso positivo (FP): Predicción la clase negativa como positiva (no está bien)
  • Falso negativo (FN): Predicción la clase positiva como negativa (no está bien)
  • Verdadero negativo (TN): Predicción de la clase negativa como negativa (ok)

Lea también: 
Como queremos predecir la pérdida de clientes tanto como sea posible, nos proponemos maximizar los verdaderos positivos (TP) y minimizar los falsos negativos (FN)

Un falso negativo ocurre cuando predecimos "el cliente no se dará de baja (0)" pero, en la situación real, el cliente se da de baja.

Es hora de introducir dos métricas que son la precisión y la exhaustividad

La precisión mide lo bueno que es nuestro modelo cuando la predicción es positiva.

El foco de la precisión son las predicciones positivas. Indica cuántas predicciones positivas son verdaderas.

La exhaustividad (Recall) mide que tan bueno que es nuestro modelo para predecir correctamente las clases positivas.

El foco de la exhaustividad son las clases positivas reales. Indica cuántas de las clases positivas puede predecir correctamente el modelo.

Queremos predecir todas las clases positivas para que la exhaustividad sea la métrica apropiada para nuestra tarea. Maximizar los verdaderos positivos y/o minimizar los falsos negativos aumentará el valor de la exhaustividad

Aquí están las matrices de confusión en los datos de entrenamiento y de pruebas:
Necesitamos minimizar los valores marcados con amarillo que son falsos negativos (FN).

Una forma de lograrlo es decirle al modelo que "la clase positiva (1) es más importante que la clase negativa (0)". Con nuestro clasificador de bosques aleatorios, se puede lograr mediante el parámetro class_weight.

rf = RandomForestClassifier(max_depth=12, n_estimators=245,
                            class_weight={0:1, 1:3})
rf.fit(X_train_transformed, y_train)

Pasamos un diccionario que contiene los pesos de cada clase. Lo puse como 3 a 1 como ejemplo.

Aquí están las nuevas matrices de confusión:

El número de falsos positivos se reduce considerablemente. Las predicciones erróneas sobre la clase positiva son más penalizadas que las de la clase negativa. Así, el modelo se inclina a cometer la menor cantidad de errores posibles en la clase positiva 

Hay un inconveniente en este enfoque. Mientras se mejora la predicción de la clase positiva, la precisión general podría empeorar. Comprobémoslo.

La precisión del equipo de prueba bajó de 91,21 a 89,57%. Por lo tanto, se reduce a una decisión de negocios. Si sólo queremos predecir todas las clases positivas y no nos preocupamos por la precisión general, podemos aumentar aún más el peso de la clase positiva.

Por ejemplo, aquí están las matrices de confusión y la exactitud cuando asignamos los pesos como 10 a 1:
También podemos probar diferentes algoritmos y ver si el rendimiento mejora. Sin embargo, los modelos más complejos necesitan más datos. Están hambrientos de datos. El árbol de decisión potenciado por el gradiente (GBDT) y sus variaciones (p.ej. XGBOOST, LightGBM) también se pueden probar, pero creo que sólo puede haber un ligero aumento del rendimiento.

Cuando se considera la complejidad de la tarea y la cantidad de datos, creo que los bosques aleatorios harán muy bien el trabajo

Gracias por la lectura. Por favor, háganme saber si tienen alguna retroalimentación.


Join our private community in Discord

Keep up to date by participating in our global community of data scientists and AI enthusiasts. We discuss the latest developments in data science competitions, new techniques for solving complex challenges, AI and machine learning models, and much more!