在决策树上制作决策图时出错

时间:2019-06-10 08:54:32

标签: python-3.x scikit-learn

我的python版本是3。 我已经为数据修改了this代码。 并尝试制作图形时,请在线上

X = l_atributos[:, pair]

我有错误:

  

列表索引必须是整数或切片,而不是元组

但是我看不出问题出在哪里。你能帮我吗?

for pairidx, pair in enumerate([[0, 1],[0, 2],[0, 3],[1, 2],[1, 3],[2, 3]]):
    # We only take the two corresponding features
    X = l_atributos[:, pair]
    y = etiquetas

    # Train
    clf = DecisionTreeClassifier().fit(X, y)

    # Plot the decision boundary
    plt.subplot(2, 3, pairidx + 1)

    x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
    y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step),
                         np.arange(y_min, y_max, plot_step))
    plt.tight_layout(h_pad=0.5, w_pad=0.5, pad=2.5)

    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    cs = plt.contourf(xx, yy, Z, cmap=plt.cm.RdYlBu)

    plt.xlabel(['so2', 'no2', 'temp', 'viento', 'precipitacion'][pair[0]])
    plt.ylabel(['so2', 'no2', 'temp', 'viento', 'precipitacion'][pair[1]])

    # Plot the training points
    for i, color in zip(range(n_classes), plot_colors):
        idx = np.where(y == i)
        plt.scatter(X[idx, 0], X[idx, 1], c=color, label=['nivel 0', 'nivel 1', 'nivel 2', 'nivel 3'][i], cmap=plt.cm.RdYlBu, edgecolor='black', s=15)

plt.suptitle("Decision surface of a decision tree using paired features")
plt.legend(loc='lower right', borderpad=0, handletextpad=0)
plt.axis("tight")

plt.figure()
clf = DecisionTreeClassifier().fit(l_atributos, etiquetas)
plot_tree(clf, filled=True)
plt.show()

1 个答案:

答案 0 :(得分:1)

用于表示示例和代码中数据的数据结构中的常见问题。

如果您打印iris示例的内容,则可能会看到下一个数据:

from sklearn.datasets import load_iris
iris = load_iris()
print(iris.data)

输出

array([[5.1, 3.5, 1.4, 0.2],
       [4.9, 3. , 1.4, 0.2],
       [4.7, 3.2, 1.3, 0.2],
...

如您所见,这是2D数组被numpy.array(...)包装器包裹。

但是在您的示例中,您只有2D数组:

print(l_atributos[:3])

结果

[['66', '26.0', '12.1', '16.0', '0.0'], ['75', '16.0', '10.0', '26.0', '5.9'], ['61', '25.0', '8.0', '23.0', '29.4']]

如果要使用scikit的示例进行最少的更改,只需用numpy.array包装数据:

import numpy as np
l_atributos = np.array([['66', '26.0', '12.1', '16.0', '0.0'], ['75', '16.0', '10.0', '26.0', '5.9'], ['61', '25.0', '8.0', '23.0', '29.4']])