当前位置: 首页 > 面试题库 >

从SKlearn决策树中检索决策边界线(x,y坐标格式)

岑和风
2023-03-14
问题内容

我正在尝试在外部可视化平台上创建表面图。我正在使用sklearn决策树文档页面上介绍的虹膜数据集。我也使用相同的方法来创建决策曲面图。我的最终目标不是matplot lib
visual,所以从这里我将数据输入到可视化软件中。要做到这一点,我刚打电话flatten()tolist()xxyyZ写下了包含这些列出了JSON文件

问题是当我尝试绘制它时,我的可视化程序崩溃了。事实证明数据太大。展平时,列表的长度>
86,000。这是由于步长/图步很小的事实.02。因此,根据模型的预测,它实际上是跨数据最小值和最大值的区域迈出了第一步,并根据数据绘制/填充数据。我将尺寸缩小到只有2000个数组,并注意到坐标只是来回的线(最终包含整个坐标平面)。

问题:
我可以检索决策边界线本身的x,y坐标(而不是遍历整个平面)吗?理想情况下,仅包含每条线的转折点的列表。或者,是否可能存在其他完全不同的方式来重新创建此图,从而使其计算效率更高?

可以通过以下方式将contourf()调用替换为countour()

我只是不知道如何获取有关这些线上的数据(通过xxyyZ或其他可能的方式?)。

注意:
我不挑剔包含行格式的列表/或数据结构的确切格式,只要其计算效率高即可。例如,对于上面的第一个图,某些红色区域实际上是预测空间中的孤岛,因此这可能意味着我们必须像对待它自己的线一样处理它。我猜只要将类与x,y坐标耦合,使用多少个数组(包含坐标)来捕获决策边界就无关紧要。


问题答案:

决策树没有很好的边界。它们具有多个边界,这些边界将要素空间按层次划分为矩形区域。

在我的Node
Harvest的
实现中,我编写了解析scikit决策树并提取决策区域的函数。对于这个答案,我修改了部分代码以返回与树决策区域相对应的矩形列表。使用任何绘图库绘制这些矩形应该很容易。这是使用matplotlib的示例:

n = 100
np.random.seed(42)
x = np.concatenate([np.random.randn(n, 2) + 1, np.random.randn(n, 2) - 1])
y = ['b'] * n + ['r'] * n
plt.scatter(x[:, 0], x[:, 1], c=y)

dtc = DecisionTreeClassifier().fit(x, y)
rectangles = decision_areas(dtc, [-3, 3, -3, 3])
plot_areas(rectangles)
plt.xlim(-3, 3)
plt.ylim(-3, 3)

不同颜色的区域相遇的地方都有决策边界。我想只要花些力气就可以提取这些边界线,但我会将其留给任何有兴趣的人。

rectangles是一个numpy数组。每一行对应一个矩形,列为[left, right, top, bottom, class]

更新:适用于虹膜数据集

虹膜数据集包含三个类别,而不是2个类别,如示例中所示。因此,我们必须在plot_areas函数中添加另一种颜色:color = ['b', 'r', 'g'][int(rect[4])]。此外,数据集是4维的(它包含四个要素),但是我们只能在2D中绘制两个要素。我们需要选择要绘制的特征并告诉decision_area功能。该函数带有两个参数,x并且y-这分别是x和y轴上的功能。默认值x=0, y=1适用于具有多个功能的任何数据集。但是,在虹膜数据集中,第一个维度不是很有趣,因此我们将使用其他设置。

该函数decision_areas也不知道数据集的范围。决策树通常具有向无穷大延伸的开放决策范围(例如,当 萼片长度 小于 xyz时,
它就是B类)。在这种情况下,我们需要人为地缩小绘图范围。我-3..3为示例数据集选择了数据,但对于虹膜数据集选择了其他范围是适当的(永远不会出现负值,某些功能会超过3)。

在这里,我们在0..7和0..5范围内的最后两个特征上绘制决策区域:

from sklearn.datasets import load_iris
data = load_iris()
x = data.data
y = data.target
dtc = DecisionTreeClassifier().fit(x, y)
rectangles = decision_areas(dtc, [0, 7, 0, 5], x=2, y=3)
plt.scatter(x[:, 2], x[:, 3], c=y)
plot_areas(rectangles)

请注意,左上方的红色和绿色区域之间有奇怪的重叠。发生这种情况是因为树在四个维度上做出决策,但我们只能显示两个维度。真的没有一个干净的方法可以解决此问题。高维分类器在低维空间中通常没有很好的决策边界。

因此,如果您对分类器更感兴趣,那么您将获得。您可以沿尺寸的各种组合生成不同的视图,但是表示的有用性受到限制。

但是,如果您对数据比对分类器更感兴趣,则可以在拟合之前限制维数。在这种情况下,分类器仅在二维空间中做出决策,我们可以绘制出不错的决策区域:

from sklearn.datasets import load_iris
data = load_iris()
x = data.data[:, [2, 3]]
y = data.target
dtc = DecisionTreeClassifier().fit(x, y)
rectangles = decision_areas(dtc, [0, 7, 0, 3], x=0, y=1)
plt.scatter(x[:, 0], x[:, 1], c=y)
plot_areas(rectangles)

最后,这是实现:

import numpy as np
from collections import deque
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import _tree as ctree
import matplotlib.pyplot as plt
from matplotlib.patches import Rectangle


class AABB:
    """Axis-aligned bounding box"""
    def __init__(self, n_features):
        self.limits = np.array([[-np.inf, np.inf]] * n_features)

    def split(self, f, v):
        left = AABB(self.limits.shape[0])
        right = AABB(self.limits.shape[0])
        left.limits = self.limits.copy()
        right.limits = self.limits.copy()

        left.limits[f, 1] = v
        right.limits[f, 0] = v

        return left, right


def tree_bounds(tree, n_features=None):
    """Compute final decision rule for each node in tree"""
    if n_features is None:
        n_features = np.max(tree.feature) + 1
    aabbs = [AABB(n_features) for _ in range(tree.node_count)]
    queue = deque([0])
    while queue:
        i = queue.pop()
        l = tree.children_left[i]
        r = tree.children_right[i]
        if l != ctree.TREE_LEAF:
            aabbs[l], aabbs[r] = aabbs[i].split(tree.feature[i], tree.threshold[i])
            queue.extend([l, r])
    return aabbs


def decision_areas(tree_classifier, maxrange, x=0, y=1, n_features=None):
    """ Extract decision areas.

    tree_classifier: Instance of a sklearn.tree.DecisionTreeClassifier
    maxrange: values to insert for [left, right, top, bottom] if the interval is open (+/-inf) 
    x: index of the feature that goes on the x axis
    y: index of the feature that goes on the y axis
    n_features: override autodetection of number of features
    """
    tree = tree_classifier.tree_
    aabbs = tree_bounds(tree, n_features)

    rectangles = []
    for i in range(len(aabbs)):
        if tree.children_left[i] != ctree.TREE_LEAF:
            continue
        l = aabbs[i].limits
        r = [l[x, 0], l[x, 1], l[y, 0], l[y, 1], np.argmax(tree.value[i])]
        rectangles.append(r)
    rectangles = np.array(rectangles)
    rectangles[:, [0, 2]] = np.maximum(rectangles[:, [0, 2]], maxrange[0::2])
    rectangles[:, [1, 3]] = np.minimum(rectangles[:, [1, 3]], maxrange[1::2])
    return rectangles

def plot_areas(rectangles):
    for rect in rectangles:
        color = ['b', 'r'][int(rect[4])]
        print(rect[0], rect[1], rect[2] - rect[0], rect[3] - rect[1])
        rp = Rectangle([rect[0], rect[2]], 
                       rect[1] - rect[0], 
                       rect[3] - rect[2], color=color, alpha=0.3)
        plt.gca().add_artist(rp)


 类似资料:
  • 问题内容: 我目前正在使用python的scikit库使用线性内核执行多类SVM。样本训练数据和测试数据如下: 型号数据: 我想绘制决策边界并可视化数据集。有人可以帮忙绘制此类数据吗? 上面给出的数据只是模拟数据,因此可以随时更改值。如果至少您可以建议要执行的步骤,这将很有帮助。提前致谢 问题答案: 您只需选择2个功能即可。 原因是您无法绘制7D图。选择2个要素后,仅将其用于决策面的可视化。 (我

  • 主要内容:决策树算法应用,决策树实现步骤,决策树算法应用本节基于 Python Sklearn 机器学习算法库,对决策树这类算法做相关介绍,并对该算法的使用步骤做简单的总结,最后通过应用案例对决策树算法的代码实现进行演示。 决策树算法应用 在 sklearn 库中与决策树相关的算法都存放在 模块里,该模块提供了 4 个决策树算法,下面对这些算法做简单的介绍: 1) .DecisionTreeClassifier() 这是一个经典的决策树分类算法,它提供

  • 我需要做一个决策树,并通过图形上的标签来表示数据(如两个插图所示)。我对决策树没有问题,不幸的是,点没有输入图形中。我尝试了代码中的几个变化。代码来自Scikit Learning网站在iris数据集上绘制决策树的决策面 下面有一个使用的数据示例(X、Y、C5)(来自Excel文件): 输出[]:[8.0、9.0、9.0、9.0、9.0、10.0、10.0、11.0、11.0、11.0、11.0、

  • 问题内容: 我对matplotlib非常陌生,并且正在从事一些简单的项目以熟悉它。我想知道如何绘制决策边界,决策边界是[w1,w2]形式的权重向量,它使用matplotlib将两个类(例如C1和C2)基本分开。 如果是这样,是否像从(0,0)到点(w1,w2)画一条线一样简单(因为W是权重“向量”),如果需要,如何像在两个方向上一样进行扩展? 现在我要做的是: 提前致谢。 问题答案: 决策边界通常

  • 决策树 概述 决策树(Decision Tree)算法是一种基本的分类与回归方法,是最经常使用的数据挖掘算法之一。我们这章节只讨论用于分类的决策树。 决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是 if-then 规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。 决策树学习通常包括 3 个步骤:特征选择、决策树的生成和决策树的修剪。 决策树 场景

  • 决策树是一种常见的机器学习方法,它基于二元划分策略(类似于二叉树),如下图所示 一棵决策树包括一个根节点、若干个内部节点和若干个叶节点。叶节点对应决策的结果,而其他节点对应一个属性测试。决策树学习的目的就是构建一棵泛化能力强的决策树。决策树算法的优点包括 算法比较简单; 理论易于理解; 对噪声数据有很好的健壮性。 使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选

  • 接下来就要讲决策树了,这是一类很简单但很灵活的算法。首先要考虑决策树所具有的非线性/基于区域(region-based)的本质,然后要定义和对比基于区域算则的损失函数,最后总结一下这类方法的具体优势和不足。讲完了这些基本内容之后,接下来再讲解通过决策树而实现的各种集成学习方法,这些技术很适合这些场景。 1 非线性(Non-linearity) 决策树是我们要讲到的第一种内在非线性的机器学习技术(i

  • 和支持向量机一样, 决策树是一种多功能机器学习算法, 即可以执行分类任务也可以执行回归任务, 甚至包括多输出(multioutput)任务. 它是一种功能很强大的算法,可以对很复杂的数据集进行拟合。例如,在第二章中我们对加利福尼亚住房数据集使用决策树回归模型进行训练,就很好的拟合了数据集(实际上是过拟合)。 决策树也是随机森林的基本组成部分(见第 7 章),而随机森林是当今最强大的机器学习算法之一