【问题标题】:Scikit-learn and data visusalisation: Why do I have to use ravel when I use predict?Scikit-learn 和数据可视化:为什么我在使用 predict 时必须使用 ravel?
【发布时间】:2016-06-19 02:05:00
【问题描述】:

我这里有一个函数,可以可视化某个分类器(如逻辑回归或简单的感知器模型)所做的分类。但我没有得到几件事:

X 有 n 个示例,只有 2 个特征。

  1. 为什么我必须使用 xx1.ravel() 和 xx2.ravel() 然后为分类器.predict 转置整个数组?为什么我不能使用原始维度简单地预测结果?

2.为什么我需要将 Z 重新整形回原来的 xx1 形状?

  1. 为什么需要创建网格网格来绘制散点图?网格中的特定点是否像代表网格上某个点的“像素”一样?为什么还需要这个?

  2. 什么是 idx 中的 idx 值,枚举中的 cl(np.unique(y)),当我使用 unique 时得到的只是结果的唯一 id?

  3. 散点函数中c = cmap(idx)有什么用?为什么 cmap 可以接受参数?

对于后面可能不符合主题问题的问题,我深表歉意。 代码取自 Python 机器学习一书。

def plot_decision_regions(X, y, classifier, test_idx = None, resolution = 0.002):
    #Setup marker generator and color map
    markers = ('s', 'x', 'o', '^', 'v')
    colors = ('red','blue','green','gray','cyan')
    cmap = ListedColormap(colors[:len(np.unique(y))])

    #MESHGRID - plot decision surface
    x1_min, x1_max = X[:, 0].min(), X[:, 0].max()
    x2_min, x2_max = X[:, 1].min(), X[:, 1].max()
    xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
    # print 'meshgrid:', xx1, xx2

    #CLASSIFIER PREDICT
    Z = classifier.predict(np.array([xx1.ravel(), xx2.ravel()]).T)
    Z = Z.reshape(xx1.shape)
    plt.contourf(xx1, xx2, Z, alpha = 0.4, cmap=cmap)
    plt.xlim(xx1.min(), xx1.max())
    plt.ylim(xx2.min(), xx2.max())

    for idx, cl in enumerate(np.unique(y)):
        plt.scatter(x = X[y == cl, 0], y = X[y == cl, 1], alpha = 0.8, c = cmap(idx), marker = markers[idx], label =cl)

    #highlight test samples
    if test_idx:
        XTest, yTest = X[test_idx, :], y[test_idx]
        plt.scatter(XTest[:,0], XTest[:,1], c = '', alpha = 1.0, linewidth = 1, marker = 'o', s = 55, label = 'test set')

【问题讨论】:

  • “原始尺寸”是什么意思?
  • 您的问题 3-5 与您的问题的标题没有真正的关系,可能应该单独提出。 (问题 3 没有意义,因为这段代码没有使用 meshgrid 作为散点图。)

标签: python machine-learning scikit-learn data-visualization


【解决方案1】:

meshgrid 和 ravel 的这项业务只是一种获取坐标范围的笛卡尔积的方法,以获得一组 (x, y) 坐标对,表示区域中的各个点。

分类器期望其输入是一个 Nx2 数组,其中 N 是样本数(即您要预测其类别的案例)。它需要两列,因为有两个特征。

Meshgrid 生成两个数组,一个包含指定矩形区域中点的 X 坐标,另一个包含这些点的 Y 坐标。通过使用.ravel(),您可以将这些数组展开到坐标列表中。这只是获取所需坐标范围的笛卡尔积的一种有点混乱的方式。换句话说,这是:

xx1, xx2 = np.meshgrid(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution))
coord1, coord2 = xx1.ravel(), xx2.ravel()

实际上与此相同:

coord1, coord2 = zip(*itertools.product(np.arange(x1_min, x1_max, resolution), np.arange(x2_min, x2_max, resolution)))

你可以通过一个简单的例子看到这一点:

>>> xx1, xx2 = np.meshgrid(np.arange(3), np.arange(2))
>>> coord1, coord2 = xx1.ravel(), xx2.ravel()
>>> coord1
array([0, 1, 2, 0, 1, 2])
>>> coord2
array([0, 0, 0, 1, 1, 1])
>>> coord1, coord2 = zip(*itertools.product(np.arange(3), np.arange(2)))
>>> coord1
(0, 0, 1, 1, 2, 2)
>>> coord2
(0, 1, 0, 1, 0, 1)

您可以看到那里生成了相同的 x/y 对(尽管它们以不同的顺序生成)。

这里可能选择了meshgrid方法,因为它是contourf所需要的。 contourf 本质上将“XY 平面”作为输入(由 X 和 Y 坐标的数组组成)以及该平面中每个点的 Z 值数组。

结果是分类器和等高线图需要不同格式的输入。分类器采用两个单独的值(两个输入特征)并返回一个值(它预测的类)。 contourf 需要一个矩形网格点。换句话说,粗略地说,predict 一次需要一个 X 坐标和一个 Y 坐标,但 contourf 首先需要所有 X 坐标,然后是所有 Y 坐标。您发布的代码正在做一些重塑以在这两种格式之间进行转换。您以contourf想要的格式生成X和Y,并将其重新整形为predict想要的格式,以便您可以将其传递给predictpredict 为您提供 predict 喜欢的形状的 Z 数据,然后您将其重新整形为 contourf 想要的格式。

【讨论】:

    猜你喜欢
    • 2017-03-22
    • 2021-11-22
    • 2021-11-23
    • 2022-01-26
    • 2015-03-09
    • 1970-01-01
    • 2020-06-23
    • 2015-02-23
    • 2016-07-13
    相关资源
    最近更新 更多