在机器学习分类任务中,新手常犯的一个错误是过度依赖准确率(Accuracy)指标。上周我评审一个信用卡欺诈检测项目时,发现开发团队正为99%的准确率欢呼——直到我指出他们的模型把所有交易都预测为"正常",实际上完全没检测出任何欺诈案例。这就是典型的准确率陷阱,而F1分数正是破解这种假象的利器。
准确率计算公式看似合理:(TP+TN)/(TP+TN+FP+FN),但在类别不平衡的数据中会严重失真。以医学检测为例:
F1分数实质是召回率(Recall)和精确率(Precision)的调和平均数:
这种计算方式强制要求模型必须在识别正例(如欺诈交易)和避免误报之间找到平衡点。我在电商评论分类项目中实测发现,当负面评论占比5%时:
对于N个类别的分类任务,有两种计算方式:
python复制from sklearn.metrics import f1_score
f1_score(y_true, y_pred, average='macro')
我在新闻分类项目中对比发现:
通过调整分类阈值可以优化F1,推荐步骤:
python复制model.predict_proba(X_test)[:,1]
实际项目中,我发现阈值0.3时:
当正负样本比超过1:100时,建议:
python复制from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(
X, y, stratify=y, test_size=0.2)
python复制model = RandomForestClassifier(class_weight="balanced")
在工业缺陷检测项目中,通过SMOTE+class_weight将F1从0.31提升到0.68
F1并非万能,需要配合其他指标:
python复制fbeta_score(y_true, y_pred, beta=2)
在相同数据集上测试:
| 算法 | 准确率 | F1 | 训练时间 |
|---|---|---|---|
| 逻辑回归 | 0.92 | 0.68 | 15s |
| 随机森林 | 0.95 | 0.83 | 2min |
| XGBoost | 0.96 | 0.85 | 45s |
| 神经网络 | 0.94 | 0.81 | 8min |
实际选择时需要权衡计算资源和性能需求
提升F1的有效特征处理方法:
python复制from category_encoders import TargetEncoder
encoder = TargetEncoder()
X_train_encoded = encoder.fit_transform(X_train, y_train)
在用户流失预测项目中,通过行为时间序列的特征工程:
建议建立F1的实时监控看板:
python复制# 每100个样本计算一次
window_size = 100
for i in range(len(y_true)//window_size):
start = i*window_size
end = (i+1)*window_size
window_f1 = f1_score(y_true[start:end], y_pred[start:end])
采用冠军/挑战者模式:
这种方案在我参与的广告CTR预测系统中,使季度平均F1提升22%