我找到的所有实现都要求您一次性提供所有功能以进行分类。 然而,在我的应用程序中,我有数百个特征,其中一些特征是需要长时间评估的函数。 由于树的不同分支可能不会使用所有特征,因此一次性向分类器提供所有特征是没有意义的。 我希望分类器可以“询问”特征,依次按照使熵最大减少并提供最终分类的顺序请求特征。
那么这是我会做的。根据我之前的问题的答案,我认为你有类似以下的东西。听起来你想要实现一种类似于20个问题的方法。
在20个问题中,你有肯定/否定的答案,所以二叉树最适合。但是,你可以添加多项选择选项,但用户只能选择一个选项。因此,该算法假设您已经预先训练了您的树,并且它已经从您希望使用的数据集构建。
例如,假设我们正在尝试进行医学诊断,因此我们的数据可能如下所示:
Disease Name Head Ache Fever Back Pain Leg Pain Blurry Vision Hearing Loss
Common Cold Yes Yes No No No No
Migraine Yes No No No Yes No
Herpes No Yes No No No No
在这个例子中,头痛、发烧、背痛、腿痛等都是影响因素,而疾病名称则是目标。每一行都是单个患者的实际诊断,所以同一种疾病可能会在数据中重复出现。
在叶节点,您将有到达该位置的实际行,以便您可以向用户显示可能具有以下之一:
头痛 偏头痛 严重头痛
处方为:blah blah blah。
我们有100万位影响力者,构建这棵树需要一段时间。 如果您想降低影响者数量,可以考虑使用多值影响者,而不是只有是/否选项。 尽管即使对于每种医疗情况,想出100万个独特的是/否问题也很困难。 一旦构建了这棵树,它可以提供任意多的诊断。
你是在训练时还是在分类时担心这个问题?由于这些时间段是分开的,如果是后者,你可以玩一些技巧,直到非常晚才评估它。在训练期间没有什么技巧可玩。你必须在训练时提供所有功能。然而,由于这可能发生在程序之外,所以你不必太担心计算时间。训练树是最密集的部分。
因此,我建议你将所有数据收集起来,进行训练,从训练中获取产品,然后在将对象发送到树下时使用惰性评估。让你的对象实现一些接口来获取值,你可以使用代码来惰性评估事物。如果一个对象从未触及需要昂贵价值的节点,那么你就不必评估它。
你的昂贵计算可能不会被选择为分裂的选择,因此你消除了在分类时评估它们的需要。一旦你训练和修剪了树,你可能只有3-5个与统计相关的特征。然后你可以通过缓存等方式优化这些特征,使分类变得快速。
如果你想要增量训练,那就是另一回事了,有一些算法可以做到这一点。但是,它们没有很好地解释,你必须深入研究论文才能理解。