- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我是 keras 机器学习的新手,我计划进行一项机器学习实验,该实验基于具有 lstm 层的递归神经网络预测在视频游戏比赛中购买的前十件商品的序列。
假设给出了一个按gameId
、side
和timestamp
预先排序的示例表:
gameId side timestamp itemId
3030038208 100 4260 1055
3030038208 100 4648 2010
3030038208 100 5036 3340
3030038208 100 291561 1001
3030038208 100 295807 1083
3030038208 100 296457 2010
3030038208 200 3257 1055
3030038208 200 3516 2003
3030038208 200 3775 3340
3030038208 200 321461 1038
3030038208 200 321818 2003
3030038208 200 321979 2003
3030038208 200 491099 3006
3030038208 200 492238 1042
3030038208 200 743864 3086
3030038208 200 744773 1043
....
我现在想将数据框 reshape 为两个(x 和 y)3d numpy 数组,其中第三维描述购买序列的长度 (ItemId
) - 这样基本上每个结果序列中的 2d numpy 数组构成相同 gameId
、side
对
在训练神经网络之前,我还需要插入一个填充,因为上面提到的时间序列为 10。在此示例中,填充值为 0 似乎没问题,但在实际情况中,我使用的是稀疏包含大量 0 值的矩阵。
下面是一些问题:
1) 是否有任何内置函数可用于 numpy、pandas 甚至 keras 以有效实现我的既定目标。我想不出不让我花很多时间想出一个合理的预处理函数的东西。
2) 还有其他需要注意的事项吗?特别是在填充的情况下。在处理稀疏矩阵时填写“-999”不是更有意义吗?
3) 假设模型看起来像那样
model = Sequential()
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2, input_dim=1))
model.add(Dense(y.shape[1], activation='softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['acc'])
monitor = EarlyStopping(monitor='val_loss', min_delta=1e-3, patience=5, verbose=0, mode='auto')
checkpointer = ModelCheckpoint(filepath=filepath + "best_weights.hdf5", verbose=0, save_best_only=True)
与:
history = model.fit(x_train, y_train, epochs=2, validation_split=0.33, callbacks=[monitor, checkpointer], verbose=0).history
我如何才能正确使用处理填充的掩蔽层?
提前感谢您花在该线程上的任何时间!
编辑:根据要求,这里是我想得到的结果 numpy 数组,以便根据 timestamp
和带有 lstm 层的神经网络预测 itemId
keras 填充前:
y = [
[1055, 2010, 3340, 1001, 1083, 2010],
[1055, 2003, 3340, 1038, 2003, 2003, 3006, 1042, 3086, 1043],
...
]
x = [
[[4260], [4648], [5036], [291561], [295807], [296457]],
[[3257], [3516], [3775], [321461], [321818], [321979], [491099], [492238], [743864], [744773] ],
...
]
和之后填充:
y = [
[1055, 2010, 3340, 1001, 1083, 2010, 0, 0, 0, 0],
[1055, 2003, 3340, 1038, 2003, 2003, 3006, 1042, 3086, 1043],
...
]
x = [
[[4260], [4648], [5036], [291561], [295807], [296457], [0], [0], [0], [0]],
[[3257], [3516], [3775], [321461], [321818], [321979], [491099], [492238], [743864], [744773] ],
...
]
但是,在实际示例中,除了时间戳之外,还有更多的功能。
最佳答案
您可以通过几个步骤从 pandas groupby 对象中提取数据来实现这一点。在前两步中,我们将创建 groupby 对象,以便稍后在代码中对其进行操作。从 groupby 对象中,我们将找到最大的组,以便我们可以相应地用零填充
gb = df.groupby(['gameId','side']) # Create Groupby object
mx = gb['side'].size().max() # Find the largest group
创建 x 和 y 的步骤非常相似。我们可以使用列表理解来遍历每个组,将数据帧转换为 numpy 数组并使用 np.pad()
填充零.然后将每个数组 reshape 为 3d
x = np.array([np.pad(frame['timestamp'].values,
pad_width=(0,mx-len(frame)),
mode='constant',
constant_values=0)
for _,frame in gb]).reshape(-1,mx,1)
y = np.array([np.pad(frame['itemId'].values,
pad_width=(0,mx-len(frame)),
mode='constant',
constant_values=0)
for _,frame in gb]).reshape(-1,mx,1)
在此示例中,设置用于多对多 lstm。在评论中我曾指出您当前的设置不支持 3d 输出值,因为在 lstm 层中您没有参数 return_sequence=True
.
不清楚你在这个问题中寻找的是哪种结构。在决定使用哪个 LSTM 网络时,我喜欢引用下图。假设您添加 return_sequence=True
,上面的代码将支持多对多网络。到你的 LSTM 层。如果您想要多对一,请删除 .reshape(-1,mx,1)
来自 y,现在你有一个网络 mx
输出。
无论哪种设置,您都需要修改 input_shape
你的模型的论点。此参数必须指定 x 的第 2 和第 3 维的形状,即
# v Use input_shape here
model.add(LSTM(128, dropout=0.2, recurrent_dropout=0.2, input_shape=x.shape[1:]))
关于python - LSTM 预处理 : Build 3d arrays from pandas data frame based on ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49803503/
当我同时定义两条指令时,如何做到这一点,我会收到编译错误? 在这里我想要错误 #define ENG #define POL #if defined POL #if defined ENG 这里没有
我有actix-web,并且调试困难,因为记录器仅在最后写入,如果出现故障,则根本不会写入。RUST_LOG=actix_web=debug,actix_server=debug let server
对于以下有关数据预处理聚类的问题,我很困惑,在互联网上找不到令人信服的答案。 根据Python documentation ,当我们使用 sckit learn 库中的内置命令进行预处理时,假设数据被
我无法理解预处理器的工作原理以及 ## 在这个特定示例中代表什么 #include #define TEMP_KEY(type,Key) (TEMP_##type | Key) enum TEMPK
我一直在尝试对 Kaggle 上的 Sentiment140 数据库进行一些预处理:https://www.kaggle.com/kazanova/sentiment140 我使用的代码是这样的: i
例如,考虑在 Keras 中微调 Resnet50 模型。 For example here : from keras.applications.resnet50 import ResNet50 fr
我想预处理 JavaScript 属性名称以将其转换为 { 'extension': object, 'config': {id: 1} } 到 { extension: object,
我在编译 C 程序时在预处理步骤中遇到错误。 奇怪的是,我可以运行预处理而没有错误或警告: gcc -I/usr/local/libpng-1.6.24/include -Wall -std=c99
我很好奇 GCC 预处理步骤的输出。更准确地说,以下两行的目的是什么: # 1 "" # 1 "" 我知道格式是 但我不明白本节中可能会出现什么类型的数据。它的目的是什么? 谢谢! 最佳答案 目的是
我需要能够预处理多个 C# 文件作为项目的预构建步骤,检测方法的开始,并在方法开始处插入生成的代码,在任何现有代码之前。但是,我在检测方法的打开时遇到问题。我最初尝试了一个正则表达式来匹配,但最终出现
如何使用 C 预处理自动生成以下代码模式(访问器)? // Immutable accessor. const auto& member1 () const { return _member1;
我正在考虑分两个阶段实现 C 预处理器,其中第一阶段将源文件转换为预处理标记数组。这对于简单性和性能都有好处,因为当项目中的多个文件包含头文件时,不需要重做标记化工作。 障碍: #define f(x
有没有办法“预处理”C99 样式的二合字母以获得 C 文件(或 .i 预处理源),使得生成的文件不包含任何二合字母? 例如,给出以下源代码: %:define N 5 int main() = ;
如何使用 browserify 预处理函数调用? 在一个大的 js 文件中,有时我需要将一个 JSON 对象传递给一个变量,但这个 JSON 对象只能通过函数调用创建: var myvar = Rac
我正在对电视镜头中的字幕应用 OCR。 (我正在使用带 C++ 的 Tesseact 3.x)我正在尝试拆分文本和背景部分作为 OCR 的预处理。 这是原图: 然后,预处理图像: OCR结果为:Sic
我正在开发一个函数,该函数采用众所周知的参数范围,但我不想为每种情况编写许多不同的函数。有没有一种方法可以定义函数的“模式”并使预编译器根据这种模式生成函数? 例子。我有以下功能: int addit
我有一个包含多个脚本标签(接近 20 个)的 html 文件。我决定将所有 JS 文件连接成一个文件,然后缩小连接后的文件。我正在使用 ant 任务来连接并将这样做以进行缩小。我知道我需要提供非串联/
我想在 AngularJS 更新任何 HTML 之前添加一个预处理步骤。为了简单起见,让我们将 hello 的所有实例都加粗。 . 也就是说,如果我们让$scope.text = "hello wor
我正在使用 tess4j 作为来自 JAVA 的 tesseract 的包装器对图像运行一系列 OCR。 ocr 的过程仍然需要大量时间(有时甚至 5 秒),我正在努力加快它的速度。 我正在对图像进行
我一直在阅读有关 Phing 和 Ant 的文章,但我不确定这些工具中哪一个(如果有的话)对这种情况最有用。 它很容易是调试语句等,但我会给你我们的字面扫描。 我们有一个可下载的 PHP 应用程序的免
我是一名优秀的程序员,十分优秀!