Преобразование CSV в CLF в Python

Я получаю 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)

Какая строка вызывает ошибку? Что такое data1.data? data1.target?

hpaulj 06.12.2018 05:41

@hp x_train = data1.data [index [: split]] - это место, где возникает ошибка. data - это данные, а цель - это цель с точки зрения машинного обучения. mathworks.com/matlabcentral/answers/…

Alex 09.12.2018 01:26
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
168
1

Ответы 1

Справедливо ли предположить, что вы не пробовали этот код построчно, попутно глядя на результаты?

Вы не предоставили файл csv, но вызываемый таким образом loadtxt может создавать только 2-мерный массив чисел с плавающей запятой, поэтому давайте смоделируем это с помощью 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 не проверяли.

Другие вопросы по теме