针对神经网络张量流的1个标签的多个实例预处理数据

Nar*_*gis 6 python machine-learning neural-network deep-learning tensorflow

我正在训练一个神经网络,根据帖子的数量,帖子的类别(视频,链接,状态等)和每个帖子的评论和评论数来预测Facebook页面粉丝增长的数量.因此,针对多个实例存在单个标签,因为每天计算标签(fan_growth)(不是针对每个帖子): 在此输入图像描述

所以如果我对分类数据使用一个热编码: 在此输入图像描述

这里的日期,日期,链接,视频,状态,反应,评论和分享都是功能,而fan_growth是标签.如何针对多个实例使用单个标签?再次使用'100'时,所有前3个实例都不正确.

Eng*_*ero 1

如果我理解正确的话,基本上,在给定的一天内可能发生的事件数量不定(每次发布视频、链接或状态零次或多次),并且对于每个事件,您都有相关的反应、评论和分享。然后,您需要根据一天内采取的不同操作数量来预测每天的粉丝增长情况。如果我错了,请纠正我。

您可以做的是在可变长度的数据序列上训练循环神经网络。您将输入数据的结构如下:

x_ij = [category, reactions, comments, shares]_i for day j
i = 1, 2, ..., n_j (number of posts in day "j")
j = 1, 2, ..., N (number of days in dataset)
Run Code Online (Sandbox Code Playgroud)

您可以将每个时间视为x_ij一天中的一个时间步骤j。那么一天的完整输入序列将如下所示:

X_j = [x_1j, x_2j, ..., x_nj]
Run Code Online (Sandbox Code Playgroud)

你的输出向量将是Y = [y_1, y_2, ..., y_N]其中的 everyy_j是 day 的粉丝增长j。基本上,训练过程涉及使用 来设置循环神经网络tf.nn.dynamic_rnn并使用sequence_length来指定每个输入序列的长度。它看起来像这样(这里将跳过很多实现细节):

cell = tf.contrib.rnn.GRUCell(num_hidden)
# Any additional things like tf.contrib.rnn.DropoutWrapper you want here
cell = tf.contrib.rnn.OutputProjectionWrapper(cell, 1)  # only one output number, right?
output, _ = tf.nn.dynamic_rnn(cell, data, sequence_length=sequence_length)
Run Code Online (Sandbox Code Playgroud)

请注意,我在这里使用GRU 单元TF 文档)而不是LSTMTF 文档)。这在一定程度上是偏好,但基本上 GRU 可以做 LSTM 能做的所有事情,而且效率更高。然后,您将运行训练过程,传递大小为 的批量数据[batch_size, num_steps_per_day, num_features],以及给出每天步数的sequence_length大小张量。[batch_size, 1]就像是:

with tf.Session() as sess:
  for epoch in range(num_epochs):
    shuffle_training_set()
    for batch in range(num_batches):
      d = get_next_batch()
      t = get_next_target_batch()
      s = # length of each data sample in your batch
      sess.run(optimize, feed_dict={data: d, targets: t, sequence_length: s})
      # periodically validate and stop when you stop improving
Run Code Online (Sandbox Code Playgroud)

在这里,optimize可能定义如下:

cost = # your cost function here...
optimizer = tf.train.AdamOptimizer()  # I usually have luck with this optimizer
optimize = optimizer.minimize(cost)
Run Code Online (Sandbox Code Playgroud)

查看这个优秀的示例(不是我的内容),让您开始了解一些实现细节。此示例显示了序列标签,但修改它以预测粉丝增长应该相当简单。