Ошибка формы при попытке построить границу решения

1

Из моего набора данных о вине я пытаюсь построить границу решения между двумя столбцами, которая описывается фрагментом:

X0, X1 = X[:, 10], Y

Я взял следующий код из учебника сюжета scikit svm и был изменен, чтобы заменить мои имена/индексы переменных. Однако, когда я запускаю следующий код, я получаю сообщение об ошибке:

ValueError: X.shape[1] = 2 should be equal to 11, the number of features at training time

с пакетом ошибок как:

Traceback (most recent call last):

File "test-wine.py", line 120, in <module>
    cmap=plt.cm.coolwarm, alpha=0.8)
File "test-wine.py", line 96, in plot_contours
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
File "/home/suhail/anaconda3/envs/ml/lib/python3.5/site-packages/sklearn/svm/base.py", line 548, in predict
    y = super(BaseSVC, self).predict(X)
File "/home/suhail/anaconda3/envs/ml/lib/python3.5/site-packages/sklearn/svm/base.py", line 308, in predict
    X = self._validate_for_predict(X)
File "/home/suhail/anaconda3/envs/ml/lib/python3.5/site-packages/sklearn/svm/base.py", line 459, in _validate_for_predict
    (n_features, self.shape_fit_[1]))
ValueError: X.shape[1] = 2 should be equal to 11, the number of features at training time

Я не могу понять причину вышеуказанной ошибки. Вот код, который я изменил.

import pandas as pd
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

data = pd.read_csv('winequality-red.csv').values

x_data_shape = data.shape[0]
y_data_shape = data.shape[1]

X = data[:, 0:y_data_shape-1]
Y = data[:, y_data_shape-1]


############### PLOT DECISION BOUNDARY SVM #############

def make_meshgrid(x, y, h=.02):
    """Create a mesh of points to plot in

    Parameters
    ----------
    x: data to base x-axis meshgrid on
    y: data to base y-axis meshgrid on
    h: stepsize for meshgrid, optional

    Returns
    -------
    xx, yy : ndarray
    """
    x_min, x_max = x.min() - 1, x.max() + 1
    y_min, y_max = y.min() - 1, y.max() + 1
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                        np.arange(y_min, y_max, h))
    return xx, yy


def plot_contours(ax, clf, xx, yy, **params):
    """Plot the decision boundaries for a classifier.

    Parameters
    ----------
    ax: matplotlib axes object
    clf: a classifier
    xx: meshgrid ndarray
    yy: meshgrid ndarray
    params: dictionary of params to pass to contourf, optional
    """
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    out = ax.contourf(xx, yy, Z, **params)
    return out


C = 1.0  # SVM regularization parameter
models = (SVC(kernel='linear', C=C),
        SVC(kernel='rbf', gamma=0.7, C=C),
        SVC(kernel='poly', degree=3, C=C))
models = (clf.fit(X, Y) for clf in models)

titles = ('SVC with linear kernel',
        'SVC with RBF kernel',
        'SVC with polynomial (degree 3) kernel')

fig, sub = plt.subplots(2, 2)
plt.subplots_adjust(wspace=0.4, hspace=0.4)

X0, X1 = X[:, 10], Y
xx, yy = make_meshgrid(X0, X1)

for clf, title, ax in zip(models, titles, sub.flatten()):
    plot_contours(ax, clf, xx, yy,
                cmap=plt.cm.coolwarm, alpha=0.8)
    ax.scatter(X0, X1, c=Y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xlabel('Alcohol Content')
    ax.set_ylabel('Quality')
    ax.set_xticks(())
    ax.set_yticks(())
    ax.set_title(title)

plt.show()

Что может быть причиной этой ошибки?

Теги:
pandas
matplotlib
numpy
supervised-learning

1 ответ

0

Вы подготовили классификаторы со всеми 11 функциями, но вы предоставляете только 2 функции для оценки классификатора, которая происходит, когда Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) вызывается из в рамках метода plot_contours. Чтобы оценить классификатор, обученный 11 функциями, вам необходимо предоставить все 11 функций. Это указывает ваше сообщение об ошибке.

Поэтому, чтобы заставить сниппет работать для вас, вы должны ограничить себя двумя функциями (иначе построение двумерных границ принятия решений в любом случае не имеет смысла), например, используя

X = data[:, :2]
Y = data[:, y_data_shape-1]

при чтении данных.

Обратите внимание, что в приведенном вами примере также используются только две функции:

# import some data to play with
iris = datasets.load_iris()
# Take the first two features. We could avoid this by using a two-dim dataset
X = iris.data[:, :2]
y = iris.target

Ещё вопросы

Сообщество Overcoder
Наверх
Меню