"IndexError: tuple index out of range" sur train_test_split train de données une fois en tentant d'adapter pour le prétraitement

0

La question

J'essayais de pré-traiter mes données à l'aide de la normalisation.

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

Le code s'exécute sur une Colab ordinateur portable. Le jeu de données est de Kaple et il est modifié pour être plein de Timestamps Unix et une autre colonne pour le prix du Bitcoin sur ouvrir à ces moments. Après crève les données et la création d'une colonne de transformateur, j'ai essayé ajuste le mieux aux données. Cependant, j'obtiens l'erreur suivante:

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

Je me demande si c'est une forme de question, mais comme une note, le X_train de données est de la forme (2020896,).

Il ya quelque chose que j'ai à faire avec mes données pour corriger cette erreur?

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

La meilleure réponse

1

Vous avez extrait les X_btc comme les Pandas de la Série qui est comme 1D tableau, vous devez extraire DataFrame (tableau 2D/matrice). Remplacer:

X_btc = btc_data["Time"]

avec:

X_btc = btc_data[["Time"]]

pour extraire le DataFrame

Edit pour la nouvelle erreur:

KeyError arrive parce que ce transformateur:

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

Vous utilisez ["Time", "Open"] les colonnes. Cependant, la X_btc n'a pas de colonne "Open" (comme vous l'avez sélectionné, seule colonne "Time"). L' "Open" est l'étiquette cible (y_btc) et vous ne devez pas inclure dans X_btc. Dans ce cas, vous pouvez supprimer "Open" à partir de make_column_transformer:

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

Qui n'a changer dans un tableau 2D, mais il a provoqué une erreur différents: pastebin.com/dVRqu7ir
Khosraw Azizi

Voir la modifier dans la réponse
Bartosz Mikulski

Merci pour l'explication!
Khosraw Azizi

Je suis un peu perdu. Veuillez préciser @KhosrawAzizi , ce que vous essayez d'atteindre avec cette colonne de transformateur? OneHotEncode (OHE) est pour les données catégorielles, et comme je comprends le Temps contient les horodatages et Ouvrir contient des prix. Les deux variables sont continues, mais OHE est conçu pour fonctionner avec des données catégorielles. MinMaxScaler est un peu fine, que l'on travaille avec des variables continues. Cependant, je doute qu'il devrait être utilisé pour les horodatages et les prix. Une autre chose est le problème de formulation. Voulez-vous prédire le prix basé sur le timestamp? Voulez-vous de prévoir l'évolution future des prix?
Bartosz Mikulski

Juste pour préciser, je suis en train d'apprendre mon chemin à travers TensorFlow pour un projet scientifique. Depuis ce moment je joue à travers la Régression Linéaire, j'ai voulu essayer d'utiliser la normalisation pour convertir mes données entre 0s et 1s. Je comprends que je n'aurai probablement pas besoin de OneHotEncode depuis mes données ne contiennent pas de données de Chaîne. Je vais probablement enlever plus tard. Pour l'instant, je suis en train d'essayer de diminuer mon temps et la perte en normalisant, parce que j'ai prévu sur le modèle de la formation de prédire l'évolution future des prix et puis en confirmant compte tenu de nouvelles données disponibles à partir de Yahoo Finance de l'API.
Khosraw Azizi

Pour l'instant, je suis à essayer de comprendre comment faire pour convertir mes X_train_normal d'un tableau à l'aide de numpy, mais mon temps est à l'aide de beaucoup de mémoire lorsque vous essayez de le convertir. Finirez par avoir à ouvrir une autre question pour que l'on si je ne peux pas trouver un moyen de contourner cela.
Khosraw Azizi

Mise à jour: Suppression OneHotEncode de la Colonne Transformateur fixe ce problème.
Khosraw Azizi

EDIT: j'ai présenté la réponse de 40 secondes après la mise à jour :) Votre runtime est en utilisant beaucoup de mémoire à cause de OHE (sans doute). Quelle est la forme signalée par l'exécution de X_train_normal.shape? Si il a un grand nombre dans la deuxième place, il devrait être OHE la faute. Autre que cela, la colonne transformateur transform la méthode retourne un tableau NumPy (ou clairsemé SciPy de la matrice), mais pas DataFrame
Bartosz Mikulski

Dans d'autres langues

Cette page est dans d'autres langues

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