"Ошибка индекса: индекс кортежа вне диапазона" в данных поезда train_test_split при попытке выполнить предварительную обработку

0

Вопрос

Я пытался предварительно обработать свои данные с помощью нормализации.

# preprocessing
import tensorflow as tf
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from tensorflow.keras import layers
from sklearn.compose import make_column_transformer
from sklearn.preprocessing import MinMaxScaler, OneHotEncoder
from sklearn.model_selection import train_test_split

np.set_printoptions(precision=3, suppress=True)
btc_data = pd.read_csv(
    "output.csv",
    names=["Time", "Open"])

ct = make_column_transformer(
    (MinMaxScaler(), ["Time", "Open"]),
    (OneHotEncoder(handle_unknown="ignore"), ["Time", "Open"])
)

X_btc = btc_data["Time"]
y_btc = btc_data["Open"]

X_train, X_test, y_train, y_test = train_test_split(X_btc, y_btc, test_size=0.2, random_state=62)

ct.fit(X_train)
X_train_normal = ct.transform(X_train)
X_test_normal = ct.transform(X_test)

Код выполняется в записной книжке Colab. Набор данных взят из Kaple, и он изменен, чтобы содержать временные метки Unix и еще один столбец для цен на биткойны, открытых в то время. После разделения данных и создания преобразователя столбцов я попытался подогнать данные. Однако я получаю следующую ошибку:

---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-44-f73622372111> in <module>()
     27 print(X_train.shape)
     28 
---> 29 ct.fit(X_train)
     30 X_train_normal = ct.transform(X_train)
     31 X_test_normal = ct.transform(X_test)

3 frames
/usr/local/lib/python3.7/dist-packages/sklearn/utils/__init__.py in _get_column_indices(X, key)
    387     :func:`_safe_indexing_column`.
    388     """
--> 389     n_columns = X.shape[1]
    390 
    391     key_dtype = _determine_key_type(key)

IndexError: tuple index out of range

Мне интересно, является ли это проблемой формы, но, как примечание, данные X_train имеют форму (2020896,).

Есть ли что-то, что я должен сделать со своими данными, чтобы исправить эту ошибку?

numpy pandas python scikit-learn
2021-11-23 19:01:34
1

Лучший ответ

1

Вы извлекли X_btc в виде серии Pandas, которая похожа на 1D массив, вам нужно извлечь фрейм данных (2D массив/матрица). Заменять:

X_btc = btc_data["Time"]

с:

X_btc = btc_data[["Time"]]

чтобы извлечь фрейм данных

Отредактируйте для новой ошибки:

Ошибка ключа происходит из-за этого трансформатора:

ct = make_column_transformer(
    (MinMaxScaler(), ["Time", "Open"]),
    (OneHotEncoder(handle_unknown="ignore"), ["Time", "Open"])
)

Вы используете ["Time", "Open"] столбцы. Однако в X_btc нет столбца "Open" (поскольку вы выбрали только столбец "Time"). В "Open" является ли целевая метка (y_btc) и вы не должны включать его в X_btc. В этом случае вы можете удалить "Open" От make_column_transformer:

ct = make_column_transformer(
    (MinMaxScaler(), ["Time"]),
    (OneHotEncoder(handle_unknown="ignore"), ["Time"])
)
2021-11-23 19:54:17

Это действительно превратило его в 2D-массив, но вызвало другую ошибку: pastebin.com/dVRqu7ir
Khosraw Azizi

Смотрите правку в ответе
Bartosz Mikulski

Спасибо за объяснение!
Khosraw Azizi

Я немного растерялся. Пожалуйста , поясните @KhosrawAzizi, чего вы пытаетесь достичь с помощью этого трансформатора столбцов? OneHotEncode (OHE) предназначен для категориальных данных, и, как я понимаю, Время содержит метки времени, а Открытие содержит цены. Обе переменные являются непрерывными, но OHE предназначен для работы с категориальными данными. MinMaxScaler несколько хорош, так как он работает с непрерывными переменными. Однако я сомневаюсь, что его следует использовать для временных меток и цен. Другое дело - формулировка проблемы. Вы хотите спрогнозировать цену на основе метки времени? Вы хотите спрогнозировать будущие цены?
Bartosz Mikulski

Просто чтобы уточнить, я изучаю свой путь через TensorFlow для проекта Научной ярмарки. Поскольку прямо сейчас я играю с помощью линейной регрессии, я хотел попробовать использовать нормализацию для преобразования моих данных между 0 и 1. Я понимаю, что мне, вероятно, не понадобится OneHotEncode, так как мои данные не содержат никаких строковых данных. Я, вероятно, удалю это позже. На данный момент я пытаюсь сократить время выполнения и потери за счет нормализации, потому что я планирую обучить модель прогнозированию будущих цен, а затем подтвердить их с учетом новых доступных данных из API Yahoo Finance.
Khosraw Azizi

На данный момент я пытаюсь выяснить, как преобразовать мой X_train_normal в массив с помощью numpy, но во время выполнения при попытке его преобразования используется много памяти. В конечном итоге мне придется открыть еще один вопрос для этого, если я не смогу найти способ обойти его.
Khosraw Azizi

Обновление: Удаление OneHotEncode из трансформатора столбцов также устранило эту проблему.
Khosraw Azizi

ИЗМЕНИТЬ: я отправил ответ через 40 секунд после вашего обновления :) Ваша среда выполнения использует много памяти из-за OHE (предположительно). О какой форме сообщается при запуске X_train_normal.shape? Если у него большое количество во-вторых, то это должна быть вина OHE. Кроме этого, колонный трансформатор transform метод возвращает массив NumPy (или разреженную матрицу SciPy), но не фрейм данных
Bartosz Mikulski

На других языках

Эта страница на других языках

Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................