2017-12-30 79 views
11

나는 휴일 동안 Keras에 대한 경험을 쌓기 위해 노력하고 있으며, 주식 데이터에 대한 timeseries 예측의 교과서 예부터 시작할 것이라고 생각했습니다. 그래서 제가하려고하는 것은 평균 48 시간의 평균 가격 변화 (이전의 퍼센트)가 주어지고 다음 시간의 평균 가격이 얼마인지를 예측합니다.Keras LSTM 예고편 추측 및 축퇴

그러나 테스트 세트 (또는 트레이닝 세트)에 대해 검증 할 때 예측 시리즈의 진폭은 항상 꺼져 있고 때로는 항상 양의 값 또는 항상 음의 값으로 시프트됩니다. 즉 0 % 나는 이런 종류의 일에 맞을 것이라고 생각한다. 당신이 볼 수 있듯이

df = pandas.DataFrame.from_csv('test-data-01.csv', header=0) 
df['pct'] = df.value.pct_change(periods=1) 

seq_len=48 
vals = df.pct.values[1:] # First pct change is NaN, skip it 
sequences = [] 
for i in range(0, len(vals) - seq_len): 
    sx = vals[i:i+seq_len].reshape(seq_len, 1) 
    sy = vals[i+seq_len] 
    sequences.append((sx, sy)) 

row = -24 
trainSeqs = sequences[:row] 
testSeqs = sequences[row:] 

trainX = np.array([i[0] for i in trainSeqs]) 
trainy = np.array([i[1] for i in trainSeqs]) 

model = Sequential() 
model.add(LSTM(25, batch_input_shape=(1, seq_len, 1))) 
model.add(Dense(1)) 
model.compile(loss='mse', optimizer='adam') 
model.fit(trainX, trainy, epochs=1, batch_size=1, verbose=1, shuffle=True) 

pred = [] 
for s in trainSeqs: 
    pred.append(model.predict(s[0].reshape(1, seq_len, 1))) 
pred = np.array(pred).flatten() 

plot(pred) 
plot([i[1] for i in trainSeqs]) 
axis([2500, 2550,-0.03, 0.03]) 

, 나는, 지난 48 시간을 선택하여, 교육 및 테스트 시퀀스를 생성하고 튜플에 다음 단계 :

나는이 문제를 보여주기 위해 다음과 같은 최소한의 예를 함께했다 , 그리고 나서 1 시간 동안 진행하면서 절차를 반복하십시오. 모델은 매우 간단한 1 LSTM 및 1 밀도 레이어입니다.

개별 예측 포인트의 플롯은 트레이닝 시퀀스의 플롯 (모든 것이 훈련 된 동일한 세트 임)과 테스트 시퀀스에 대한 일종의 일치를 기대할 수 있습니다. 데이터

enter image description here

는 계속 될 수 있습니다 어떤 생각 예측 :

  • 오렌지 : 진정한 데이터
  • 블루 그러나 나는 훈련 데이터에 다음과 같은 결과를 얻을? 내가 뭔가를 오해 했니?

    업데이트 : 내가 의미하는 바를 쉬프트하고 부숴 버렸습니다. 실제 데이터와 일치하도록 예측치를 다시 플롯하고 진폭을 일치시키기 위해 곱해 봤습니다.

    enter image description here

    당신이 예측이 잘 실제 데이터에 맞는 볼 수 있듯이

    plot(pred*12-0.03) 
    plot([i[1] for i in trainSeqs]) 
    axis([2500, 2550,-0.03, 0.03]) 
    
    는, 단지 숙청 어떻게 든 오프셋, 그리고 그 이유를 알아낼 수 없습니다입니다.

+0

아직 교육 데이터에 있으므로 "좋은 적합성"을 기대합니다. 예측이 새로운 데이터에 대해 수행되면 분산 될 수 있다는 것을 완전히 이해할 것입니다. 그러나 교육 세트에서 모델의 재조정 및 이동이 필요없이 좋은 근사값을 반환 할 것으로 기대합니다. – cdecker

+0

당신은 test-data-01.csv를 공유 할 수 있습니까? – grubjesic

+0

은 물론 : 나는 https://gist.github.com/anonymous/50dc9e36616605bfbf021642b47a4336 – cdecker

답변

7

데이터의 차원이 1이고 25 단위의 LSTM이 이러한 저 차원의 데이터 집합에 비해 다소 복잡해 보일 수도 있으므로이 맞지 않는다고 가정합니다. 여기에 내가 시도 할 것들의리스트가있다 :

  • LSTM 치수를 줄인다.
  • 오버 피팅을 방지하기 위해 정규화를 추가하십시오. 예를 들어, dropout이 좋은 선택 일 수 있습니다.
  • 더 많은 신기원을 학습하거나 학습 속도를 변경하십시오. 적절한 매개 변수를 찾으려면 모델에 더 많은 에포크 또는 더 큰 업데이트가 필요할 수 있습니다.

업데이트 : 날 우리는 코멘트 섹션에서 설명한 것을 요약하겠습니다.

은 단지 설명을위한 첫 번째 플롯은 검증 세트에 대한 예측 시리즈를 보여 주지만, 훈련 세트하지 않습니다. 따라서 내 첫 번째 해석이 부정확 할 수 있습니다. 나는 질문 할 적절한 질문이 될 것이라고 생각한다 : 저 차원의 데이터 세트로부터 미래의 가격 변화를 예측하는 것이 실제로 가능한가? 기계 학습 알고리즘은 마법이 아닙니다. 데이터가있는 경우에만 패턴을 찾습니다.

혼자 과거 가격 변화는 실제로 다음 미래 가격 변화에 매우 유익하지 않은 경우 :

  • 가격 변화의 평균 예측하는 방법을 배웁니다 귀하의 모델 (아마도 뭔가를 주위 0) 이는 유익한 기능이없는 경우 최저 손실을 발생시키는 값이기 때문입니다. 타임 스텝의 t + 1의 가격 변화는 약간의 시간 단계 t에서의 가격 변화와 관련되어 있기 때문에
  • 예측이 약간 것으로 나타날 수 있습니다 "이동"(하지만 여전히, 0에 가까운 무언가를 예측하는 가장 안전한 선택이다). 그것은 사실, 내가 경험하지 못했던 것처럼 관찰 할 수있는 유일한 패턴입니다 (즉, 타임 스텝 t + 1의 값은 타임 스텝 t의 값과 때로는 유사합니다).

timesteps t와 t + 1의 값이 일반적으로 서로 더 관련이있는 경우 모델은이 상관 관계에 대해 더 확신하고 예측의 진폭이 더 커질 것으로 추정합니다.

+0

은 훈련 데이터에 대한 거의 완벽한 경기 결과를 overfitting하지 않을까요 여기에 업로드? 이것은 실제로 반대 방향으로 가고 있습니다. 또한 나는 지금까지 시도한 모든 모델에 대해이 결과를 얻는다. (간단하고 복잡한 것들) – cdecker

+0

오, 나는 당신의 음모를 잘못 해석했다. 맞아요, 훈련 데이터와 일치해야합니다. 나는 주식 데이터에 대해 경험이 없지만 그러한 경우 저 차원의 데이터 세트에서 미래의 가격 변화를 예측하는 것이 실제로 가능하다고 생각합니까? 다시 말해, 전문가는 과거의 가격 변화로부터 미래의 가격 변화를 예측할 수 있습니까? – rvinas

+1

대답이 "아니오"이면 결과가 나에게 완벽 할 것입니다. 데이터에 명확한 패턴이없는 경우 모델은 유익한 기능이없는 경우 최저 손실을 발생시키는 값이기 때문에 가격 변경의 평균을 예측하는 방법을 배우게됩니다 (아마 0에 매우 근접한 값 일 수 있습니다). 그런 다음, timestep t + 1의 가격 변화가 timestep t의 가격 변화와 약간 상관되기 때문에 예측은 약간 "이동"한 것처럼 보일 수 있습니다 (그러나 여전히 0에 가까운 것이 가장 안전한 선택이라고 예측 함). – rvinas

1
  1. 증가 시대의 수. 과도한 피하기 위해 EarlyStopping을 사용할 수 있습니다.
  2. 데이터 크기 조정 방법은 무엇입니까? 시계열은 데이터의 특이 치에 매우 민감합니다. 예를 들어 MinMax ((0.1, 0.9))를 시도하면 RobustScaler도 좋은 선택입니다.
  3. 난 당신이 많은 데이터를 때까지 LSTM (seq_len)이 정말 필요 이상으로 모르겠어요. 왜 더 작은 차원을 시도하지 않습니까?

는이 모든 것을 시도하고 (MSE 주위 제로 실제 데이터 세트에 있어야한다) overfit하려고합니다. 그런 다음 규칙을 적용하십시오.

UPDATE

plot(pred*12-0.03) 

잘 맞는에 의해 거지 왜 내가 당신을 설명해 보자.

좋아, 우리는 블랙 박스로 LSTM 층을 고려하자 잊어 버려요. 그것은 우리에게 25 가지의 가치를 돌려줍니다 - 그게 전부입니다. 일반적 가깝다 NN 의해 초기에 정의 된 벡터 -와트 여기

y = w * x + b 

B : 이 값은 우리가 25 개 값 함수의 벡터에 적용되는 멤브레인 층, 앞으로 진행 제로. x - LSTM 레이어 이후의 값 및 y - 타겟 (단일 값).

당신은 단지 한 시대 가지고 있지만 : w와 b는 (그들은 주위에 실제로 제로) 데이터에 전혀 적합하지 않습니다.그러나 무엇을 신청하면

plot(pred*12-0.03) 

예측 값에? 당신은 (어딘가) 목표 변수 wb에 적용합니다. 지금 B W 및 단일 값이 아닌 벡터이며, 그들은 하나의 값이 적용된다. 그러나 Dense 레이어와 거의 동일한 작업을 수행합니다.

그래서 더 잘 맞는 에포크의 수를 늘리십시오. 그런데

UPDATE2 , 나는 데이터의 일부 이상 값을 참조하십시오. MAE를 손실/정확성 측정 항목으로 사용할 수도 있습니다.

+0

여기에있는 문제는 지나치지 않습니다 (처음에는 음모가 유효성 검사 데이터 집합과 관련이 있다고 생각했습니다). 올바르게 이해하면 데이터는 합리적인 범위 (-1, 1) 내에 있습니다. 가격 변동. 오히려이 논평 중 하나에서 논하는 것처럼이 기능이 충분히 유익하지 않을 수도 있다고 생각합니다. – rvinas

+0

동의 함 - 제공되는 코드에서 에포크의 수 = 1이기 때문에 현재 과장이 있습니다. 방금 TS에 대해 언급했습니다. 다음 단계에서 보류 문제가 발생합니다. 스케일링 관련. 스케일링에 대해서는 다시 동의하지만 리 스케일링이 도움이되지 않을지 확신하지 못합니다. 간단히 알 수 없습니다. 아마도 매우 작은 입력 값이 좋지 않을 수 있습니다. 내 손에 알맞지 않은 데이터 세트를 확인하고 점검하지 마십시오. 어쩌면 소음 일 수 있습니다.이 경우 예측은 거의 무의미합니다. – avchauzov

+0

고밀도 포인터가 선형 근사 함수가되어 주셔서 감사합니다. 슬프게도 epochs = 100으로 실행해도 실제로 아무 것도 변경되지 않습니다. – cdecker