"IndexError: tupla índice fora do intervalo" na train_test_split ferroviária de dados, uma vez tentar ajuste de pré-processamento

0

Pergunta

Eu estava tentando para pré-processar os meus dados usando a normalização.

# 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)

O código é executado em um Colab notebook. O conjunto de dados é de Kaple e é modificado para ser cheio do Unix Carimbos de data / hora e uma outra coluna de preços de Bitcoin em abrir naqueles tempos. Depois de spliting os dados e a criação de uma coluna de transformadores, eu tentei encaixe de dados. No entanto, recebo o seguinte erro:

---------------------------------------------------------------------------
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

Eu estou querendo saber se isso é uma forma de problema, mas como uma observação, a X_train dados de forma (2020896,).

Há algo que eu tenho que fazer com meus dados para corrigir este erro?

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

Melhor resposta

1

Você extraiu o X_btc como um Pandas Série que é como array 1D, você precisa extrair DataFrame (2D matriz/matriz). Substituir:

X_btc = btc_data["Time"]

com:

X_btc = btc_data[["Time"]]

para extrair o DataFrame

Para editar o novo erro:

KeyError acontece porque este transformador:

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

Você está usando ["Time", "Open"] as colunas. No entanto, o X_btc não tem coluna "Open" (como você selecionou somente a coluna "Time"). O "Open" é o destino de etiqueta (y_btc) e você não deve incluir em X_btc. Nesse caso, você pode remover "Open" a partir de make_column_transformer:

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

Que fez, transformá-lo em um array 2D, mas isso causou um erro diferentes: pastebin.com/dVRqu7ir
Khosraw Azizi

Veja a edição na resposta
Bartosz Mikulski

Obrigado pela explicação!
Khosraw Azizi

Eu estou um pouco perdido. Por favor, esclarecer @KhosrawAzizi , o que você tenta alcançar com esta coluna transformador? OneHotEncode (OHE) é para dados categóricos, e como eu entendo que o Tempo contém carimbos de data / hora, e Abrir contém preços. Ambas as variáveis são contínuas, mas OHE é projetado para trabalhar com dados categóricos. MinMaxScaler é um pouco fina, como ele trabalha com variáveis contínuas. No entanto, eu duvido que ele deve ser usado para carimbos de data / hora e os preços. Outra coisa é a formulação do problema. Você quer prever o preço com base no carimbo de data / hora? Você quer previsão de preços futuros?
Bartosz Mikulski

Só para esclarecer, eu estou aprendendo o meu caminho através de TensorFlow para uma Feira de Ciências de projeto. Desde agora eu estou reprodução através de Regressão Linear, eu queria tentar usar de normalização para converter dados entre 0s e 1s. Eu entendo que eu provavelmente não precisa OneHotEncode desde que meus dados não conter qualquer Seqüência de caracteres de dados. Eu, provavelmente, ser a remoção de que, mais tarde. Por agora, estou tentando diminuir meu tempo de execução e a perda por normalizar, porque eu o plano de formação o modelo para prever os preços futuros e, em seguida, confirmando-lhes dado recém-dados disponíveis a partir de Finanças de Yahoo API.
Khosraw Azizi

Por agora, eu estou tentando descobrir como converter meu X_train_normal para uma matriz utilizando o numpy, mas o meu tempo de execução está usando muita memória quando tentar convertê-lo. Vai acabar tendo que abrir outra pergunta para que, se eu não consigo descobrir uma maneira de contornar isso.
Khosraw Azizi

Atualização: Remover OneHotEncode da Coluna Transformador corrigido esse problema bem.
Khosraw Azizi

EDIT: eu submetidos a resposta de 40 segundos após a actualização: a) O tempo de execução está usando muita memória por causa de OHE (presumivelmente). Qual é a forma de comunicado pelo executar X_train_normal.shape? Se tiver um grande número em segundo lugar, em seguida, ele deve ser OHE culpa. Além disso, a coluna do transformador transform método retorna NumPy matriz (ou esparsos SciPy matriz), mas não DataFrame
Bartosz Mikulski

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................