График k-NN Ошибка: Ошибка IndexE: индекс 1 выходит за пределы оси 1 с размером 1 - PullRequest
1 голос
/ 05 марта 2020

Я новичок в машинном обучении и хотел бы построить график классификатора k-NN.

Я получаю эту ошибку " indexError: index 1 выходит за пределы для оси 1 с размером 1 ", и я не понимаю, в чем проблема на самом деле?

Мои данные очень малы для целей ОД, но в настоящее время я только отслеживаю. Данные представляют собой структуры в 4 столбцах (ссылка на изображение находится под кодом). 1 - столбец индекса, 2 и 3 - две переменные, а 4 - целевой классификатор. Всего 21 образцов.

import pandas as pd
from pylab import rcParams
import matplotlib.pyplot as plt
from sklearn import neighbors
from matplotlib.colors import ListedColormap
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report

n_neighbors = 5

# import some data to play with
Test_Cu_48hrs = pd.read_csv('Test_Cu_48hrs.csv' , index_col = 0)

# prepare data
X = Test_Cu_48hrs.iloc[:,1:2].values 
y = Test_Cu_48hrs.iloc[:,2].values
h = .02

# Create color maps
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF','#AFAFAF','#FFFF00','#800080','#00CED1'])
cmap_bold  = ListedColormap(['#FF0000', '#00FF00', '#0000FF','#AFAFAF','#FFFF00','#800080','#00CED1'])

# we create an instance of Neighbours Classifier and fit the data.
clf = neighbors.KNeighborsClassifier(n_neighbors, weights='distance')
clf.fit(X, y)

# calculate min, max and limits
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, h),
np.arange(y_min, y_max, h))

# predict class using data and kNN classifier
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)

# Plot also the training points
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("7-Class classification (k = %i)" % (n_neighbors))
plt.show() 


  [1]: https://i.stack.imgur.com/J0y3i.png

1 Ответ

1 голос
/ 05 марта 2020

Ваша ошибка связана с тем, как вы нарезаете pandas df. То, как вы это делаете, вы получаете X как одно измерение. Следовательно, ваша ошибка выходит за пределы диапазона индекса.

Попробуйте изменить строки:

X = Test_Cu_48hrs.iloc[:,1:2].values 
y = Test_Cu_48hrs.iloc[:,2].values

на:

X = Test_Cu_48hrs.iloc[:,0:2].values 
y = Test_Cu_48hrs.iloc[:,2].values

и все в порядке на go.

Доказательство

# prepare data
X = Test_Cu_48hrs.iloc[:,0:2].values
y = Test_Cu_48hrs.iloc[:,2].values
h = .02

# Create color maps
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF','#AFAFAF','#FFFF00','#800080','#00CED1'])
cmap_bold  = ListedColormap(['#FF0000', '#00FF00', '#0000FF','#AFAFAF','#FFFF00','#800080','#00CED1'])

# we create an instance of Neighbours Classifier and fit the data.
clf = neighbors.KNeighborsClassifier(n_neighbors, weights='distance')
clf.fit(X, y)

# calculate min, max and limits
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, h),
np.arange(y_min, y_max, h))

# predict class using data and kNN classifier
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

# Put the result into a color plot
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)

# Plot also the training points
plt.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_bold)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("7-Class classification (k = %i)" % (n_neighbors))
plt.show() 

enter image description here

...