评估机器学习模型
你训练了一个预测模型。 你怎么知道它好不好?
若要评估模型,需要使用保留的验证数据。 对于监督式机器学习模型,使用此方法可以将模型预测的标签与验证数据集中的实际标签进行比较。 通过将预测值与实际标签值进行比较,可以计算一系列评估指标来量化模型的预测性能。
评估回归模型
回归模型会预测数值,因此,对模型的预测性能进行的任何评估都需要考虑预测值与验证数据集中实际标签值之间的差异。 由于验证数据集包含多个案例,其中一些案例的预测可能比其他案例更准确,因此需要某种方法来聚合差异并确定性能的总体指标。 用于评估回归模型的典型指标包括:
- 均方误差 (MSE):该指标的计算方法是将每个预测值与实际值之间的差值进行平方处理,并将平方处理后的差值相加,然后计算平均值(平均数)。 对值进行平方处理使差值基于绝对值(忽略差值是负还是正),并对较大的差值赋予较大的权重。
- 均方根误差 (RMSE):虽然 MSE 指标很好地指示了模型预测中的误差级别,但它与标签的实际度量单位无关。 例如,在预测销售额(以美元为单位)的模型中,MSE 值实际上表示美元值的平方。 要评估以美元计算的预测的偏离程度,需要计算 MSE 的平方根。
- 确定系数 (R2):R2 指标度量平方特征与预测值之间的相关性。 这会生成一个介于 0 和 1 之间的值,该值可测量模型可以解释的方差量。 此值越接近 1,模型的预测效果就越好。
大多数机器学习框架都提供了用于计算这些指标的类。 例如,Spark MLlib 库提供了 RegressionEvaluator 类,你可以按以下代码示例所示来使用它:
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))
评估分类模型
分类模型通过计算每个可能类的概率值并选择概率最高的类标签来预测分类标签(类)。 用于评估分类模型的指标反映了与验证数据集中的实际已知标签相比,这些类预测的正确频率。 用于评估分类模型的典型指标包括:
- 准确性:这是一个简单的指标,指示模型进行正确的类预测的比例。 虽然这似乎是评估分类模型性能的显而易见的方法,但请考虑一个场景,使用模型来预测一个人是开车、乘坐公共汽车还是有轨电车上下班。 假设验证集中 95% 的案例是开车,3% 的人乘坐公共汽车,2% 的人乘坐有轨电车。 始终预测开车的模型的准确率将为 95% - 尽管它实际上没有预测能力来区分这三个类。
- 按类指标:
- 精准率:指定类正确预测的比例。 这是用真正(该类的正确预测)的数量除以该类总预测数(包括假正)来度量的。
- 召回率:该类实际实例正确预测的比例(真正除以验证数据集中该类实例的总数,包括假正 - 模型错误地预测了不同类的案例)。
- F1 分数:精准率和召回率的组合指标(计算为精准率和召回率的调和平均值)。
- 所有类的组合(加权)精准率、召回率和 F1 指标。
至于回归,大多数机器学习框架都包含可计算分类指标的类。 例如,以下代码使用 Spark MLlib 库中的 MulticlassClassificationEvaluator。
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)
评估非监督聚类分析模型
非监督聚类分析模型没有已知的真实标签值。 聚类分析模型的目标是根据案例的特征将类似案例分组到群集中。 若要评估群集,需要一个指标来指示群集之间的分离程度。 可以将聚类分析的案例视为多维空间中的绘图点。 同一群集中的点应彼此靠近,但远离不同群集中的点。
其中一个指标是轮廓度量值,它计算经过平方处理的欧几里德距离,并提供群集内一致性的指示。 轮廓值可以介于 1 和 -1 之间,值接近 1 表示群集中的点接近同一群集中的其他点,而远离其他群集的点。
Spark MLlib 库提供了 ClusteringEvaluator 类,该类计算聚类分析模型做出的预测的轮廓,如下所示:
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)