文章目录
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=1−ERR
所以说,准确率越高,模型中预测正确的结果占比越大,一般我们使都使用准确率来表示测试集得分
召回率(REC)
尽管准确率十分常用,但是在面对类不平衡问题时,它也有很大的局限性
假设我们使用准确率为99.5%的超级棒棒模型去预测1005位体检者是否可能患有癌症&