"IndexError: tupla índice fuera de rango" en la train_test_split tren de datos una vez tratando de ajuste para el preprocesamiento

0

Pregunta

Yo estaba tratando de pre-procesar mis datos mediante la normalización.

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

El código se ejecuta en un Colab notebook. El conjunto de datos es de Kaple y es modificado para que sea lleno de Unix marcas de tiempo y otra columna para los precios de Bitcoin en abrir en esos momentos. Después de desdoblamiento de los datos y la creación de una columna de transformador, traté de ajuste de los datos. Sin embargo, me sale el siguiente error:

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

Me pregunto si es un problema de forma, sino como una nota, la X_train de datos es de la forma (2020896,).

Hay algo que tengo que hacer con mis datos para corregir este error?

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

Mejor respuesta

1

Extrajo el X_btc como los Pandas de la Serie que es como 1D array, es necesario extraer DataFrame (matriz 2D/matriz). Reemplazar:

X_btc = btc_data["Time"]

con:

X_btc = btc_data[["Time"]]

para extraer el DataFrame

Edición para el nuevo error:

KeyError sucede porque este transformador:

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

Usted está utilizando ["Time", "Open"] columnas. Sin embargo, la X_btc no tiene ninguna columna "Open" (como se ha seleccionado sólo la columna "Time"). El "Open" es el objetivo de la etiqueta (y_btc) y no debe incluir en X_btc. En ese caso, usted puede quitar "Open" de make_column_transformer:

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

Que hizo el cambio a una matriz 2D, pero causó un error diferente: pastebin.com/dVRqu7ir
Khosraw Azizi

Ver la edición en la respuesta
Bartosz Mikulski

Gracias por la explicación!
Khosraw Azizi

Estoy un poco perdido. Por favor aclarar @KhosrawAzizi , ¿qué se intenta lograr con esta columna transformador? OneHotEncode (OHE) es para datos categóricos, y como yo entiendo el Tiempo que contiene las marcas de tiempo, y Abrir contiene los precios. Ambas variables son continuas, pero OHE está diseñado para trabajar con datos categóricos. MinMaxScaler es algo fino, ya que se trabaja con variables continuas. Sin embargo, creo que no debe ser utilizado para el sellado de tiempo y precios. Otra cosa es la formulación del problema. ¿Quieres predecir el precio basado en la marca de tiempo? ¿Quieres pronosticar los precios en el futuro?
Bartosz Mikulski

Solo para aclarar, yo estoy aprendiendo de mi camino a través de TensorFlow para un proyecto de Feria de Ciencia. Desde ahora mismo estoy jugando a través de la Regresión Lineal, quería probar el uso de la normalización para convertir los datos de mi entre 0s y 1s. Entiendo que probablemente no necesitará OneHotEncode ya que mis datos no contiene datos de Cadena. Probablemente voy a ser la eliminación de eso más tarde. Por ahora, estoy tratando de reducir mi tiempo de ejecución y la pérdida por la normalización, porque mi plan de entrenamiento del modelo para predecir los precios futuros y, a continuación, confirmar, dado que recientemente disponibles datos de Yahoo Finanzas de la API.
Khosraw Azizi

Por ahora, estoy tratando de averiguar cómo convertir mi X_train_normal a una matriz con numpy, pero mi tiempo de ejecución es el uso de una gran cantidad de memoria cuando se intenta convertir. Va a terminar encima de tener que abrir otra pregunta para que uno si no puedo encontrar una manera alrededor de ella.
Khosraw Azizi

Actualización: la Eliminación de OneHotEncode de la Columna Transformador de fijo a esa cuestión.
Khosraw Azizi

EDIT: he enviado la respuesta de 40 segundos después de la actualización :) Su tiempo de ejecución es el uso de un montón de memoria, porque de OHE (presumiblemente). ¿Cuál es la forma informado mediante la ejecución de X_train_normal.shape? Si tiene un gran número de en segundo lugar, a continuación, debe ser OHE la culpa. Aparte de eso, la columna de transformador transform método devuelve NumPy matriz (o dispersas SciPy de la matriz), pero no DataFrame
Bartosz Mikulski

En otros idiomas

Esta página está en otros idiomas

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