性能指标
机器学习 - 性能指标
Section titled “机器学习 - 性能指标”评估机器学习模型的性能对于理解其有效性以及比较不同算法或参数设置至关重要。指标的选择很大程度上取决于问题类型(分类或回归)和应用的具体目标。
- 指标决定了如何衡量和比较模型性能。
- 所选指标会影响您优先考虑模型预测的不同方面(例如,最小化假阳性与最小化假阴性)。
分类问题的性能指标
Section titled “分类问题的性能指标”分类模型预测离散类别标签。评估它们通常涉及将预测标签与测试集中的真实标签进行比较。
混淆矩阵 (Confusion Matrix)
Section titled “混淆矩阵 (Confusion Matrix)”混淆矩阵提供了分类模型性能的基本总结,特别是对于二元(两类)问题。它是一个表格,显示真阳性、真阴性、假阳性和假阴性的计数。
二元分类(类别 0 和 1)结构:
Predicted: 0 Predicted: 1 Actual: 0 | TN | FP | Actual: 1 | FN | TP |
术语解释:
- 真阳性 (TP): 正确预测为阳性的样本(实际为 1,预测为 1)。
- 真阴性 (TN): 正确预测为阴性的样本(实际为 0,预测为 0)。
- 假阳性 (FP): 错误预测为阳性的样本(实际为 0,预测为 1)- I 类错误。
- 假阴性 (FN): 错误预测为阴性的样本(实际为 1,预测为 0)- II 类错误。
使用 sklearn.metrics.confusion_matrix 来计算。
分类准确率 (Classification Accuracy)
Section titled “分类准确率 (Classification Accuracy)”最直观的指标:正确预测数占总预测数的比例。
公式:Accuracy = (TP + TN) / (TP + TN + FP + FN)
注意: 在数据集不平衡(即一个类别的样本数量远多于其他类别)时,准确率可能会产生误导。模型可能仅仅通过总是预测多数类别来获得高准确率。
使用 sklearn.metrics.accuracy_score。
精确率 (Precision)
Section titled “精确率 (Precision)”衡量阳性预测的准确性。在所有被预测为阳性的样本中,实际为阳性的比例是多少?
公式:Precision = TP / (TP + FP)
当假阳性的成本很高时(例如,将非垃圾邮件标记为垃圾邮件),高精确率非常重要。
召回率 (Recall)(或灵敏度 Sensitivity 或真阳性率 True Positive Rate - TPR)
Section titled “召回率 (Recall)(或灵敏度 Sensitivity 或真阳性率 True Positive Rate - TPR)”衡量模型识别实际阳性样本的能力。在所有实际阳性样本中,模型正确预测的比例是多少?
公式:Recall = TP / (TP + FN)
当假阴性的成本很高时(例如,未能检测到欺诈性交易或严重疾病),高召回率非常重要。
特异度 (Specificity)(真阴性率 True Negative Rate - TNR)
Section titled “特异度 (Specificity)(真阴性率 True Negative Rate - TNR)”衡量模型识别实际阴性样本的能力。在所有实际阴性样本中,模型正确预测的比例是多少?
公式:Specificity = TN / (TN + FP)
它是阴性类别的召回率对应指标。
F1 分数 (F1 Score)
Section titled “F1 分数 (F1 Score)”精确率和召回率的调和平均值。它提供了一个平衡这两个关注点的单一分数。当需要平衡最小化假阳性和假阴性时非常有用。
公式:F1 = 2 * (Precision * Recall) / (Precision + Recall)
F1 分数对精确率和召回率给予同等权重。最佳值为 1,最差值为 0。
分类报告 (Classification Report)
Section titled “分类报告 (Classification Report)”一个方便的报告,总结了每个类别的精确率、召回率、F1 分数和支持度(真实样本数)。
使用 sklearn.metrics.classification_report。
AUC(ROC 曲线下面积)
Section titled “AUC(ROC 曲线下面积)”ROC(Receiver Operating Characteristic,接收者操作特征)曲线绘制了在各种分类阈值下,真阳性率(召回率)相对于假阳性率(FPR = FP / (FP + TN) = 1 - 特异度)的变化。
AUC 表示该曲线下的面积。它衡量模型在所有可能的阈值下区分阳性和阴性类别的能力。
解释:
- AUC = 1: 完美分类器。
- AUC = 0.5: 模型表现不优于随机猜测。
- AUC < 0.5: 模型表现劣于随机猜测(通常表示标签交换或存在问题)。
- 更高的 AUC(接近 1)表示更好的区分能力。
AUC 对于不平衡数据集特别有用,因为它与阈值无关,并同时考虑了两个类别。
使用 sklearn.metrics.roc_auc_score(需要概率分数或决策函数值,而不仅仅是预测标签)和 sklearn.metrics.roc_curve 来绘制曲线。
对数损失 (Log Loss)(对数损失 / 交叉熵损失)
Section titled “对数损失 (Log Loss)(对数损失 / 交叉熵损失)”评估输出概率估计(0 到 1 之间的值)的分类器的性能。它对置信度高但错误的预测给予较高的惩罚。
较低的对数损失值表明预测概率的校准和准确性更好。一个完美的模型对数损失为 0。
使用 sklearn.metrics.log_loss。
示例:计算分类指标
Section titled “示例:计算分类指标”一个 Python 脚本,演示了常用分类指标的计算。
from sklearn.metrics import ( confusion_matrix, accuracy_score, classification_report, roc_auc_score, log_loss)
# Sample true labels and predicted labels# Assume 1 is the positive classy_true = [1, 1, 0, 1, 0, 0, 1, 0, 0, 0]y_pred = [1, 0, 1, 1, 1, 0, 1, 1, 0, 0]# Note: For roc_auc_score and log_loss, you often need predicted probabilities# Let's assume some dummy probabilities for demonstration# 注意:对于 roc_auc_score 和 log_loss,通常需要预测概率# 我们假设一些模拟概率用于演示y_pred_proba = [0.9, 0.4, 0.6, 0.8, 0.7, 0.1, 0.95, 0.55, 0.2, 0.3]
# Confusion Matrix# 混淆矩阵cm = confusion_matrix(y_true, y_pred)print('Confusion Matrix:')print(cm)# Interpretation: TN=3, FP=3, FN=1, TP=3# 解释:真阴性(TN)=3, 假阳性(FP)=3, 假阴性(FN)=1, 真阳性(TP)=3
# Accuracy# 准确率acc = accuracy_score(y_true, y_pred)print(f'\nAccuracy Score: {acc:.4f}')
# Classification Report# 分类报告report = classification_report(y_true, y_pred, target_names=['Class 0', 'Class 1'])print('\nClassification Report:')print(report)
# AUC-ROC Score (using predicted labels - less ideal, probabilities preferred)# Note: roc_auc_score usually performs better with probabilities# AUC-ROC 分数(使用预测标签 - 不太理想,概率更佳)# 注意:roc_auc_score 通常使用概率效果更好auc_score_labels = roc_auc_score(y_true, y_pred)print(f'\nAUC-ROC (from labels): {auc_score_labels:.4f}')
# AUC-ROC Score (using predicted probabilities - preferred method)# AUC-ROC 分数(使用预测概率 - 首选方法)auc_score_proba = roc_auc_score(y_true, y_pred_proba)print(f'AUC-ROC (from probabilities): {auc_score_proba:.4f}')
# Log Loss (requires probabilities)# 对数损失(需要概率)logloss = log_loss(y_true, y_pred_proba)print(f'\nLog Loss: {logloss:.4f}')回归问题的性能指标
Section titled “回归问题的性能指标”回归模型预测连续的数值。评估涉及衡量预测值与真实值之间的差异(误差)。
平均绝对误差 (Mean Absolute Error - MAE)
Section titled “平均绝对误差 (Mean Absolute Error - MAE)”预测值和实际值之间绝对差值的平均值。它能反映误差的大小,单位与目标变量的原始单位相同。
公式:MAE = (1/n) * Σ |yᵢ - ŷᵢ| (其中 n 是样本数)
与 MSE 相比,对异常值不那么敏感。
使用 sklearn.metrics.mean_absolute_error。
均方误差 (Mean Squared Error - MSE)
Section titled “均方误差 (Mean Squared Error - MSE)”预测值和实际值之间平方差的平均值。平方误差会更严重地惩罚较大的误差。
公式:MSE = (1/n) * Σ (yᵢ - ŷᵢ)²
单位是目标变量单位的平方,因此直接解释性较差。
比 MAE 对异常值更敏感。
使用 sklearn.metrics.mean_squared_error。
均方根误差 (Root Mean Squared Error - RMSE)
Section titled “均方根误差 (Root Mean Squared Error - RMSE)”MSE 的平方根。它将指标的单位恢复到目标变量的原始单位,使其比 MSE 更易于解释。
公式:RMSE = sqrt(MSE)
通过计算 MSE 的平方根来获取:np.sqrt(mean_squared_error(y_true, y_pred)) 或使用 mean_squared_error(y_true, y_pred, squared=False)。
与 MSE 类似,它对异常值敏感。
R 平方 (R²) 或决定系数 (Coefficient of Determination)
Section titled “R 平方 (R²) 或决定系数 (Coefficient of Determination)”表示因变量(目标变量)中可以由自变量(特征)预测的方差比例。
公式:R² = 1 - (Sum of Squared Residuals / Total Sum of Squares) = 1 - (Σ(yᵢ - ŷᵢ)² / Σ(yᵢ - ȳ)²) (其中 ȳ 是真实值的平均值)
解释:
- R² = 1: 模型完美解释了方差。
- R² = 0: 模型未能解释任何方差(表现与预测平均值相同)。
- R² < 0: 模型表现劣于预测平均值。
- 更高的 R²(接近 1)通常表示更好的拟合度。
注意: R² 会因为添加更多特征(即使是不相关的特征)而被人为抬高。调整后的 R² (Adjusted R²) 通常更受欢迎,因为它惩罚了非信息性特征的添加。
使用 sklearn.metrics.r2_score。
示例:计算回归指标
Section titled “示例:计算回归指标”一个 Python 脚本,演示了常用回归指标的计算。
from sklearn.metrics import ( mean_absolute_error, mean_squared_error, r2_score)import numpy as np
# Sample true values and predicted values# 样本真实值和预测值y_true_reg = [5.0, -1.0, 2.0, 10.0, 7.0]y_pred_reg = [3.5, -0.9, 2.0, 9.9, 6.5]
# Mean Absolute Error (MAE)# 平均绝对误差 (MAE)mae = mean_absolute_error(y_true_reg, y_pred_reg)print(f'Mean Absolute Error (MAE): {mae:.4f}')
# Mean Squared Error (MSE)# 均方误差 (MSE)mse = mean_squared_error(y_true_reg, y_pred_reg)print(f'Mean Squared Error (MSE): {mse:.4f}')
# Root Mean Squared Error (RMSE)# 均方根误差 (RMSE)rmse = np.sqrt(mse) # Or use squared=False in mean_squared_error# rmse_alternative = mean_squared_error(y_true_reg, y_pred_reg, squared=False)print(f'Root Mean Squared Error (RMSE): {rmse:.4f}')
# R-Squared (R²)# R 平方 (R²)r2 = r2_score(y_true_reg, y_pred_reg)print(f'R-Squared (R²): {r2:.4f}')选择正确的指标至关重要。考虑业务问题、数据性质(特别是分类中的类别平衡)以及不同类型错误相关的成本。