为什么我的决策树分类器不能正确解决 XOR 问题?

人工智能 机器学习 Python 决策树 scikit-学习
2021-11-17 04:40:07

我试图解决 XOR 问题,数据集看起来像图像中的那个。

数据集

我绘制了树并得到了这个结果:

在此处输入图像描述

据我了解,这棵树应该有深度 2 和四片叶子。第一个比较很烦人,因为它接近右 x 边框 (0.887)。我尝试了其他参数化,但相同的结果仍然存在。

我使用了下面的代码:

from sklearn.tree import DecisionTreeClassifier    

clf = DecisionTreeClassifier(criterion='gini')
clf = clf.fit(X, y)

fn=['V1','V2']

fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (3,3), dpi=300)

tree.plot_tree(clf, feature_names = fn, class_names=['1', '2'], filled = True);

如果有人能帮助我澄清这个问题,我将不胜感激。

1个回答

我可以为更容易分离的数据集重现此问题:

在此处输入图像描述

它的理想树应该如下:

在此处输入图像描述

但是,当我DecisionTreeClassifier在 scikit-learn 中以最大深度 = 2 多次运行时,它会随机拆分数据集并且永远不会正确。

这是 4 次不同运行的示例:

在此处输入图像描述

问题是 scikit-learn 只有两个衡量分割质量的方法:ginientropy他们都估计了目标和只有一个预测器之间的互信息。

然而,在 XOR 问题中,每个预测变量与目标的互信息为零。您可以在此处阅读有关它的更多信息:链接从中您可以看到这个问题不仅存在于 XOR 中,而且存在于特征之间的交互很重要的任何任务中。

为了解决这个问题,树的构建既不是基于基尼杂质,也不是基于信息增益,而是基于估计目标如何依赖于多个特征的度量,例如多元互信息距离相关性等,这可能会解决简单的问题像 XOR 但在实际任务中可能会失败。当它们失败时很容易找到简单的案例(只需尝试将它们用于一些变量的简单非线性函数的回归)。没有这样的度量可以很好地估计目标对多个交互预测变量的依赖性并且适用于所有问题。

编辑回答 Asher 的评论:我为max_depth=3. 它比 for 好,max_depth=2但仍然不时错过正确的分类。服用max_depth=4几乎总能正确地进行 XOR,但偶尔会出现失误。下面是一些运行max_depth=3和的图片max_depth=4

在此处输入图像描述

在此处输入图像描述

然而,树木max_depth=3因而max_depth=4变得丑陋。它们很丑,不仅因为它们比上面显示的理想树大,而且它们完全掩盖了 XOR 函数。例如,你能破译这棵树的异或吗?

在此处输入图像描述

使用一些修剪技术可能是可能的,但仍然需要额外的工作。