2017-10-08 13 views
0

나는 N 개의 관측치와 F 특징을 가진 timeseries 데이터 세트를 가지고 있습니다. 모든 기능은 매니페스트 (1) 또는 매니페스트 (0) 중 하나 일 수 있습니다. 그래서 데이터 세트는 다음과 같이 보일 것이다 :keras LSTM timeseries 예측 : 특징 벡터 예측

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 

을 나는 관찰 TW에 따라 시간 T + 1에서 매니페스트있는 기능을 예측하는 LSTM 기반 아키텍처를 사용하는 것을 시도하고있다 - W 일부의 폭 T, 시간 창. W = 4 일 경우, LSTM은 예측을하기 위해 과거로 4 타임 스텝을 '본다'. LSTM은 (number_batches, W, F) 형식의 3D 입력을 기대합니다.

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)) 

나는 데 가장 큰 문제는 이것이다 : 순진 Keras 구현처럼 보일 수 있습니다 전체 데이터 집합 기능 (> 200)의 큰 숫자를 가지고 있으며,이 기능을 발현하는데 상대적으로 드문, 즉 0이 신경망은 모든 값을 0으로 설정하는 것을 단순히 배우므로 고도의 '정확도'를 얻습니다.

본질적으로, 저는 입력 행렬에서 1을 더 중요하게하기 위해 어떤 값으로 가중치를 넣고 싶습니다. 그러나 이것을 Keras에서 어떻게 구현하는지 혼란 스럽습니다. Keras에 sample_weight 옵션이 있다는 것을 알고 있지만 어떻게 작동합니까? 예를 들어이를 구현하는 방법을 알지 못합니다. 이 문제에 대한 합리적인 해결책입니까? 이러한 유형의 문제에 일반적으로 사용되는 옵티 마이저 및 손실 함수는 무엇입니까?

+0

= 1 대신 하나? – DJK

답변

1

이것은 2D 고 평형 데이터에 사용하는 손실 함수입니다. 매우 잘 작동합니다. binary_crossentropy을 다른 종류의 손실로 교체 할 수 있습니다. 당신의 3D 데이터에 대한

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) 

이 작동 할 수 있지만 어쩌면 당신은 각 기능에 대한 무게의 쌍을 생성하는 대신 모두 함께 기능을 합산, 열에서 일할 수 있습니다.

은 다음과 같이 할 것입니다 :

당신이 = -1 0을 사용하는 대신 시도 않았다
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) 
+0

감사합니다. 이것은 내가 필요한 것처럼 보입니다. –