6

任何人都可以推荐一个可以增量使用的决策树分类器实现,无论是 Python 还是 Java?

我发现的所有实现都要求您一次向分类器提供所有功能才能获得分类。但是,在我的应用程序中,我有数百个功能,其中一些功能是需要很长时间才能评估的功能。由于并非树的所有分支都可以使用所有特征,因此一次为分类器提供所有特征是没有意义的。我希望分类器一次请求一个特征,以便最大限度地减少熵并提供最终分类。

4

5 回答 5

3

我相信没有这样的实现,但是决策树实现起来非常简单,你自己编写这样的程序应该没有任何问题。
另一方面,我不认为动态计算特征的想法可以提高速度,因为即使某些特征被用来进行先前的分割,仍然必须考虑其余部分,所以对于许多记录来说将被重新计算多次(虽然它可能会节省内存)。这在随机森林的情况下是有意义的,在每个拆分中只考虑随机的、有限的特征子集——仍然 RF 只能用作分类器,它不会为你构建好的、人类可解释的决策树。

于 2010-07-14T22:37:23.840 回答
2

通常这样的包(特别是 Weka 中的 J48 树)允许您指定缺失值来代替特征值,这将与 C4.5 算法的处理方式相同:

当我们到达该属性缺失值的节点分裂时,我们将实例发送到每个可能的分支,其权重与沿着这些分支的训练实例的数量成正比,最终在叶节点处累积结果。

当然,您可以采用更积极的方法,并在训练阶段更改树选择要拆分的属性的方式。一种简单的方法是为属性分配权重,并将分割标准(熵、信息增益等)乘以该权重作为惩罚系数,这样“昂贵的属性”就不太可能被选为分割节点。

于 2010-07-15T20:16:43.180 回答
0

您是否在训练期间或分类期间对此感到担忧?由于这些时期是分开的,你可以玩一些技巧来避免评估它,直到它很晚,如果它是后者。在训练期间没有什么技巧可以玩。您必须在培训时提供所有功能。但是,由于这可能发生在您的程序之外,您不必担心计算时间。训练树是最密集的部分。

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

您的昂贵计算可能不会被选为要拆分的选择,因此您无需在分类时评估它们。一旦你训练和修剪你的树,你可能只有 3-5 个在统计上相关的特征。然后你可以只优化那些带有缓存的特性,这样分类就会很快。

如果你想要增量训练,那完全是另一个蜡球,并且有用于此的算法。但是,它们没有得到很好的解释,你必须深入研究论文才能得到它们。

于 2010-08-25T15:52:04.827 回答
0

所以这就是我要做的。鉴于我之前的问题的答案,我认为您有以下内容。听起来您想实现某种 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 步

在叶节点中,您必须找到到达该位置的实际行,以便您可以将其显示给用户说您可能拥有以下之一:

头痛 偏头痛 断头

处方是:呜呜呜。

拥有 100 万影响者,构建这棵树需要一段时间。如果您想降低它,可以使用多值影响者而不是是/否。尽管即使对于每种医疗状况,也很难想到 100 万个是/否独特的问题。构建树后,它可以提供尽可能多的诊断。

于 2010-08-26T18:39:52.327 回答
0

The Python decision tree package at https://pypi.python.org/pypi/DecisionTree has an interactive mode for using a decision tree. It is not incremental in the sense you need. However, it may be possible to easily change the code in the function for interactive operation to allow you to see the results incrementally.

于 2013-09-11T14:27:57.420 回答