我在数据集上有一个多类分类问题(有6个目标类)。训练数据的类标签分布有偏差:下面是每个类标签的分布(1到6)< / p>
(array([174171, 12, 29, 8285, 9996, 11128]),
我使用vowpal wabbit的oaa方案进行分类,并为每个示例尝试了默认权重1.0。但是对于大多数模型而言,这只会导致模型在评估中为所有示例预测1.0(因为标签1在训练集中具有非常大的表示)。
我现在尝试使用不同的权重,我可以将其应用于每个类的示例,以帮助提高分类器的性能。
关于决定每个示例权重的技术的任何指针或实用技巧都非常有用。一种可能的技术是根据频率对反例进行反比。不幸的是,这似乎导致分类器偏向于标签2和3,并且在评估中几乎所有内容都预测了2和3。
模型选择是否会在决定权重方面发挥作用。我正在试验神经网络以及逻辑和铰链损失函数。
答案 0 :(得分:4)
可能有更好的方法,但我会像你一样开始,根据标签的稀有性对示例进行反加权,如下所示:
标签数量总和= 174171 + 12 + 29 + 8285 + 9996 + 11128 = 203621
所以
标签1出现174171次(占总数的85.5%)将被加权:203621/174171 = 1.16909
标签2出现12次(最稀有)将被加权:203621/12 = 16968.4
等等。
确保列车中的示例已经过适当的洗牌。这对在线学习至关重要。将相同的标签示例集中在一起是导致在线性能非常差的一个因素。
如果你确实洗得很好,并且你在新例子上表现不佳,你可以不那么积极地重新加权,例如取反量的sqrt()
,然后如果那仍然过于激进,则切换到{{1反重量等等。
另一种方法是使用一种新的成本敏感的多类选项,例如: log()
github上的VW wiki有一些例子,详细介绍了如何使用这些选项及其训练集格式。
选择的损失函数肯定会产生影响。但请注意,通常情况下,在--csoaa
中使用多类或任何其他基于缩减的选项时,应单独留下vw
并让算法使用其内置默认值。如果您尝试使用不同的损失函数并获得比减少内置损失函数更好的结果,--loss_function
的开发人员可能会对此感兴趣,请将其报告为错误。