绘制 k-NN 错误:IndexError:索引 1 超出轴 1 的范围,大小为 1

Posted

技术标签:

【中文标题】绘制 k-NN 错误:IndexError:索引 1 超出轴 1 的范围,大小为 1【英文标题】:Plot k-NN Error : IndexError: index 1 is out of bounds for axis 1 with size 1 【发布时间】:2020-06-18 10:48:28 【问题描述】:

我是机器学习的新手,想绘制一个 k-NN 分类器图。

我收到此错误“indexError: index 1 is out of bounds for axis 1 with size 1”,我不明白问题到底是什么?

对于 ML 而言,我的数据确实很小,但我目前只进行跟踪。 数据是 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】:

您的错误是由于您对 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

你可以走了。

证明

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

【讨论】:

您好,感谢您的快速回复。我明白你的意思,但是在我换行之后。它现在给了我错误“IndexError:单个位置索引器超出范围”。 你能告诉我(1)print(Test_Cu_48hrs.shape) 的输出和(2)哪一行产生了错误吗? 输出是 (21,3) 和它的第 18 行会产生错误 '---> y = Test_Cu_48hrs.iloc[:,3].values' 好吧,这似乎已经摆脱了那个错误,但现在我得到了第 34 行的内存错误 ---> np.arange(y_min, y_max, h))。我检查了系统资源及其消耗 80% 的系统内存。我的笔记本电脑有 8GB 内存,我没有运行其他任何东西。看来我倒霉了。 :( 您得到的网格网格大于可用 RAM。为h 尝试不同的值,例如.1, .5, 1.0 ,看看您是否能摆脱错误消息并获得可接受质量的图片!

以上是关于绘制 k-NN 错误:IndexError:索引 1 超出轴 1 的范围,大小为 1的主要内容,如果未能解决你的问题,请参考以下文章

IndexError:数组的索引过多

findspark.init() IndexError: 列表索引超出范围错误

使用 TensorFlow 的“IndexError:列表索引超出范围”错误

IndexError:列表索引超出范围 - python 错误

如何在 Python 中调试“IndexError:标量变量的无效索引”错误?

Python(熊猫)错误IndexError:单个位置索引器超出范围