如何处理这种不平衡类偏斜的数据集?

时间:2016-09-15 13:20:58

标签: machine-learning classification random-forest decision-tree ensemble-learning

我必须处理Class Imbalance Problem并对输入测试数据集进行binary-classification,其中大部分class-label为1(另一个class-label为0),在训练数据中-set。

例如,以下是培训数据的一部分:

93.65034,94.50283,94.6677,94.20174,94.93986,95.21071,1
94.13783,94.61797,94.50526,95.66091,95.99478,95.12608,1
94.0238,93.95445,94.77115,94.65469,95.08566,94.97906,1
94.36343,94.32839,95.33167,95.24738,94.57213,95.05634,1
94.5774,93.92291,94.96261,95.40926,95.97659,95.17691,0
93.76617,94.27253,94.38002,94.28448,94.19957,94.98924,0

最后一列是class-label - 01。实际的数据集非常偏离10:1类的比例,大约700个样本的class label为0,而其余6800的class label为1。

上面提到的只是给定数据集中所有样本中的一小部分,但实际数据集包含大约90%个样本class-label1,其余class-label0,尽管所有样本或多或少都非常相似。

哪种分类器最适合处理这种数据集?

我已尝试logistic-regression以及svm class-weight参数设置为"balanced",但准确度没有显着提高。

2 个答案:

答案 0 :(得分:0)

  

但准确度没有显着提高。

准确性不是最佳选择(例如,请参阅Accuracy paradox)。通过始终预测class-label 0,只需10:1的比例,您就可以轻松获得90%的准确度。

一些好的起点是:

  • 尝试不同的效果指标。例如。 F1-scoreMatthews correlation coefficient

  • "再取样"数据集:从代表性过低的类(过度采样)中添加示例/从过度代表的类中删除实例(欠采样;你应该有很多数据)

  • 一个不同的观点:anomaly detection是对不平衡数据集的一个很好的尝试

  • 另一种算法是另一种可能性,但不是银枪。可能你应该从decision trees开始(通常在不平衡的数据集上表现良好)

编辑(现在知道你正在使用scikit-learn

来自class_weight(scikit-learn)参数的权重用于训练分类器(所以balanced可以)但是精确度是一个很差的选择,以了解它的表现如何。

sklearn.metrics模块为measure classification performance实现了多个损失,分数和效用函数。另请查看How to compute precision, recall, accuracy and f1-score for the multiclass case with scikit learn?

答案 1 :(得分:0)

您是否尝试绘制ROC曲线和AUC曲线来检查您的参数和不同的阈值?如果没有,那应该给你一个很好的起点。