Evaluar un modelo de Machine Learning

Completado

Así que entrenó un modelo predictivo. ¿Cómo sabe si es bueno?

Para evaluar un modelo, debe usar los datos de validación que ha conservado. En el caso de los modelos de Machine Learning supervisados, este enfoque permite comparar las etiquetas que el modelo predice con las etiquetas reales del conjunto de datos de validación. Al comparar las predicciones con los valores de etiqueta verdaderos, puede calcular un intervalo de métricas de evaluación a fin de cuantificar el rendimiento predictivo del modelo.

Evaluación de modelos de regresión

Los modelos de regresión predicen valores numéricos, por lo que cualquier evaluación del rendimiento predictivo del modelo requiere tener en cuenta las diferencias entre los valores previstos y los valores de etiqueta reales del conjunto de datos de validación. Dado que el conjunto de datos de validación incluye varios casos, algunos de los cuales pueden tener predicciones más precisas que otros, necesita alguna manera de agregar las diferencias y determinar una métrica general para el rendimiento. Entre las métricas típicas que se usan para evaluar un modelo de regresión se incluyen las siguientes:

  • Error cuadrático medio (MSE): esta métrica se calcula elevando al cuadrado las diferencias entre cada predicción y el valor real, sumando las diferencias cuadráticas y calculando la media (promedio). Elevar los valores hace que las diferencias sean absolutas (sin importar si la diferencia es negativa o positiva) y da mayor ponderación a las diferencias más grandes.
  • Error cuadrático medio (RMSE): si bien la métrica MSE es un buen indicio del nivel de error en las predicciones de los modelos, no tiene relación con la unidad de medida real de la etiqueta. Por ejemplo, en un modelo que predice las ventas (en dólares estadounidenses), el valor de MSE representa realmente los valores de dólar al cuadrado. Para evaluar cuánto difieren las predicciones en términos de dólares, debe calcular la raíz cuadrada del MSE.
  • Coeficiente de determinación (R2): la métrica R2 mide la correlación entre la característica al cuadrado y los valores previstos. Esto resulta en un valor entre 0 y 1 que mide la cantidad de varianza que se puede explicar por el modelo. Cuanto más se acerque a 1 este valor, mejor será la predicción del modelo.

La mayoría de los marcos de aprendizaje automático proporcionan clases que calculan estas métricas automáticamente. Por ejemplo, la biblioteca MLlib de Spark proporciona la clase RegressionEvaluator, que se puede usar tal como se muestra en este ejemplo de código:

from pyspark.ml.evaluation import RegressionEvaluator

# Inference predicted labels from validation data
predictions_df = model.transform(validation_df)

# Assume predictions_df includes a 'prediction' column with the predicted labels
# and a 'label' column with the actual known label values

# Use an evaluator to get metrics
evaluator = RegressionEvaluator()
evaluator.setPredictionCol("prediction")
mse = evaluator.evaluate(predictions_df, {evaluator.metricName: "mse"})
rmse = evaluator.evaluate(predictions_df, {evaluator.metricName: "rmse"})
r2 = evaluator.evaluate(predictions_df, {evaluator.metricName: "r2"})
print("MSE:", str(mse))
print("RMSE:", str(rmse))
print("R2", str(r2))

Evaluación de los modelos de clasificación

Los modelos de clasificación predicen etiquetas de categoría (clases) al calcular un valor de probabilidad para cada clase posible y al seleccionar la etiqueta de clase con la mayor probabilidad. Las métricas que se usan para evaluar un modelo de clasificación reflejan la frecuencia con la que estas predicciones de clase eran correctas en comparación con las etiquetas conocidas reales del conjunto de datos de validación. Entre las métricas típicas que se usan para evaluar un modelo de clasificación se incluyen las siguientes:

  • Precisión: se trata de una métrica simple que indica qué proporción de las predicciones de clase realizadas por el modelo eran correctas. Si bien esto puede parecer una manera obvia de evaluar el rendimiento de un modelo de clasificación, considere un escenario en el que se usa un modelo para predecir si una persona viajará al trabajo en coche, autobús o tranvía. Supongamos que en el 95 % de los casos del conjunto de validación se usa un coche, un 3 % toma el autobús y un 2 %, un tranvía. Un modelo que siempre predice el automóvil como modo de transporte tendrá una precisión del 95 %, incluso si en realidad no puede distinguir entre las tres clases.
  • Métricas por clase:
    • Precisión: es la proporción de las predicciones de la clase especificada que eran correctas. Se mide como el número de verdaderos positivos (predicciones correctas de esta clase) dividido por el número total de predicciones de esta clase (incluidos los falsos positivos).
    • Coincidencia: se refiere a la proporción de las instancias reales de esta clase que se predijeron correctamente (los verdaderos positivos divididos por el número total de las instancias de esta clase en el conjunto de datos de validación, incluidos los falsos negativos, es decir, los casos en los que el modelo predijo de manera incorrecta una clase diferente).
    • Puntuación F1: una métrica combinada para precisión y coincidencia (que se calcula como la media armónica de la precisión y la coincidencia).
  • Métricas de precisión, coincidencia y F1 combinadas (ponderadas) para todas las clases.

En cuanto a la regresión, la mayoría de los marcos de aprendizaje automático incluyen clases que pueden calcular las métricas de clasificación. Por ejemplo, el código siguiente usa MulticlassClassificationEvaluator en la biblioteca MLlib de Spark.

from pyspark.ml.evaluation import MulticlassClassificationEvaluator

# Inference predicted labels from validation data
predictions_df = model.transform(validation_df)

# Assume predictions_df includes a 'prediction' column with the predicted labels
# and a 'label' column with the actual known label values

# Use an evaluator to get metrics
accuracy = evaluator.evaluate(predictions_df, {evaluator.metricName:"accuracy"})
print("Accuracy:", accuracy)

labels = [0,1,2]
print("\nIndividual class metrics:")
for label in sorted(labels):
    print ("Class %s" % (label))
    precision = evaluator.evaluate(predictions_df, {evaluator.metricLabel:label,
                                                    evaluator.metricName:"precisionByLabel"})
    print("\tPrecision:", precision)
    recall = evaluator.evaluate(predictions_df, {evaluator.metricLabel:label,
                                                 evaluator.metricName:"recallByLabel"})
    print("\tRecall:", recall)
    f1 = evaluator.evaluate(predictions_df, {evaluator.metricLabel:label,
                                             evaluator.metricName:"fMeasureByLabel"})
    print("\tF1 Score:", f1)
    
overallPrecision = evaluator.evaluate(predictions_df, {evaluator.metricName:"weightedPrecision"})
print("Overall Precision:", overallPrecision)
overallRecall = evaluator.evaluate(predictions_df, {evaluator.metricName:"weightedRecall"})
print("Overall Recall:", overallRecall)
overallF1 = evaluator.evaluate(predictions_df, {evaluator.metricName:"weightedFMeasure"})
print("Overall F1 Score:", overallF1)

Evaluación de modelos de agrupación en clústeres no supervisados

Los modelos de agrupación en clústeres no supervisados no tienen valores de etiqueta verdaderos conocidos. El objetivo del modelo de agrupación en clústeres es agrupar casos similares en clústeres en función de sus características. Para evaluar un clúster, necesita una métrica que indique el nivel de separación entre los clústeres. Puede considerar los casos agrupados como puntos trazados en el espacio multidimensional. Los puntos del mismo clúster deben estar cerca entre sí y lejos de los puntos de otro clúster.

Una de estas métricas es la medida Silueta, que calcula la distancia euclidiana al cuadrado y proporciona un indicio de coherencia dentro de los clústeres. Los valores de silueta pueden estar entre 1 y -1, con un valor cercano a 1 que indica que los puntos de un clúster están cerca de los otros puntos del mismo clúster y lejos de los puntos de los demás clústeres.

La biblioteca MLlib de Spark proporciona la clase ClusteringEvaluator, que calcula la medida Silueta para las predicciones que hace un modelo de agrupación en clústeres, tal como se muestra aquí:

from pyspark.ml.evaluation import ClusteringEvaluator
from pyspark.ml.linalg import Vectors

# Inference predicted labels from validation data
predictions_df = model.transform(validation_df)

# Assume predictions_df includes a 'prediction' column with the predicted cluster

# Use an evaluator to get metrics
evaluator = ClusteringEvaluator(predictionCol="prediction")
silhouetteVal  = evaluator.evaluate(predictions_df)
print(silhouetteVal)