我收到TypeError“ TypeError:只有整数标量数组可以转换为标量索引”。
我不太清楚为什么,也找不到任何解释为什么会出现该错误的信息。有人可以解释我在做什么错,并提出纠正它的方法吗?
import numpy as np
from sklearn.metrics import accuracy_score
from sklearn.neural_network import MLPClassifier
data1 = np.loadtxt('0003_1.csv', delimiter=",")
indices = np.random.permutation(len(data1.data))
split = round(len(indices) * 0.8)
x_train = data1.data[indices[:split]]
y_train = data1.target[indices[:split]]
x_test = data1.data[indices[split:]]
y_test = data1.target[indices[split:]]
clf = MLPClassifier(hidden_layer_sizes=(100, 100, 100), max_iter=500, alpha=0.0001, solver='sgd', verbose=10, random_state=21, tol=0.000000001)
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)
accuracy_score(y_test, y_pred)
答案 0 :(得分:0)
假设您没有逐行尝试此代码,而是一路查看结果是否公平?
您没有提供csv
文件,但是以这种方式调用的loadtxt
只能生成2d的浮点数组,因此让我们用np.ones
进行模拟:
In [637]: data1 = np.ones((10,10))
这样的数组确实具有data
属性,即memoryview
:
In [638]: data1.data
Out[638]: <memory at 0x7fc5b6916c18>
它没有target
属性。您的csv
的列可能具有这样的名称(但您没有阅读标题),但是此loadtxt
却没有那样加载它们。
In [639]: data1.target
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-639-43b9ce1927aa> in <module>()
----> 1 data1.target
AttributeError: 'numpy.ndarray' object has no attribute 'target'
但是,让我们继续处理您的错误。 .data
与len
一样具有data1
,因此indices
可以工作:
In [640]: indices = np.random.permutation(len(data1.data))
In [641]: indices
Out[641]: array([0, 7, 6, 4, 8, 5, 2, 1, 9, 3])
In [642]: split = round(len(indices) * 0.8)
In [643]: split
Out[643]: 8
In [644]: indices[:split]
Out[644]: array([0, 7, 6, 4, 8, 5, 2, 1])
但是memoryview
不能用切片索引:
In [645]: data1.data[indices[:split]]
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-645-b6cf2f74578c> in <module>()
----> 1 data1.data[indices[:split]]
TypeError: only integer scalar arrays can be converted to a scalar index
可以使用此切片对2d数组进行索引:
In [646]: data1[indices[:split]]
Out[646]:
array([[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.],
[1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]])
因此,问题的根源在于认为data1.data
和data1.target
是有用的表达。实际上,您没有按预期或以预期的方式加载数据对象。而且您没有检查data1
。