Train_test_split tren verilerinde bir kez ön işleme sığdırılmaya çalışıldığında" IndexError: tuple ındex aralık dışı"

0

Soru

Normalleştirmeyi kullanarak verilerimi önceden işlemeye çalışıyordum.

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

Kod bir Colab not defterinde çalışır. Veri kümesi Kaple'dan alınmıştır ve Unix Zaman Damgaları ve o zamanlarda açık olan Bitcoin fiyatları için başka bir sütunla dolu olacak şekilde değiştirilmiştir. Verileri böldükten ve bir sütun transformatörü oluşturduktan sonra, verileri uydurmayı denedim. Ancak, aşağıdaki hatayı alıyorum:

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

Bunun bir şekil sorunu olup olmadığını merak ediyorum, ancak bir not olarak, X_train verileri şekildedir (2020896,).

Bu hatayı düzeltmek için verilerimle yapmam gereken bir şey var mı?

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

En iyi cevabı

1

X_btc'yi 1D dizisi gibi bir Pandalar Dizisi olarak çıkardınız, veri çerçevesini (2D dizi/matris) çıkarmanız gerekiyor. Yerini almak:

X_btc = btc_data["Time"]

ile:

X_btc = btc_data[["Time"]]

veri çerçevesini ayıklamak için

Yeni hata için düzenle:

KeyError olur çünkü bu transformatör:

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

Kullanıyorsunuz ["Time", "Open"] sütun. Ancak, X_btc'nin sütunu yok "Open" (yalnızca sütunu seçtiğiniz gibi "Time"). Bu "Open" hedef etiket (y_btc) ve bunu dahil etmemelisiniz X_btc. Bu durumda, şunları kaldırabilirsiniz "Open" -den make_column_transformer:

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

Bu onu bir 2D dizisine dönüştürdü, ancak farklı bir hataya neden oldu: pastebin.com/dVRqu7ir
Khosraw Azizi

Cevaptaki düzenlemeye bakın
Bartosz Mikulski

Açıklama için teşekkürler!
Khosraw Azizi

Ben pek anlamadım. Lütfen @khosrawazizi'yi açıklığa kavuşturun, bu sütun transformatörü ile ne elde etmeye çalışıyorsunuz? OneHotEncode (OHE) kategorik veriler içindir ve anladığım kadarıyla Zaman zaman damgaları içerir ve Açık fiyatları içerir. Her iki değişken de süreklidir, ancak kategorik verilerle çalışmak üzere tasarlanmıştır. MinMaxScaler, sürekli değişkenlerle çalıştığı için biraz iyidir. Ancak, zaman damgaları ve fiyatlar için kullanılması gerektiğinden şüpheliyim. Başka bir şey problem formülasyonudur. Zaman damgasına göre fiyatı tahmin etmek ister misiniz? Gelecekteki fiyatları tahmin etmek ister misiniz?
Bartosz Mikulski

Sadece açıklığa kavuşturmak için, bir Bilim Fuarı projesi için TensorFlow ile yolumu öğreniyorum. Şu anda Doğrusal Regresyonla oynadığım için, verilerimi 0'lar ile 1'ler arasında dönüştürmek için normalleştirmeyi kullanmayı denemek istedim. Verilerim herhangi bir Dize verisi içermediğinden muhtemelen onehotencode'a ihtiyacım olmayacağını anlıyorum. Muhtemelen bunu daha sonra kaldıracağım. Şimdilik, normalleştirerek çalışma süremi ve kaybımı azaltmaya çalışıyorum, çünkü modeli gelecekteki fiyatları tahmin etmek için eğitmeyi ve ardından Yahoo Finance'in apı'sinden yeni elde edilen veriler göz önüne alındığında onaylamayı planlıyorum.
Khosraw Azizi

Şimdilik, X_train_normal'ımı numpy kullanarak bir diziye nasıl dönüştüreceğimi anlamaya çalışıyorum, ancak çalışma zamanım dönüştürmeye çalışırken çok fazla bellek kullanıyor. Bunun etrafında bir yol bulamazsam, bunun için başka bir soru açmak zorunda kalacağım.
Khosraw Azizi

Güncelleme: Onehotencode'u Sütun Transformatöründen kaldırmak da bu sorunu çözdü.
Khosraw Azizi

DÜZENLEME: Güncellemenizden 40 saniye sonra yanıtı gönderdim:) Çalışma zamanınız OHE (muhtemelen) nedeniyle çok fazla bellek kullanıyor. Çalıştırarak bildirilen şekil nedir X_train_normal.shape? İkinci sırada çok sayıda varsa, o zaman onun hatası olmalı. Bunun dışında kolon transformatörü transform yöntem, NumPy dizisini (veya seyrek SciPy matrisini) döndürür, ancak veri çerçevesini döndürmez
Bartosz Mikulski

Diğer dillerde

Bu sayfa diğer dillerde

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