交互式决策树分类器

6
有没有人能推荐一个决策树分类器的实现,可以在Python或Java中使用,并且可以逐步使用?
我找到的所有实现都要求您一次性提供所有功能以进行分类。 然而,在我的应用程序中,我有数百个特征,其中一些特征是需要长时间评估的函数。 由于树的不同分支可能不会使用所有特征,因此一次性向分类器提供所有特征是没有意义的。 我希望分类器可以“询问”特征,依次按照使熵最大减少并提供最终分类的顺序请求特征。

注意,这是一个类似的问题:https://dev59.com/SE_Ta4cB1Zd3GeqPBo_z - Cerin
6个回答

3
我相信目前没有这样的实现,但是决策树非常简单,你应该没有任何问题自己编写这样的程序。
另一方面,我认为即使在运行时计算特征数量也无法提高速度,因为即使某个特征用于制作先前的分割,它仍然必须在其余分割中考虑,因此对于许多记录,它会被重新计算多次(尽管可能会节省内存)。 这在随机森林的情况下可能有意义,因为每次分裂只考虑一个随机的、有限的特征子集——但是 RF 只能用作分类器,它不能构建漂亮的、人类可解释的决策树。

谢谢,我本来就担心这个。我已经写了一个基本算法,但它并不是最优的,所以我希望可能有之前的工作可以参考。 - Cerin

2
通常这样的软件包(特别是Weka中的J48决策树)允许您在特征值位置指定一个缺失值,处理方式与C4.5算法相同:
当我们到达以缺失值为特征进行节点拆分时,我们将实例按比例加权发送到每个可能的分支下,最终在叶子节点累积结果。
当然,你也可以采取更激进的方法,在训练阶段改变树选择拆分属性的方式。一种朴素的方法是为属性分配权重,并将拆分准则(熵、信息增益等)乘以该权重作为惩罚系数,以便“昂贵的属性”不太可能被选为拆分节点。

这对我来说并不是一个切实可行的解决方案。我的领域大约有一百万个功能,但每个示例可能只需要几十个才能得出正确的分类结果。如果必须添加一百万-n个“缺失值”才能进行分类,那将是疯狂的。 - Cerin
@Chris S:对于这么多的特征,我建议在应用任何分类器之前,先使用一些降维技术对数据进行预处理。 - Amro

1

一个选择可能是gaenari,这是一个C++增量决策树算法。

它旨在最小化概念漂移损失。

它基于C++,但可以扩展到Python和Java。


0

那么这是我会做的。根据我之前的问题的答案,我认为你有类似以下的东西。听起来你想要实现一种类似于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

在这个例子中,头痛、发烧、背痛、腿痛等都是影响因素,而疾病名称则是目标。每一行都是单个患者的实际诊断,所以同一种疾病可能会在数据中重复出现。

  1. 修改遍历算法以从根开始。
  2. 如果已经到达叶节点,请告诉用户可能的答案。
  3. 使用用于分割该节点的影响因素向用户展示并询问“是/否”问题(您是否有头痛)。
  4. 如果用户回答“是”,则向左移动。
  5. 如果用户回答“否”,则向右移动。
  6. 转到步骤2

在叶节点,您将有到达该位置的实际行,以便您可以向用户显示可能具有以下之一:

头痛 偏头痛 严重头痛

处方为:blah blah blah。

我们有100万位影响力者,构建这棵树需要一段时间。 如果您想降低影响者数量,可以考虑使用多值影响者,而不是只有是/否选项。 尽管即使对于每种医疗情况,想出100万个独特的是/否问题也很困难。 一旦构建了这棵树,它可以提供任意多的诊断。


谢谢您的详细说明,但我认为您误读了我的问题。我目前已经实现了一个解决方案,但它并不是非常高效。我正在寻找一个现有的实现,可以很容易地支持这个功能。 - Cerin

0

你是在训练时还是在分类时担心这个问题?由于这些时间段是分开的,如果是后者,你可以玩一些技巧,直到非常晚才评估它。在训练期间没有什么技巧可玩。你必须在训练时提供所有功能。然而,由于这可能发生在程序之外,所以你不必太担心计算时间。训练树是最密集的部分。

因此,我建议你将所有数据收集起来,进行训练,从训练中获取产品,然后在将对象发送到树下时使用惰性评估。让你的对象实现一些接口来获取值,你可以使用代码来惰性评估事物。如果一个对象从未触及需要昂贵价值的节点,那么你就不必评估它。

你的昂贵计算可能不会被选择为分裂的选择,因此你消除了在分类时评估它们的需要。一旦你训练和修剪了树,你可能只有3-5个与统计相关的特征。然后你可以通过缓存等方式优化这些特征,使分类变得快速。

如果你想要增量训练,那就是另一回事了,有一些算法可以做到这一点。但是,它们没有很好地解释,你必须深入研究论文才能理解。


我在分类时很关注这个问题,因为我想让分类变得“交互式”。可以想象一下20个问题的游戏。 - Cerin
二十个问题是一个经典的决策树应用。你可以很容易地用决策树来实现它。也许我们误解了,但当我说分类时间时,我的意思是树已经构建好了,你只需要走这个结构。训练意味着你正在构建树。创建一个交互式的行走机制将会很容易。我以为你试图在分类过程中修改树结构,这是不容易做到的。 - chubbsondubs

0
Python决策树包位于https://pypi.python.org/pypi/DecisionTree,具有交互模式以使用决策树。它不是增量式的,但是可以很容易地更改交互操作函数中的代码,以允许您逐步查看结果。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接