gpt4 book ai didi

python - 如何将 2D 和 1D 类(分别是单热编码和常规整数)的混合输入到 Keras 序列模型中?

转载 作者:行者123 更新时间:2023-11-30 09:47:34 25 4
gpt4 key购买 nike

我有一个包含 849743 行和 13 列的 pandas DataFrame,即形状为 (849743,13)。

这些列中的大多数仅包含整数,但是其中 3 个列具有 one-hot 编码的分类变量。它们没有使用 Keras 或 sklearn(或任何其他库)的 one-hot 编码/嵌入功能进行编码,我只是在 python 中手动完成。

例如,df['d'] 是一个包含 one-hot 编码变量的列,以下是摘录:

1082077    [0, 1, 0, 0, 0, 0, 0]
995216 [1, 0, 0, 0, 0, 0, 0]
924611 [0, 0, 0, 0, 1, 0, 0]
1171772 [0, 0, 0, 1, 0, 0, 0]
96796 [0, 0, 1, 0, 0, 0, 0]

请忽略无意义的 Pandas 索引。

这是该列中的第一行:

array([1, 0, 0, 0, 0, 0, 0])

可以看出,这个DataFrame列的元素都是嵌套的numpy数组。

为了进一步了解 Pandas DataFrame 的结构,以下是第一行的所有元素:

a                    [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, ...
b [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
c 1
d [1, 0, 0, 0, 0, 0, 0]
e 1.53079
f -0.415253
g -0.425906
h -0.355143
i -0.249699
j -0.13448
k 0.882726
l 1.23091

随后,我使用以下方法将其转换为 numpy 数组:

x_train = df.values

这保留了 DataFrame 的原始尺寸,即 (849743,13)。

我创建了一个无意义的 Keras Sequential 模型,只是为了测试输入是否有效,这就是我首先发现错误的方式。模型如下:

# create model
model = Sequential()
model.add(Dense(130, input_dim=13, kernel_initializer='normal',
activation='relu'))
model.add(Dense(1, kernel_initializer='normal'))
# Compile model
model.compile(loss='mean_squared_error', optimizer='adam')

input_dim 已设置为 13,因为 DataFrame/numpy 数组中有 13 列,但是,我相信问题是由 3 个 one-hot 编码列中的嵌套 numpy 数组引起的。

我将原始的 13 列 numpy 数组(称为 x_train)与 y_train(观察变量)一起输入到 model.fit 函数中:

model.fit(x_train, y_train,
epochs=20,
batch_size=128)

我收到以下错误:

    Bad input argument to theano function with name "train_function" at index 0 (0-based).  
Backtrace when that variable is created:

File "C:\Users\Studying\AppData\Local\conda\conda\envs\Tensorflow-gpu\lib\site-packages\spyder\utils\site\sitecustomize.py", line 101, in execfile
exec(compile(f.read(), filename, 'exec'), namespace)
File "C:/Users/Studying/Documents/GitHub/IFN665/Machine Learning/keras_regression_practice.py", line 106, in <module>
model = baseline_model(input_shape)
File "C:/Users/Studying/Documents/GitHub/IFN665/Machine Learning/keras_regression_practice.py", line 23, in baseline_model
model.add(Dense(130, input_dim=1, kernel_initializer='normal', activation='relu'))
File "C:\Users\Studying\AppData\Local\conda\conda\envs\Tensorflow-gpu\lib\site-packages\keras\models.py", line 432, in add
dtype=layer.dtype, name=layer.name + '_input')
File "C:\Users\Studying\AppData\Local\conda\conda\envs\Tensorflow-gpu\lib\site-packages\keras\engine\topology.py", line 1426, in Input
input_tensor=tensor)
File "C:\Users\Studying\AppData\Local\conda\conda\envs\Tensorflow-gpu\lib\site-packages\keras\legacy\interfaces.py", line 87, in wrapper
return func(*args, **kwargs)
File "C:\Users\Studying\AppData\Local\conda\conda\envs\Tensorflow-gpu\lib\site-packages\keras\engine\topology.py", line 1337, in __init__
name=self.name)
File "C:\Users\Studying\AppData\Local\conda\conda\envs\Tensorflow-gpu\lib\site-packages\keras\backend\theano_backend.py", line 222, in placeholder
x = T.TensorType(dtype, broadcast)(name)
setting an array element with a sequence.

已经通过删除所有one-hot编码列并相应地调整input_dim变量来尝试它,它确实工作(工作在某种意义上它不会导致错误,该模型显然是一个垃圾预测器)。

我不相信(尽管缺乏搜索)有一个 numpy 数组,其中某些元素是 2D,有些是 1D,例如将嵌套的 numpy、one-hot 编码数组更改为 2D 列表并允许所有其他变量保持一维。

我在此网站上搜索过类似的问题,但是,我发现的有关 Keras 和 one-hot 编码变量的所有内容似乎要么是在问它是什么,要么是在问如何做到这一点,而不是在问如何做到这一点。混合使用 one-hot 编码和一维整数输入。

如何做到这一点?我是否遗漏了一些明显的东西?

最佳答案

问题是因为您的数据不统一,当您将其转换为 NumPy 数组时,某些条目又是数组,即热编码的数组,这会导致形状/类型不匹配。根据您想要处理数据的方式,您有 2 个选项:

  1. 展平内部数组,因此最终形状为(样本,>13)。我所说的展平是指在 NumPy 数组中为独热编码数据提供更多列。一行看起来像一个混合物 [0,0,1,0,0,..., 2.3492,1.3483,...] 因此形状是一致的。然后你的 input_dim=len(data[0])
  2. 如果您确实想要单独的输入,也许您想以不同的方式处理它们,例如传递到不同的密集层等,您将需要升级到 functional API 。这将是一个多输入模型,文档对此进行了很好的解释。

关于python - 如何将 2D 和 1D 类(分别是单热编码和常规整数)的混合输入到 Keras 序列模型中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50540668/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com