是否可以确保所有类都在 scikit-learn 决策树的输出中表示?

数据挖掘 scikit-学习 决策树
2022-02-11 03:25:11

我正在处理具有六个有序类的序数分类问题,我想将神经网络分类器与尽可能简单且无参数的基线分类器进行比较。

就我而言,我希望基线仅使用最重要的单一功能X神经网络使用的。对于这个特定问题,寻找一组类别阈值是有意义的{ti}这让我分类为:

      X <= t_0 -> class 0
t_0 < X <= t_1 -> class 1
t_1 < X <= t_2 -> class 2
t_2 < X <= t_3 -> class 3
t_3 < X <= t_4 -> class 4
t_4 < X        -> class 5

我查看了一些选项,决策树似乎符合要求。它们非常简单,不需要选择任何自由参数(不像例如k-最近的邻居需要选择一个值k)。如果我使用参数创建树,max_leaf_nodes=6则很容易提取阈值{ti}从拟合后得到的决策树。(如果我可以使用另一种方法来满足或更好地实现这一目标,请在评论中告诉我!)

我将我的数据分为六层,同时确保所有层中的类分布都非常相似。对于这个基线,我通过过采样来平衡类,因为这些类最初有些不平衡。(最常见类和最稀有类的样本比例约为 5:1)。

对于我的六个折叠中的五个,决策树方法在我使用该折叠进行测试而其余用于训练时效果很好。但是,对于用于训练的最后一个折叠组合,我得到了一个决策树,其中第 2 类没有在输出中表示。相反,两个叶节点代表类 1:

结果决策树

有没有办法强制决策树以树的六个叶节点代表六个不同的类的方式构建自己?

1个回答

如果模型没有看到需要,树不会为所有类定义规则是预期的行为。如果您只想比较神经网络的类别预测,您可以使用它tree.predict_proba(...)来获取所有分类概率。在 softmax 之后和二值化之前使用神经网络的输出。

对于对第 2 类知之甚少的折叠,考虑到树的构建方式,概率将为 0 或接近 0。如果您想强制树表示第 2 类并假设它存在于交叉验证的所有折叠中,您可以将学习参数更改为默认值。

另一种但不是很好的方法,它可以在很大程度上对您的数据进行上采样。这很糟糕,因为它会使 CV 的目的无效,但您至少可以看到所有类别的一小部分表示,并且您的平均分类分数将保持相似。

如果每个类有很多,您可以跨折叠对类进行分层。

此外,如果问题是少数类的样本不足,则应考虑在训练期间对少数类进行上采样。https://towardsdatascience.com/dealing-with-imbalanced-classes-in-machine-learning-d43d6fa19d2