任何人都可以推荐使用Python或Java的决策树分类器实现,可以逐步使用吗?
我发现的所有实现都要求您一次性为分类器提供所有功能,以便进行分类。但是,在我的应用程序中,我有数百个功能,其中一些功能可能需要很长时间才能进行评估。由于并非树的所有分支都可以使用所有特征,因此同时为分类器提供所有特征是没有意义的。我希望分类器询问功能,一次一个,按顺序进行,以便最大限度地减少熵并提供最终分类。
答案 0 :(得分:3)
我相信没有这样的实现,但是决策树的实现非常简单,你自己编写这样的程序就不会有任何问题。
另一方面,我不认为动态计数功能的想法可以提高速度,因为即使某些功能用于进行一些先前的拆分,它仍然必须考虑其余的,所以对于许多记录它将被重新计算多次(它可能会节省内存)。
在随机森林的情况下这可能是有意义的,其中在每次分割时仅考虑随机的,有限的特征子集 - 仍然RF仅可用作分类器,它不会构建您可靠的,人类可解释的决策树。
答案 1 :(得分:2)
通常这样的包(特别是Weka中的J48树)允许您指定一个缺失值来代替特征值,这将与C4.5算法的处理方式相同:
当我们到达节点分裂时 那个缺少价值的属性,我们 每次都可以发送实例 分支加权成比例 培训实例的数量 最终,这些分支 在叶子上积累结果 节点
当然,您可以采用更积极的方法,并在训练阶段更改树选择要拆分的属性的方式。一种天真的方式是为属性分配权重并将该权重的分裂标准(熵,信息增益......)乘以惩罚系数,以便“昂贵的属性”不太可能被选择为分裂节点。
答案 2 :(得分:0)
您是否在培训期间或分类时关注此问题?由于这些时期是分开的,你可以玩耍,以避免评估它,直到它为时已晚,如果是晚期。在训练期间你不能玩耍。您必须在培训时提供所有功能。但是,由于这可能发生在程序之外,因此您不必担心计算时间。训练树是最密集的部分。
因此,我建议将所有数据放在一起,进行训练,从训练中获取产品,然后在将对象发送到树中时对对象使用延迟评估。让你的对象实现一些接口来获取值,你可以使用代码来懒惰地评估事物。如果一个对象永远不会遇到需要昂贵值的节点,那么你就不必对它进行评估。
您可能不会选择昂贵的计算作为拆分选择,因此您无需在分类时对其进行评估。一旦您训练和修剪树,您可能只有3-5个具有统计相关性的特征。然后,您可以仅使用缓存来优化这些功能,因此分类很快。
如果你想要增量训练,那就是另一个蜡球,并且有算法。但是,他们没有得到很好的解释,你必须深入研究论文才能得到它们。
答案 3 :(得分: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
在这个例子中,头部疼痛,发烧,背部疼痛,腿部疼痛等是影响者,疾病名称是目标。每一行都是单个患者的实际诊断,因此可以在数据中多次重复疾病。
在叶子节点中,您将需要实际的行才能到达该位置,以便您可以将其显示给用户,说明您可能拥有以下其中一个:
头痛 偏头痛 断头
处方是:等等等等。
有100万影响者需要一段时间来构建树。如果你想降低它可能使用多值影响因子而不是是/否。虽然即使对于每种疾病都很难想到100万是/否的独特问题。构建树后,它可以提供任意数量的诊断。
答案 4 :(得分:0)
Python决策树包 https://pypi.python.org/pypi/DecisionTree 具有使用决策树的交互模式。在您需要的意义上,它不是增量的。但是,可以轻松更改交互操作功能中的代码,以便逐步查看结果。