我有一个二元类数据集(0/1),其中“0”类的比例严重失衡(大约30000对1500)。每个实例有7个特征,没有缺失值。
当我使用J48或其他任何树分类器时,几乎所有的“1”实例都被错误分类为“0”。
将分类器设置为“不修剪”,将每个叶子节点的最小实例数设置为1,将置信因子设置为1,添加一个包含实例ID号的虚拟属性——所有这些都没有帮助。
我就是无法创建一个过拟合我数据的模型!
我还尝试了Weka提供的几乎所有其他分类器,但得到了类似的结果。
使用IB1可以获得100%的准确率(在训练集上训练),所以这不是多个实例具有相同特征值但不同类别的问题。
我如何创建一个完全不修剪的树?或者如何强制Weka过拟合我的数据?
谢谢。
更新: 这太荒谬了。我只使用了大约3100个负例和1200个正例,这就是我得到的树(未修剪的):
J48 unpruned tree------------------F <= 0.90747: 1 (201.0/54.0)F > 0.90747: 0 (4153.0/1062.0)
不用说,IB1仍然给出100%的精确度。
更新2: 不知道我怎么会错过——未修剪的SimpleCart有效,并且在训练集上训练时给出100%的准确率;修剪过的SimpleCart没有J48那么偏见,并且具有不错的假阳性和假阴性比例。
回答:
快速而粗糙的解决方案是重新采样。丢弃除1500个以外的所有正例,并在一个平衡的数据集上进行训练。我相当确定Weka中有一个重新采样的组件可以做到这一点。
另一个解决方案是使用对每个类有不同成本的分类器。我相当确定libSVM允许你这样做,我知道Weka可以包装libSVM。不过我已经有一段时间没用Weka了,所以在这里我帮不上什么实际的忙。