SKLearn ValueError: установка элемента массива с последовательностью - PullRequest
1 голос
/ 11 июля 2019

В рамках проекта я пытаюсь использовать классификатор случайных лесов из библиотеки Python SKLearn. Я использовал этот учебник в качестве руководства: https://chrisalbon.com/machine_learning/trees_and_forests/random_forest_classifier_example/.

Мой код следует строка за строкой, но единственным существенным отличием является структура данных. В учебнике есть 4 функции (4 столбца в таблице данных), и каждая запись в столбце является числом. В моем коде у меня есть 1 особенность (1 столбец в таблице данных), и каждая запись в столбце является массивом Numpy. Когда я вызываю функцию fit (), я получаю следующую ошибку: ValueError: установка элемента массива с последовательностью.

Вот мой код:

import pandas as pd
import numpy as np
import random
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import confusion_matrix

trainingData = [[[0, 0, 3], 0.77], [[24, 0, 5], 30], [[0, 0, 4], 0.77], [[0, 0, 0], 0.77]]
vectors_train = []
for i in range (0, len(trainingData)):
    vectors_train.append(trainingData[i][0])

testingData = [[[1, 0, 0], 0.77], [[30, 0, 5], 30], [[0, 0, 0], 0.77], [[0, 0, 0], 0.77]]
vectors_test = []
for i in range (0, len(testingData)):
    vectors_test.append(testingData[i][0])

dataframe_training = pd.DataFrame(trainingData)
dataframe_training['is_train'] = True
dataframe_testing = pd.DataFrame(testingData)
dataframe_testing['is_train'] = False
frames = [dataframe_training, dataframe_testing]
dataframe = pd.concat(frames)
dataframe.rename(index = str, columns = {0: 'Vector', 1: 'Label', 2: 'is_train'})

train, test = dataframe[dataframe['is_train']==True], dataframe[dataframe['is_train']==False]
features = dataframe.columns[:1]
labels_train, uniques = pd.factorize(train[1], sort = True)
clf = RandomForestClassifier()

clf.fit(train[features], labels)              # Value error occurs here

Я смущен тем, что на самом деле означает ошибка. Какой элемент массива устанавливается для последовательности, и где эта последовательность? Мне также известно, что train[features] является объектом DataFrame и что функция fit () принимает два параметра, каждый из которых должен быть похож на массив. labels - это массив, и ошибка, в частности, указывает на проблему с первым параметром, поэтому нужно ли выполнять преобразование типов данных?

Когда я заменяю строку clf.fit(train[features], labels) на clf.fit(vectors_train, labels), ошибка исчезает. Однако я хочу знать, почему он не работает, когда я использую ту же стратегию, что и в руководстве, и как заставить его работать аналогичным образом.

Любая помощь будет высоко ценится. Спасибо!

Ответы [ 2 ]

0 голосов
/ 11 июля 2019

Удалите переменную features и сделайте последнюю строку:

clf.fit(train[0].tolist(), labels)

Нет ошибки с кодом выше.

Ваш код не работает, потому что columns, как вы делаете column[:1], возвращает последовательность с одним столбцом, однако column[0] не будет, и если вы передадите это int в cls.fit, сделав train[features] с columns[0] как features, он все равно не будет работать, так как ему требуется список или массив, поэтому train[features].tolist() также будет работать.

0 голосов
/ 11 июля 2019

У вас есть эта ошибка, потому что ваши данные не отформатированы правильно, когда вы вызываете метод fit. Ваш ввод - это DataFrame (с одним столбцом) списка, но метод fit ожидает массивный массив.

Это должно работать, если вы вместо этого:

X = np.array(train[features][0].tolist())
clf.fit(X, labels_train)

Итак, X - это массив с 4 примерами, каждый с 3 функциями.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...