top of page
Search

Machine Learning para predecir la rotación de personal en la empresa (Caso de Uso)

  • Writer: Antonio Romero Camacho
    Antonio Romero Camacho
  • Aug 1, 2021
  • 16 min read

1. Introducción

El capital humano es el motor fundamental y un elemento crítico en cualquier compañía. Los departamentos de adquisición de talento dedican una cantidad de tiempo considerable al reclutamiento de candidatos que encajan dentro del perfil que buscan. Adicionalmente, las nuevas incorporaciones requieren de un periodo de adaptación, programas de inmersión cultural y en algunos casos formación adicional antes de alcanzar buenos niveles de desempeño en su función. En definitiva, la incorporación de nuevas personas a un proyecto conlleva una inversión importante de recursos y esfuerzo.


¿Qué ocurre cuando un profesional decide abandonar la empresa?. El impacto de la rotación no deseada no sólo afecta al día a día del equipo; va más allá convirtiendo la inversión realizada en esa persona hasta el momento en un coste. La rotación de personal es cara y prevenirla es una manera de preservar sus ventajas competitivas y su capital intelectual.


En Estados Unidos cerca de un cuarto de los trabajadores dejan su trabajo cada año, llegando a ser la tasa de rotación mucho mayor en determinados sectores. Según una investigación llevada a cabo por la Society of Human Resources Management (SHRM) reemplazar a un empleado le cuesta a la empresa entre un 50-60% del salario del empleado, ascendiendo los costes totales a valores del 90-200% del salario del empleado. Por otro lado, la revista Harvard Business Review cuantifica el ahorro de la empresa Sysco en formación y reclutamiento en torno a los 50 millones de dólares, gracias a sus políticas para minimizar la fuga de talento.


Figura 1. ¿Cómo puede la tecnología reducir la rotación de personal? Fuente: PageupPeople

La predicción de este tipo de eventos, como la rotación de personal, es una herramienta que puede ayudar a las personas encargadas de la toma de decisiones a poner en juego medidas preventivas que eviten las pérdida de talento en su compañía. Hay muchos factores que pueden estar involucrados en la resolución de este problema como por ejemplo la edad, la distancia de casa al trabajo, el salario, la satisfacción del empleado o el nivel de formación.


Sin embargo este tipo de problemas son difíciles de resolver por medio de una fórmula. Puesto que no hay una relación determinista entre la rotación y los factores anteriormente descritos, los algoritmos de Machine Learning son un planteamiento perfecto para afrontar el problema.


Lo que no debe pensar el negocio es que la predicción va a reducir sin más esos costes totales asociados a la rotación, por lo que tendrán que proporcionar soluciones para abordar la pérdida de talento. La empresa debe tener bien presente la frase del profesor Brooks Holtom de la Universidad de Georgetown: "Even if you can predict who's leaving, it still requires you to respond thoughfully".


2. Resumen del post

En este post nos adentramos en el mundo del people analytics con un dataset de recursos humanos que describe a una serie de empleados de una determinada compañía con el fin de predecir la rotación de los mismos. Además, mediante análisis estadístico se llegará a entender cuáles son las características que más peso tienen en la decisión del empleado para cambiar de trabajo.


El artículo comienza haciendo análisis exploratorio y un preparación delos datos para adecuarlos como entrada al modelo predictivo de machine learning. Después se realizarán unos modelos iniciales para predecir si un determinado empleado se irá o se quedará en la empresa. Finalmente se perfilarán los modelos probando con distintos hiperparámetros para conseguir una solución en el conjunto de test satisfactoria.


3. Conjunto de datos (dataset) y preparación

Los datos se encuentran en formato CSV y los tenemos en el mismo directorio donde se encuentra el jupyter notebook sobre el que se va a trabajar. Para leerlos utilizaremos la función read_csv( ) de la biblioteca pandas. Los datos quedarán guardados dentro del DataFrame df.

Figura 2. Lectura del archivo CSV

A continuación se realizará un análisis exploratorio de los datos. Para ello se empleará el método info( ). Como muestra la Figura 3, el conjunto de datos tiene 10 campos (características / columnas numeradas del 0 al 9) y 14999 registros (filas). Todos los campos están bien informados al no presentar valores nulos. De estas 10 características 6 de ellas contienen datos tipo float (decimales), 2 de tipo int (números enteros) y las 2 restantes son del tipo object (objeto). Las variables tipo objeto son variables categóricas que necesitan ser transformadas antes de utilizarlas para la generación del modelo de predicción.

Figura 3. Análisis de registros y campos preliminar

Mediante el método head( ) se puede visualizar el aspecto del dataset para así dejar más clara la presencia de esas dos variables categóricas que son: a) el departamento al que pertenece el empleado y b) el salario que recibe por su desempeño (dos últimas columnas respectivamente). Con mostrar las 10 primeras filas será suficiente.

Figura 4. Visualización de las 10 primeras filas

Las variables department y salary se consideran categóricas porque toman un valor de entre un número limitado de posibles valores únicos, asignando a cada empleado a un departamento en particular o banda salarial. Se acaba de mencionar que toman un valor de un número limitado de posibles valores únicos por lo que en primer lugar se estudiaran cuáles son esos valores únicos que se pueden asignar a esas dos características. Se emplea el método unique( ).

Figura 5. Valores únicos de las variables categóricas

Como se muestra en los resultados de la Figura 5, los valores de salario son categóricos ordinales pues se puede establecer un orden lógico entre ellos (de menor a mayor por ejemplo: bajo, medio, alto). Sin embargo, los valores del departamento son categóricos nominales al no poder establecerse un orden lógico (por ejemplo, no se puede considerar que el departamento técnico esté por debajo del de ventas en un intento de querer ordenarlos). Dependiendo de si la variable es categóricas ordinal o nominal se establecen dos métodos de transformación.


Para la codificación de variables categóricas ordinales como el salario se dan tres pasos:

  • Indicar que la columna en cuestión es del tipo categórico. Para ello se emplea el método astype()

  • Indicar el orden de las categorías mediante el método cat.reorder_categories()

  • Asignar a cada categoría un valor de acuerdo al orden previamente establecido, es decir, codificarlas con un orden lógico. Para ello se empleará el método cat.codes()

A los salarios bajos (low) se les asignará un 0, a los medios (medium) un 1 y a los altos (high) un 2.

Figura 6. Transformación de variables categóricas ordinales

En el caso de la variable departamento, al ser una característica categórica nominal no funciona la codificación. La transformación se llevará a cabo a través de variables dummy. ¿En qué consiste?: cada categoría de departamento posible pasará a ser una columna cuyos registros mostrarán un 1 sólo en caso de pertenecer a ese departamento (el resto de registros se pondrán a cero). Para ello se realizará esta operación en un dataframe paralelo mediante el método get_dummies(). Automáticamente se transforma la columna departamentos en este conjunto de columnas por departamento que aparece en la Figura 7. A ese nuevo dataframe se le llamara departamentos. La figura muestra de nuevo 10 registros del dataset donde los seis primeros pertenecen al departamento de sales (todas las columnas a 0 menos la de sales a 1), los tres siguientes al departamento de contabilidad o accounting (todas las columnas a 0 menos la de accounting a 1) y el último a recursos humanos o hr (todas las columnas a 0 menos la columna de hr a 1).

Figura 7. Transformación de variables categóricas nominales mediante dummies

A continuación se aplica el concepto de dummy trap o variable trampa ficticia que se aplica cuando dos o más variables están taltamanete correlacionadas y una variable pude predecirse en función de los valores de las demás. Por ejemplo, si eliminamos la columna accounting, ¿podríamos seguir identificando a los empleados que pertenecen al departamento de accounting?. La respuesta es SI. Sin embargo, los empleados del departamento de accounting ahora vendrán representados por una fila completa de ceros en el dataframe departamentos modificado. En el siguiente paso se elimina la columna accounting del dataframe departamentos.

Figura 8. Dummy Trap o variable trampa ficticia

Por último, se eliminará la columna departamentos del dataframe df (pues ya no es necesaria) y en su lugar se incluirán las columnas del dataframe departamentos. De esta nueva forma queda registrado el departamento al que pertenece cada registro.

Figura 9. Parte del dataframe df completamente transformado

Ahora, se puede pasar a realizar un breve análisis estadístico previo al modelado.


En este caso el target o variable a predecir es la rotación (columna churn), es decir, si el trabajador sigue en la empresa o la deja. Esta columna es binaria y representa con 0 a los empleados que siguen en la empresa y con 1 a los que se van. EL siguiente paso es determinar el porcentaje de empleados pertenecientes a cada una de estas clases.

Figura 10. Porcentaje de registros de cada clase

También es interesante estudiar qué variables tienen una fuerte relación lineal positiva o negativa con la variable objetivo. Para ello se emplea la matriz de correlación la cual puede representarse a través de la librería seaborn de Python. La matriz muestra que la variable objetivo target (churn) tiene la máxima correlación lineal con la variable nivel de satisfacción del empleado (satisfaction). La correlación churn-satisfaction es de -0.39. Al ser negativa quiere decir que cuanto menor es el nivel de satisfacción mayor es la probabilidad de rotación de personal en la empresa.

Figura 11. Matriz de correlación

4. Partición de los datos y modelo inicial

En esta sección se lleva a cabo una última preparación de los datos antes de lanzar la predicción.

Llegados a este punto es importante diferenciar lo que es el target o variable a predecir (churn o variable rotación) y lo que son las características. La variable objetivo se denominará target y las características que marcan cuando un empleado se queda o se va features.

Figura 12. Separando en subconjunto de training y test

Para llevar a cabo una predicción precisa y construir un modelo que pueda ser aplicado en el mundo real, es habitual en analítica partir los datos en dos subconjuntos: training y test. El subconjunto de training se emplea para entrenar el modelo, para optimizarlo y desarrollar el algoritmo de predicción. Sin embargo el subconjunto de test se usa para validarlo. La partición la hacemos con Scikit Learn (sklearn) obteniendo cuatro outputs: i) target_train, ii) target_test, iii) features_train, iv) features_test. Hay cuatro salidas porque los subconjuntos se dividen en training y test el target y las features. El porcentaje de datos que pertenece a cada subconjunto es seleccionado por el científico de datos. Con el parámetro test_size se le indica a sklearn el porcentaje de datos (en tanto por uno) perteneciente al subconjunto de test. En este caso se ha decidido que el 25% de los datos sean aleatoriamente seleccionados para el conjunto de test, dejando el resto (75% para las labores de entrenamiento).


Tras realizar la partición se comprueba que se ha realizado correctamente mediante las siguientes líneas de código.

Figura 13. Comprobación del porcentaje de datos en cada subconjunto

¿Por qué es necesario separar en Training y Test?

Para ello hablaremos del concepto de overfitting que está muy presente cuando se resuelven problemas de analítica de datos. Cuando se pretende generar un modelo predictivo el objetivo principal es el de obtener uno preciso. Sin embargo, en ocasiones se crean modelos que son muy precisos con un conjunto de datos y muy impreciso con otro. Por ello, el científico de datos tiene que fijar como objetivo secundario obtener un modelo que sea generalizable y que por tanto, sea también preciso al trabajar con otros conjuntos de datos.


El overfitting ocurre cuando el modelo consigue una precisión muy alta con el subconjunto de entrenamiento pero no con otros datos que no ha visto antes. Es decir, cuando tenemos un modelo útil sobre el subconjunto de training pero no en el de test. Para paliar este problema se dividen los datos en training (para entrenar el modelo) y test (para comprobar que no hay overfitting).


Modelo Inicial: Árboles de Decisión

A continuación se mostrará como construir un modelo predictivo inicial y sencillo que aprenda de nuestros datos históricos cuáles son las variables más importantes para la predicción de la rotación de personal. El problema que vamos a resolver es de clasificación binaria puesto que la variable a predecir o target puede tomar sólo dos valores, es decir, puede pertenecer a dos clases (persona que se queda en la empresa(0) o persona que se va de la empresa (1)).


Se podrían usar muchos modelos distintos para resolver este problema pero en este caso, y con el fin de que el concepto general de algoritmo que se pretende desarrollar quede claro, se usará un modelo de Árboles de Decisión.


Estos modelos están incluidos dentro de la librería Scikit Learn (sklearn). Siempre se empieza con la inicialización del modelo que en este caso se llama DecisionTreeClassifier con una serie de hiperparámetros. Por ahora simplemente se inicializará con el parámetro random_state con un valor elegido al azar de 42. En realidad no es un parámetro que afecte al modelo sino al resultado cuando el modelo se lanza en repetidas ocasiones. Fijando un random_state el científico de datos se asegura que si corre el código más de una vez siempre obtendrá el mismo resultado predictivo. Para más información sobre los hiperparámetros que se pueden usar con este modelo visita el siguiente enlace.


Después se pasa a la fase de ajuste del modelo o fit . En esta etapa se ajustan las características (multiplicándolas por una serie de pesos que son calculados) a la variable a predecir. Esta es la fase de entrenamiento del modelo y por ello se le proporcionan al ajuste las características y el target de entrenamiento (features_train, target_train). De esta forma se genera el modelo, en este caso el árbol de toma de decisiones en función de las características de entrada. Se reitera que lo ha hecho basándose sólo en el subconjunto de entrenamiento.


A continuación se estudiará cómo de buena ha sido la predicción usando el subconjunto de test. Para una precisión general se puede emplear directamente el método score que con la entrada features_test determinará la predicción para más tarde compararla con el resultado esperado (target_test) y así, en función del numero de coincidencias y fallos, proporcionar una métrica de precisión del modelo.

Figura 14. Modelo Inicial con Árboles de Decisión y scoring

Tras determinar la puntuación del modelo sobre el subconjunto de training y test se observa que en el primero la puntuación es del 100% mientras que en el segundo subconjunto es del 97.23%. Cabe esperar un 100% si evalúas el modelo con el mismo conjunto de datos que ha sido entrenado, pues se ha generado el modelo ad hoc para ellos. Sin embargo al calcular la puntuación sobre el subconjunto de test se obtiene que el 97.23% de las veces el modelo predice de forma correcta. Es decir, la puntuación en el subconjunto de training es perfecta mientras que en el de test sigue siendo alta pero menor que en training.


Cuando se está en esta situación se dice que hay un problema de overfitting. Lo que puede estar ocurriendo es que el modelo de árbol esté creciendo y expandiendo sus ramas al máximo, haciéndose muy específico para el subconjunto de entrenamiento. Por ello se plantean a continuación dos maneras de combatir el overfitting en este modelo inicial sencillo:

  • Limitar la profundidad maxima de árbol (max_depth): por defecto toma valor None y por lo tanto todos los nodos del modelo de árbol se expanden hasta que todas las hojas contienen menos de un determinado número de muestras.

  • Limitar el mínimo número de muestras por hoja (min_samples_leaf): que por defecto toma el valor 1. Es el mínimo número de muestras para nodos hoja. Se considerarán puntos de partición a cualquier nivel de profundidad siempre y cuando las hojas tengan al menos en las ramas derecha e izquierda el número mínimo de muestras fijado en el parámetro.

En este párrafo se trata la idea anterior de una manera más gráfica. Si el modelo se generara para distintos valores de profundidad de árbol veríamos como, a medida que el árbol es más profundo, la precisión al evaluar sobre el conjunto de entrenamiento se acerca al 100% mientras que sobre el conjunto de test llega un momento en el que lo único que hace es divergir y reducir el porcentaje de acierto. En la figura 15 se muestra de una forma muy clara cómo se puede causar un problema de overfitting dejando al árbol crecer hasta el máximo de sus posibilidades,.

Figura 15. Sobreajuste u overfitting en el problema de predicción de rotación si no se toman medidas

Antes de profundizar en cómo minimizar la cuestión del sobreajuste, se muestra a continuación la manera de determinar las predicciones con el método predict y las características de test como entrada. Comparando la predicción sobre el conjunto de test y el target de test se demuestra que hay veces que acierta y otras en las que la predicción es errónea. De ahí que la puntuación del modelo sobre el conjunto de test no sea perfecta.

Figura 16. Predicción sobre el conjunto de test

Combatiendo el Overfitting I: Profundidad máxima del árbol

En esta primera manera de paliar el sobreajuste actuaremos con el hiperparámetro max_depth. Para ello se inicializará un nuevo modelo donde se fije la profundidad a través de ese hiperparámetro. Para este ejemplo se ha fijado a 5 profundidades.

Figura 17. Combatiendo el overfitting con el hiperparámetro max_depth

El resultado muestra una precisión sobre el subconjunto de training del 97.72% y sobre el de test del 97.07%. Son menores que en el caso inicial pero el modelo es más realista pues la diferencia entre puntuación es mucho menor.


Combatiendo el Overfitting II: min_samples_leaf

En esta segunda forma de reducir el sobreajuste actuaremos con el hiperparámetro min_sample_leaf. Para ello se inicializará un nuevo modelo donde se fije el mínimo número de muestras a través de ese hiperparámetro. Para este ejemplo se ha fijado a 15 muestras.

Figura 18. Combatiendo el overfitting con el hiperparámetro min_samples_leaf

El resultado muestra una precisión sobre el subconjunto de test ligeramente más alta que en el caso anterior (97.17%). Con esta modificación del modelo se ha conseguido aumentar la puntuación en test y reducir la puntuación en train, minimizando el gap entre ambas y por tanto ofreciendo un modelo más generalista.


En la siguiente sección vamos a hablar de puntuaciones y métricas para cuantificar la precisión de nuestro modelo pues este cálculo de la precisión del modelo genérica tiene limitaciones. Cuando el problema a resolver tiene desbalanceo de clases la precisión general puede llevarnos a engaño ya que suele dar valores altos cuando en realidad está fallando en predecir correctamente la rotación de personal.


5. Métricas

Hasta ahora hemos calculado la puntuación del modelo con el método score de una forma general sin tener información separada por clases.


Para comprender las métricas de evaluación es necesario hablar primero de los tipos de errores de predicción. Hay dos tipos de error, los cuales vienen reflejados en la conocida matriz de confusión. A la clase 0 se la denomina NEGATIVA y a la clase 1 POSITIVA. Por ello, los errores de predicción son los siguientes:


  • Falso Negativo (FN): La predicción es 0 (negativo) y realmente era un 1 (positivo). Sería el caso en el que el trabajador deja la empresa pero el modelo pronostica que se quedará.

  • Falso Positivo (FP): La predicción es 1 (positivo) y realmente era un 0 (negativo). Representa el caso en el que una persona que no abandona la empresa es clasificada como un leaver por el modelo.

Esta sería la matriz de confusión para el último modelo que se ha lanzado.

Figura 19. Matriz de Confusión

La interpretación de la matriz de confusión es la siguiente:

  • El conjunto de test contiene 2853 registros con información de trabajadores que se quedan en el empresa (suma de los valores de la fila 1)

  • El conjunto de test tiene 897 registros con información de trabajadores que abandonan la empresa (suma de los valores de la fila 2)

  • True Negatives (TN): Es el elemento de la fila 1 y columna . Indica el número de aciertos de la clase 0 (negativos). En este caso el modelo acierta 2837 veces de las 2853 posibles que los trabajadores se quedan en la empresa.

  • True Positives (TP): Es el elemento de la fila 2 y columna 2. El modelo acierta 807 veces de las 897 posibles que los trabajadores dejan la empresa.

  • False Negative (FN): elemento de la fila 1 y la columna 2. La predicción determina que se quedan en la empresa pero realmente la dejan. Hay 16 casos como este.

  • False Positive (FP): elemento de la fila 2 y columna 1. Los falsos positivos son aquellos en los que el modelo determina que se van de la empresa pero realmente se quedan. Hay 90 de estos casos.

En base a estos cuatro índices de la matriz de confusión (TN, TP, FN, FP) se pueden construir diferentes métricas que serán más o menos apropiadas en función del objetivo de nuestro modelo.


Si el objetivo principal son los trabajadores que se marchan lo que se pretende es minimizar el número de falsos negativos, es decir, minimizar el número de veces que el algoritmo clasifica a los leavers como stayers. La métrica a emplear es Recall.


Recall = TP / (TP + FN)

Figura 20. Recall Score

Un menor número de falsos negativos hará que la métrica Recall alcance valores más altos.


Si el objetivo principal son los trabajadores que se quedan lo que se pretende es minimizar el número de falsos positivos, es decir, minimizar el número de veces que el algoritmo clasifica a los stayers como leavers. La métrica a utilizar es Specifity.


Specifity = TN / (TN + FP)

Figura 21. Specifity Score

Un menor número de Falsos Positivos proporcionará puntuaciones de la métrica más altas.


Aunque el objetivo sea centrarse en los que abandonan la empresa, también puede interesar reducir los falsos positivos. En ese caso se emplea la métrica Precision Score.


Precision Score = TP / (TP + FP)

Figura 22. Precision Score

Un menor número de Falsos Positivos proporcionará puntuaciones de la métrica más altas.


Como el objetivo de este caso de estudio es identificar quien se va a ir parece obvio que la mejor métrica sería Recall. El problema es que sólo apunta a una clase, lo cual puede llevar asociado una baja precisión en la otra clase. Por ello lo mejor es usar métricas que consideren a todas las clases. Una de las métricas que tiene en cuenta a las clases leavers y stayers es AUC ROC.


AUC (Area Under the Curve) es una medida conjunta que se maximiza cuando Recall y Specifity se maximizan (es decir, cuando los falsos positivos y los falsos negativos se reducen).

Figura 23. Métrica ROC AUC

Para tener una referencia del punto de partida del modelo, se obtienen unas puntuaciones de 95.55 y 94.7% en los subconjuntos de training y test respectivamente. Siguen indicando que el modelo está sobreajustado. Sin embargo, será necesario mejorarlo en las siguientes secciones pues la puntuación se puede mejorar.


Cuando se vaya a mejorar un modelo progresivamente y se quiera ir evaluando el grado de mejora es conveniente usar una misma métrica, pues como hemos visto cada una se usa con un fin diferente. De ahora en adelante usaremos la métrica AUC ROC para nuestro análisis.


Además, se puede mejorar la puntuación actual poniéndole remedio al problema del desbalanceo de clases. Como se vio en la figura 10, este problema presentaba desbalanceo pues un 76% eran de la clase "me quedo en la empresa" y el 24% restante de la clase "me voy de la empresa". Python permite balancear los pesos de cada clase para hacer que las probabilidades de obtener un 0 o un 1 sea del 50%. De esta forma ambas clases son consideradas igual de importantes por el modelo. Con el fin de aplicarlo, durante la definición del mismo se activará el hiperparámetro class_weight con el valor 'balanced'.

Figura 24. Modelo con class_weight balanced para desbalanceo de clases

6. Modelo de árbol mejorado con Grid Search y Validación Cruzada

Con el fin de encontrar los hiperparámetros óptimos se crea una grid de posibles combinaciones de hiperparámetros. Para cada una de esas combinaciones se genera un modelo de árbol de decisión, se valida y finalmente se escoge la que proporcione una mayor puntuación. A este proceso de búsqueda automática de los mejores hiperparámetros se le conoce como GridSearch.


Por otro lado, en este último modelo también se utiliza validación cruzada. Con esta técnica el científico de datos se asegura que no va a haber sobreajuste en el subconjunto de test. Para ello el conjunto de entrenamiento a su vez se subdivide en una serie de componentes o folds que son selecionados por el data scientist (aquí se han seleccionado 10 folds). En cada combinación, una componente distinta en las que se ha dividido el conjunto de training tendrá la oportunidad de ser a su vez el subconjunto que valide el modelo en cuestión (como si fuera la componente de test).


A continuación se muestra el código para realizar la selección de hiperparámetros automática junto con la validación cruzada para minimizar al mismo tiempo el sobreajuste en el conjunto de test.

FIgura 25. Modelo de árbol con GridSearch y Cross Validation

El resultado final obtenido con este modelo sobre el conjunto de test indica que el 97.2% de las veces el modelo hace una predicción correcta. Además, el sobreajuste con respecto al conjunto de entrenamiento se ha combatido de buena manera, habiendo algo menos de un 1% de diferencia en las puntuaciones en train y test. Para determinar los hiperparámetros del modelo seleccionados con GridSearch sólo hay que aplicar el método best_params al modelo gs_arbol (min_samples_leaf =42 y max_depth=12).

Figura 26. Puntuación modelo de árbol con GridSearch y valores de hiperparámetros

La matriz de confusión muestra que el número de fallos se ha reducido a 81. Además el fallo está más repartido entre clases (antes la equivocación se centraba en falsos positivos).

Figura 27. Matriz de confusión modelo gs_arbol

7. Modelo adicional con Random Forest

Este modelo también pertenece a la familia de los modelos del tipo árbol de decisión. Se ha realizado con un GridSearch sencillo y validación cruzada. El código se muestra a continuación:

Figura 28. Modelo Random Forest

Las puntuaciones para este modelo en test es superior aunque el modelo podría estar algo más sobreajustado que el anterior.

FIgura 29. Puntuaciones AUC ROC para el modelo Random Forest

Al revisar la matriz de confusión para este caso se observa que ha disminuido el número de fallos, especialmente el de falsos negativos.

Figura 30. Matriz de confusión modelo Random Forest


























 
 
 

Comments


bottom of page