"IndexError: tupla index out of range" su train_test_split dati treno una volta tenta di adattare per la pre-elaborazione

0

Domanda

Stavo cercando di pre-trattamento dei miei dati utilizzando la normalizzazione.

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

Il codice viene eseguito su un Colab notebook. Il dataset è da Kaple e si è modificato per essere pieno di Unix Timestamp e un'altra colonna per i prezzi del Bitcoin su open a quei tempi. Dopo spliting i dati e la creazione di una colonna trasformatore, ho cercato di adattare i dati. Tuttavia, ho il seguente errore:

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

Mi chiedo se è un problema di forma, ma come una nota, il X_train dati è di forma (2020896,).

C'è qualcosa che devo fare con i miei dati per correggere questo errore?

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

Migliore risposta

1

Sono stati estratti i X_btc come un Panda di Serie, che è come la 1D array, è necessario estrarre DataFrame (matrice 2D/matrice). Sostituire:

X_btc = btc_data["Time"]

con:

X_btc = btc_data[["Time"]]

per estrarre il DataFrame

Edit per il nuovo errore:

KeyError accade perché questo trasformatore:

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

Si utilizza ["Time", "Open"] le colonne. Tuttavia, il X_btc non ha colonna "Open" (come si è selezionato solo colonna "Time"). Il "Open" è l'etichetta di destinazione (y_btc) e si consiglia di non inserire in X_btc. In questo caso, è possibile rimuovere "Open" da make_column_transformer:

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

Che fece cambiare in una matrice 2D, ma ha causato un errore diverso: pastebin.com/dVRqu7ir
Khosraw Azizi

Vedere la modifica nella risposta
Bartosz Mikulski

Grazie per la spiegazione!!!
Khosraw Azizi

Io sono un po ' perso. Si prega di chiarire @KhosrawAzizi , cosa cerchi di ottenere con questa colonna trasformatore? OneHotEncode (OHE) è per dati categoriali, e come ho capito il Tempo, contiene il timestamp, e Aprire contiene i prezzi. Entrambe le variabili sono continue, ma OHE è progettato per funzionare con i dati categoriali. MinMaxScaler è un po ' bene, come funziona con le variabili continue. Tuttavia, dubito che dovrebbe essere utilizzato per gli orari e i prezzi. Un'altra cosa è la formulazione di un problema. Vuoi prevedere il prezzo in base al timestamp? Vuoi prevedere i prezzi futuri?
Bartosz Mikulski

Giusto per chiarire, sto imparando la mia strada attraverso TensorFlow per una Fiera della Scienza progetto. Dal momento che sto giocando attraverso la Regressione Lineare, ho voluto provare a usare la normalizzazione per convertire i miei dati tra 0 e 1. Capisco che probabilmente non hanno bisogno di OneHotEncode dal momento che i miei dati non contiene dati Stringa. Io probabilmente sarà di rimozione di seguito. Per ora, sto cercando di diminuire la mia run-time e la perdita di normalizzazione, perché ho in progetto di formazione il modello per prevedere i prezzi futuri e quindi della conferma dato appena disponibili i dati da Yahoo Finance API.
Khosraw Azizi

Per ora, sto cercando di capire come convertire il mio X_train_normal di un array numpy, ma la mia run-time utilizza un sacco di memoria quando si cerca di convertirlo. Finirà per dover aprire un'altra questione che, se io non riesco a capire un modo intorno ad esso.
Khosraw Azizi

Aggiornamento: la Rimozione OneHotEncode dalla Colonna Trasformatore risolto il problema così.
Khosraw Azizi

EDIT: ho inviato la risposta 40 secondi dopo l'aggiornamento :) runtime utilizza un sacco di memoria a causa di OHE (presumibilmente). Qual è la forma riportata da corsa X_train_normal.shape? Se si dispone di un gran numero in secondo luogo, dovrebbe essere OHE colpa. Oltre a questo, la colonna trasformatore transform il metodo restituisce l'array NumPy (o sparse SciPy matrice), ma non DataFrame
Bartosz Mikulski

In altre lingue

Questa pagina è in altre lingue

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