首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于时序预测的Keras LSTM :特征的预测向量

用于时序预测的Keras LSTM :特征的预测向量
EN

Stack Overflow用户
提问于 2017-10-08 14:30:52
回答 1查看 750关注 0票数 1

我有一个带有N个观测和F特性的timeseries数据集。每个特性都可以显示(1)或不显示(0)。因此,数据集看起来如下:

代码语言:javascript
复制
T    F1    F2    F3    F4    F5 ... F
0    1     0     0     1     0      0
1    0     1     0     0     1      1
2    0     0     0     1     1      0
3    1     1     1     1     0      0
...
N    1     1     0     1     0      0

我试图使用一种基于LSTM的体系结构,根据观察到的T+1 (其中W是某个时间窗口的宽度)来预测T+1在时间上表现出来的哪些特征。如果是W=4,LSTM‘会看到过去的4个时间步骤,以便做出预测。LSTM期望三维输入,这将是形式(number_batches,W,F)。天真的Keras实现看起来可能如下所示:

代码语言:javascript
复制
model = Sequential()
model.add(LSTM(128, stateful=True, batch_input_shape=(batch_size, W, F)))
model.add(Dense(F, activation='sigmoid'))

model.compile(loss='binary_crossentropy',
              optimizer='rmsprop',
              metrics=['accuracy'])
model.fit(x_train, y_train,
          batch_size=batch_size, epochs=250, shuffle=False,
          validation_data=(x_val, y_val))

我遇到的主要问题是:完整的数据集有大量的特征(> 200),而且特征的表现相对较少,即0比1普遍得多。神经网络只是学习将所有值设置为0,从而达到很高的“准确性”。

本质上,我希望在输入矩阵中每1加权一个值,以使其更重要,但我不知道如何在Keras中实现这一点。我知道Keras中有一个选项sample_weight,但是它是如何工作的呢?例如,我不知道如何在我的例子中实现它。这是否解决我的问题的一个合理办法?对于这种类型的问题,常用的优化函数和损失函数是什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-10-08 20:11:11

这是一个损失函数,我使用的2D高度不平衡的数据,它工作得很好。你可以用binary_crossentropy代替另一种损失。

代码语言:javascript
复制
import keras.backend as K

def weightedByBatch(yTrue,yPred):

    nVec = K.ones_like(yTrue) #to sum the total number of elements in the tensor
    percent = K.sum(yTrue) / K.sum(nVec) #percent of ones relative to total
    percent2 = 1 - percent #percent of zeros relative to total   
    yTrue2 = 1 - yTrue #complement of yTrue (yTrue+ yTrue2 = full of ones)   

    weights = (yTrue2 * percent2) + (yTrue*percent)
    return K.mean(K.binary_crossentropy(yTrue,yPred)/weights)

对于您的3D数据,这可能是可行的,但也许您可以在列中工作,为每个功能创建一对权重,而不是将所有功能相加在一起。

这样做是这样的:

代码语言:javascript
复制
def weightedByBatch2D(yTrue,yPred):

    nVec = K.ones_like(yTrue) #to sum the total number of elements in the tensor
    percent = K.sum(K.sum(yTrue,axis=0,keepdims=True),axis=1,keepdims=True) / K.sum(K.sum(nVec,axis=0,keepdims=True),axis=1,keepdims=True) #percent of ones relative to total
    percent2 = 1 - percent #percent of zeros relative to total   
    yTrue2 = 1 - yTrue #complement of yTrue (yTrue+ yTrue2 = full of ones)   

    weights = (yTrue2 * percent2) + (yTrue*percent)
    return K.mean(K.binary_crossentropy(yTrue,yPred)/weights)   
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46632225

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档