我需要处理类别不平衡问题
,并对输入的测试数据集进行二分类
,在训练数据集中,大多数类别标签为1(另一个类别标签为0)。
例如,以下是训练数据的一部分:
93.65034,94.50283,94.6677,94.20174,94.93986,95.21071,194.13783,94.61797,94.50526,95.66091,95.99478,95.12608,194.0238,93.95445,94.77115,94.65469,95.08566,94.97906,194.36343,94.32839,95.33167,95.24738,94.57213,95.05634,194.5774,93.92291,94.96261,95.40926,95.97659,95.17691,093.76617,94.27253,94.38002,94.28448,94.19957,94.98924,0
其中最后一列是类别标签
– 0
或1
。实际数据集非常倾斜,类别比例为10:1
,即大约有700个样本的类别标签
为0,而其余6800个样本的类别标签
为1。
上述只是数据集中所有样本的一部分,但实际数据集中大约有90%
的样本类别标签
为1
,其余的类别标签
为0
,尽管所有样本或多或少都很相似。
处理这种数据集应该使用哪种分类器比较好?
我已经尝试过使用逻辑回归
以及将class-weight
参数设置为"balanced"
的svm
,但在准确率上没有显著改善。
回答:
但在准确率上没有显著改善。
准确率并不是评估的正确方法(例如,请参阅准确率悖论)。在类别比例为10:1的情况下,只需始终预测类别标签0
,就可以轻易获得90%的准确率。
一些好的起点包括:
-
“重新采样”数据集:增加来自代表性不足类别的样本(过采样)/ 删除来自代表性过剩类别的实例(欠采样;你应该有大量数据)
-
从不同的角度出发:异常检测对于不平衡数据集是一个不错的尝试
-
尝试不同的算法也是一个可能性,但不是万能的解决方案。你可能应该从决策树开始(在不平衡数据集上通常表现良好)
编辑(现在知道你在使用scikit-learn
)
class_weight
(scikit-learn)参数的权重用于训练分类器(所以balanced
是可以的),但准确率并不是评估其性能的好方法。
sklearn.metrics
模块实现了几种损失、分数和效用函数,用于衡量分类性能。还可以参考如何使用scikit-learn计算多类别情况下的精确率、召回率、准确率和F1分数?。