一旦尝试适合预处理,train_test_split 训练数据上的“IndexError:元组索引超出范围”
Posted
技术标签:
【中文标题】一旦尝试适合预处理,train_test_split 训练数据上的“IndexError:元组索引超出范围”【英文标题】:"IndexError: tuple index out of range" on train_test_split train data once attempting to fit for preprocessing 【发布时间】:2022-01-02 06:35:59 【问题描述】:我试图使用规范化预处理我的数据。
# 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)
代码在 Colab 笔记本上运行。该数据集来自 Kaple,它被修改为充满 Unix 时间戳和另一列用于显示当时开放的比特币价格。拆分数据并创建列转换器后,我尝试拟合数据。但是,我收到以下错误:
---------------------------------------------------------------------------
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
我想知道这是否是形状问题,但请注意,X_train 数据的形状为 (2020896,)
。
我需要处理我的数据来修复此错误吗?
【问题讨论】:
【参考方案1】:您将 X_btc 提取为类似于一维数组的 Pandas 系列,您需要提取 DataFrame(二维数组/矩阵)。替换:
X_btc = btc_data["Time"]
与:
X_btc = btc_data[["Time"]]
提取数据帧
编辑新错误:
发生 KeyError 是因为这个转换器:
ct = make_column_transformer(
(MinMaxScaler(), ["Time", "Open"]),
(OneHotEncoder(handle_unknown="ignore"), ["Time", "Open"])
)
您正在使用["Time", "Open"]
列。但是,X_btc 没有列 "Open"
(因为您只选择了列 "Time"
)。 "Open"
是目标标签 (y_btc
),您不应将其包含在 X_btc
中。在这种情况下,您可以从make_column_transformer
中删除"Open"
:
ct = make_column_transformer(
(MinMaxScaler(), ["Time"]),
(OneHotEncoder(handle_unknown="ignore"), ["Time"])
)
【讨论】:
确实将其更改为二维数组,但导致了不同的错误:pastebin.com/dVRqu7ir 查看答案中的编辑 感谢您的解释! 我有点迷路了。请澄清@KhosrawAzizi,你想用这个柱式变压器实现什么? OneHotEncode (OHE) 用于分类数据,据我了解 Time 包含时间戳,Open 包含价格。这两个变量都是连续的,但 OHE 旨在处理分类数据。 MinMaxScaler 有点好,因为它适用于连续变量。但是,我怀疑它应该用于时间戳和价格。另一件事是问题的表述。您想根据时间戳预测价格吗?您想预测未来的价格吗? 澄清一下,我正在通过 TensorFlow 为一个 Science Fair 项目学习。因为现在我正在玩线性回归,所以我想尝试使用归一化来将我的数据在 0 和 1 之间转换。我知道我可能不需要 OneHotEncode,因为我的数据不包含任何字符串数据。稍后我可能会删除它。目前,我正试图通过标准化来减少运行时间和损失,因为我计划训练模型以预测未来价格,然后根据雅虎财经 API 提供的新数据来确认它们。以上是关于一旦尝试适合预处理,train_test_split 训练数据上的“IndexError:元组索引超出范围”的主要内容,如果未能解决你的问题,请参考以下文章