Ошибка формы при попытке построить границу решения - PullRequest
0 голосов
/ 23 сентября 2018

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

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

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

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()

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

1 Ответ

0 голосов
/ 25 сентября 2018

Вы обучили классификаторы всем 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
...