"IndexError: tuple index out of range" on train_test_split train data once attempting to fit for preprocessing
"IndexError: tuple index out of range" on train_test_split train data once attempting to fit for preprocessing
我正在尝试使用规范化预处理我的数据。
# 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,)
。
我需要对我的数据做些什么来修复这个错误吗?
您将 X_btc 提取为 Pandas 系列,类似于一维数组,您需要提取 DataFrame (2D array/matrix)。替换:
X_btc = btc_data["Time"]
与:
X_btc = btc_data[["Time"]]
提取 DataFrame
针对新错误进行编辑:
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"])
)
我正在尝试使用规范化预处理我的数据。
# 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,)
。
我需要对我的数据做些什么来修复这个错误吗?
您将 X_btc 提取为 Pandas 系列,类似于一维数组,您需要提取 DataFrame (2D array/matrix)。替换:
X_btc = btc_data["Time"]
与:
X_btc = btc_data[["Time"]]
提取 DataFrame
针对新错误进行编辑:
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"])
)