Tensorflow 分类 - 最大化某些类的准确性

数据挖掘 分类 张量流 多类分类
2022-03-04 02:27:21

我正在做一些实验并尝试训练一个外汇交易模型来根据三个类别进行分类:

  • 无动作

输入行标记为buy稍后某个时间的价格比当前价格高sellX% 时,以及未来价格比当前价格低 X% 时标记。所有其他行都标记为no action,这是大多数行。

我遇到的问题是这些no action项目约占总数据集的 84%,但是该模型no action几乎 99% 的时间都在预测。我想这样做的原因是模型的目标是最大的准确性,它没有意识到no action物品是没有用的。

因此,如果可能的话,我希望模型只关心buy和项目,以最大限度地提高准确性sell以希望增加预测的数量(在某种程度上这有助于模型的盈利能力)。buysell

我认为我可以做到这一点的一种方法是增加类的数量并让每个类代表总项目的大致相等的百分比,但是,这会很混乱,所以我很好奇是否有直接影响的方法计算精度的方式。


编辑: 我在此处添加了其他详细信息:CNN 测试结果中的可变性

但重点仍然是最大限度地提高买卖类别的准确性。查看 Tensorflow 指标(https://www.tensorflow.org/api_docs/python/tf/metrics),我想我可以使用两个单独的二进制分类器并使用TruePositives指标,但是,我更愿意保持简单和在一个模型中获取所有内容。

3个回答

解决此问题的最佳方法是更改​​ X 的值。例如,如果您使用 -%2 和 %2 作为分类限制,例如 sell(<-%2)、buy(>%2) 和 no否则采取行动;您可以将其减少到 %1,这反过来会减少属于此类的样本数量,同时增加买卖类中的样本数量。

如果你想保持这个值,那么要走的路就是欠采样:在训练时,你从每个类中抽取相同数量的样本,这意味着你忽略了没有动作类的部分数据。所以你的训练和验证集将是平衡的,你可以使用准确性作为一个适当的指标。

如果这对您来说也不是一个好的选择,另一种方法是尝试更改每个输出的分类阈值,以便它们的可能结果大致相等。但这可能有点复杂,因为您有 3 个类(对于 2 个类,这可以通过将分类阈值从 0.5 更改为相对简单的方式来完成)。

如果这些都不适合您,您可以在此处找到解决不平衡问题的更通用方法如果您希望使用不同的指标,可以在此处列出并详细讨论最流行的指标您可能不需要定义自定义指标,因为几乎每个选择都有一个

我建议你玩样品重量。我的建议是尝试更多地考虑采取行动,这样你就可以配置更多的惩罚,而不是预测买入或损失。请记住,这也可能导致误报(您被告知在不应该采取行动时采取行动),因此请对此权衡进行一些测试。

也许另一个想法是简单地尝试使用二进制分类(无论是否采取行动),然后根据您的领域专业知识应用一些基于规则的行动。人们多年来一直使用算法交易,这种方法/步骤很可能会奏效,甚至是必需的。确实这不是一件容易的事,但在现实生活/机器学习模型的部署中,您可能必须链接程序以更好地自动化流程。你不能太贪心,把所有的负载都放在一个模型上,尤其是当任务变得更加复杂时。

另一个注意事项,说你的模型旨在最大化准确性并不完全正确(因为你的模型是基于损失学习的,而准确性只是一个评估指标,碰巧最小化损失最终会提高准确性)。

作为 84% 的数据,任何模型都会尝试收敛到无动作类。我会同意 SuperCodeBrah 对您的数据集使用欠采样的意见。我遇到了类似的情况,但是对低级数据进行过采样不起作用,所以我选择了欠采样并使用了双向 LSTM。它确实收敛到一个平衡的模型。是的,CNN 对数字很有效,但我建议你应用双向 LSTM。

您可以结合 LSTM 和 Dropout 层应用不同的度量,以降低过度拟合的风险,因为它在不平衡的数据情况下很常见。

希望这个小实验能奏效