交互式决策树分类器

Posted

技术标签:

【中文标题】交互式决策树分类器【英文标题】:Interactive Decision Tree Classifier 【发布时间】:2011-03-15 08:23:48 【问题描述】:

谁能推荐一个可以增量使用的决策树分类器实现(无论是 Python 还是 Java)?

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

【问题讨论】:

注意,这是一个类似的问题:***.com/questions/3411279/… 【参考方案1】:

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

【讨论】:

谢谢,我害怕那个。我目前已经编写了一个基本算法,但它不是最优的,所以我希望有可能事先解决这个问题。【参考方案2】:

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

当我们到达节点分裂时 具有缺失值的属性,我们 尽可能发送实例 分支加权成正比 训练实例的数量 沿着那些树枝,最终 在叶子上累积结果 节点。

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

【讨论】:

这并不是一个实用的解决方案。我的域有大约 100 万个特征,但每个示例可能只需要几十个就可以得到正确的分类。仅仅为了得到一个分类就必须添加 100 万 - n 个“缺失值”是很疯狂的。 @Chris S:对于如此大量的特征,我会先使用一些降维技术对数据进行预处理,然后再应用任何分类器。【参考方案3】:

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

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

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

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

【讨论】:

我在分类期间很担心这一点,因为我想让分类“互动”。想想游戏的 20 个问题。 二十题是经典的决策树应用。你可以很容易地用决策树来实现它。也许我们的电线交叉了,但当我说分类时间时,我的意思是树已经建成,你只是在走那个结构。培训意味着您正在构建树。创建交互式步行机制将很容易。我以为你试图在分类过程中修改树结构,这并不容易。【参考方案4】:

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

在这个例子中,头痛、发烧、背痛、腿痛等是影响因素,疾病名称是目标。每行都是对单个患者的实际诊断,因此可以在数据中多次重复一种疾病。

    修改游走算法以从根开始。 如果您到达一片叶子,请告诉用户可能的答案。 将用于拆分此节点的影响者呈现给用户,并询问“是/否”问题(您是否头痛)。 如果用户回答“是”,请向左走。 如果用户回答“否”,则右转。 转到第 2 步

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

头痛 偏头痛 断头

处方是:等等等等。

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

【讨论】:

感谢您的详细说明,但我认为您误读了我的问题。我目前已经实施了一个解决方案,但它并不是非常有效。我正在寻找可以轻松支持这一点的预先存在的实现。【参考方案5】:

Python 决策树包位于 https://pypi.python.org/pypi/DecisionTree 具有使用决策树的交互模式。在您需要的意义上,它不是增量的。但是,可以轻松更改函数中的代码以进行交互操作,以让您逐步查看结果。

【讨论】:

以上是关于交互式决策树分类器的主要内容,如果未能解决你的问题,请参考以下文章

决策树决策树与Jupyter小部件的交互式可视化

用cart(分类回归树)作为弱分类器实现adaboost

决策树与随机森林

Python 决策树分类器

将 OneHotEncoder 用于决策树分类器中的分类特征

决策树分类器 sklearn 中节点的不同颜色表示啥?