Выполнение регрессии с деревьями решений sklearn с несколькими входными факторами приводит к ошибке - PullRequest
1 голос
/ 21 января 2020

Я хочу сделать регрессию с регрессором дерева решений от sklearn. Мои входные данные состоят из данных нескольких датчиков, я разделил временной ряд на меньшие windows и рассчитал среднее значение и стандартное отклонение для каждого временного окна и каждого датчика. Массив выглядит следующим образом (в качестве примера для двух датчиков и времени 100 windows):

features_x = np.array([[x[:,0].mean(), x[:,0].std(), x[:,1].mean(), x[:,1].std()]
                    for x in np.array_split(train_array, 100)])

Затем я хочу предсказать среднее значение третьего датчика:

features_y = np.array([[x[:,2].mean()]
                        for x in np.array_split(train_array, 100)])

Затем я использую регрессор дерева решений:

clf = tree.DecisionTreeRegressor()
clf.fit(features_x.reshape(-1,1),features_y.reshape(-1,1))

Но когда я использую этот код, я получаю сообщение об ошибке:

ValueError: Number of labels does not match number of samples

Это должно быть потому, что я использую массив с 4 «значения» в качестве входных данных, но массив только с 1 «значением» в качестве выходных данных. Но я на самом деле хочу использовать данные от многих датчиков в качестве входных данных, чтобы предсказать значение только одного другого датчика в качестве выходных данных. Есть ли возможность заставить регрессию работать таким образом?

Редактировать: Обе матрицы объектов состоят из значений с плавающей запятой. features_x имеет 4 столбца и 100 строк, каждый столбец представляет собой среднее значение или стандартное отклонение. Каждый ряд представляет собой одно временное окно. features_y имеет 1 столбец и 100 строк. Я просто вычисляю среднее значение для одного датчика в каждом временном окне.

Ответы [ 2 ]

0 голосов
/ 21 января 2020

Ваш feature_y заканчивается массивом numpy списков, но вам нужен только массив с плавающей точкой, попробуйте поработать с:

features_y = np.array([x[:,2].mean() for x in np.array_split(train_array, 100)])

Кроме того, обратите внимание на метод изменения формы.

features_y = np.array([[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]])
features_y.reshape(-1, 1)

Выходы:

array([[1],[1],[1], ...])

Но изменение формы x:

features_x = np.array([[1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1], [1, 1, 1]])
features_x.reshape(-1, 1)

Выходы:

array([[1],[1],[1],...])

Вы не хотите изменять свою функцию_x предоставленная структура правильная.

0 голосов
/ 21 января 2020

Проблема в том, что вы используете функцию изменения формы для ввода:

clf.fit(features_x.reshape(-1,1),features_y.reshape(-1,1))

Массив features_x имеет несколько столбцов, и после этого преобразования он имеет только один столбец со всеми элементами, поэтому он становится длиннее features_y и, следовательно, ошибка. Чтобы получить более полное представление о том, что происходит, рассмотрим этот пример:

In [4]: a = np.zeros(8).reshape((4,2))                                                                        

In [5]: a                                                                                                     
Out[5]: 
array([[0., 0.],
       [0., 0.],
       [0., 0.],
       [0., 0.]])

In [6]: a.reshape(-1,1)                                                                                       
Out[6]: 
array([[0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.],
       [0.]])

Вы можете использовать свойство .shape любого массива numpy, чтобы проверить формат ввода и меток.

...