Evaluación de un modelo de Machine Learning
Así que entrenó un modelo predictivo. ¿Cómo sabes si es algo bueno?
Para evaluar un modelo, debe usar los datos de validación que ha retenido. En el caso de los modelos de aprendizaje automático supervisados, este enfoque permite comparar las etiquetas previstas por el modelo 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 para 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 que tenga 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 otras, 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:
- Error cuadrático medio (ECM): 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). La cuartura de los valores hace que las diferencias sean absolutas (ignorando si la diferencia es negativa o positiva) y proporciona más peso a diferencias más grandes.
- Error cuadrático medio raíz (RMSE): aunque la métrica MSE es una buena indicación del nivel de error en las predicciones de los modelos, no se relaciona con la unidad real de medida de la etiqueta. Por ejemplo, en un modelo que predice las ventas (en dólares estadounidenses), el valor de ECM representa realmente los valores de dólar al cuadrado. Para evaluar cuán desviadas están 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 cuadrada y los valores previstos. Esto da como resultado un valor entre 0 y 1 que mide la cantidad de varianza que puede explicar el modelo. Cuanto más cerca esté este valor es 1, mejor será el modelo que predice.
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 puede usar 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 modelos de clasificación
Los modelos de clasificación predicen etiquetas categóricas (clases) calculando un valor de probabilidad para cada clase posible y seleccionando la etiqueta de clase con la mayor probabilidad. Las métricas usadas 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:
- Precisión: métrica simple que indica la proporción de predicciones de clase realizadas por el modelo correcto. Aunque 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á a trabajar en coche, autobús o tranvía. Supongamos que 95% de los casos en el conjunto de validación usan un coche, 3% toman el autobús y 2% cogen un tranvía. Un modelo que simplemente predice un automóvil será 95% preciso, aunque realmente no tenga capacidad predictiva para discriminar entre las tres clases.
- Métricas por clase:
- Precisión: proporción de predicciones de la clase especificada que eran correctas. Esto se mide como el número de verdaderos positivos (predicciones correctas de esta clase) divididos por el número total de predicciones de esta clase (incluidos los falsos positivos).
- Recuerde: la proporción de instancias reales de esta clase que se predijeron correctamente (verdaderos positivos divididos por el número total si las instancias de esta clase del conjunto de datos de validación, incluidos los falsos negativos , casos en los que el modelo predijo incorrectamente una clase diferente).
- Puntuación F1: métrica combinada para precisión y recuperación (calculada como la media armónica de precisión y recuperación).
- Métricas combinadas (ponderadas) de precisión, recuperación y F1 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 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 un clúster diferente.
Una de estas métricas es la medida De silueta , que calcula la distancia euclidiana cuadrada y proporciona una indicación 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 Spark MLlib proporciona la clase ClusteringEvaluator , que calcula la Silueta para las predicciones realizadas por un modelo de agrupación en clústeres, 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)