一篇文章总结python机器学习类不平衡问题的处理-class imbalance(ROC,混淆矩阵,f1 score等)

source: python machine learning 3rd

所谓的类不平衡问题,指的就是数据集中一类的样本量明显小于另一类。在这类特殊问题中,如果不进行处理,默认训练模型时对小类和大类数据的惩罚相同,会导致对数据更加敏感,样本量更少的小类产生预测上的偏差。如何处理这一偏差,让模型对大类和小类都有良好的预测结果? 本文将给出总结性的方法集合

本文中python实现的数据集建议来自Breast Cancer Wisconsin dataset

混淆矩阵


混淆其实不是专门用来处理类不平衡问题的,但是它能够帮助我们清晰直观地分析类不平衡问题,之后我们要介绍到的种种方法,基本都要涉及到混淆矩阵的使用。

混淆矩阵能够详细地给我们展示以下四种预测情况的分布:

  • TP: true positive - 样本预测结果为1,实际分类结果也为1
  • TN: true negative - 样本预测结果为0,实际分类结果也为0
  • FP: false positive - 样本预测结果为1, 实际分类结果为0
  • FN: false negative - 样本预测结果为0,实际分类结果为1

注:本文中的y=1样本都默认表示为想要预测的种类,一般情况下都为小类
迷惑矩阵

python实现

之后的所有代码都会假设X_train, y_train已获得且被合理分割

...
# 导入迷惑矩阵
from sklearn.metrics import confusion_matrix

# 使用一个模型训练数据,如此中SVC pipeline
pipe_svc.fit(X_train, y_train)
# 获得模型的预测结果
y_pred = pipe_svc.predict(X_test)
# 使用预测结果和真实结果一步生成混淆矩阵
confmat = confusion_matrix(y_true=y_test, y_pred=y_pred)

可视化:

# matplotlib
fig, ax = plt.subplots(figsize=(2.5, 2.5))
ax.matshow(confmat, cmap=plt.cm.Blues, alpha=0.3)
for i in range(confmat.shape[0]):
    for j in range(confmat.shape[1]):
        ax.text(x=j, y=i, s=confmat[i, j], va='center', ha='center')

plt.xlabel('Predicted label')
plt.ylabel('True label')

plt.tight_layout()
plt.show()

结果
稍加注意这里的坐标分布和我们之前介绍的是反的,即0在左上角

准确度,召回率和f1 score


准确率(ACC/PRE)

准确率(accuracy/precision)直接反应了我们机器学习模型的表现,得分越高,预测结果的正确率越高

具体而言:
E R R = F P + F N F P + F N + T P + T N E R R=\frac{F P+F N}{F P+F N+T P+T N} ERR=FP+FN+TP+TNFP+FN
A C C = T P + T N F P + F N + T P + T N = 1 − E R R A C C=\frac{T P+T N}{F P+F N+T P+T N}=1-E R R ACC=FP+FN+TP+TNTP+TN=1ERR
所以说,准确率越高,模型中预测正确的结果占比越大,一般我们使都使用准确率来表示测试集得分

召回率(REC)

尽管准确率十分常用,但是在面对类不平衡问题时,它也有很大的局限性

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值