2017-11-05 13 views
0

はそれがクローズアップまたは翌日ダウン場合、私が何をしたか(= 1アップ、ダウン= 0)Kerasモデルは、試験精度の下に1.0

を予測するためのコードは、データフレームを作成し、ちょうど を使用して予測することだったです提供しますPriceChange(クローズ今日 - クローズ昨日は)(閉じる次の日 - 今日閉じる)上下に次の日の価格変動を予測する

だからデータフレームは、この

df['PriceChange'] = (df['Close'] > df['Close'].shift(1)).astype(int) 
df['Closeupnextday'] = (df['Close'].shift(-1) > df['Close']).astype(int) 

     PriceChange Closeupnextday 
0    0    1 
1    1    1 
2    1    1 
3    1    1 
4    1    0 
5    0    0 
6    0    0 
7    0    1 

のように見えるそれは常に私の精度を提供します1.0 00 公正であることは50 +%の精度でなければなりません。 私は以下のコードで何かが間違っていると信じていますが、私はそれを見つけることができません。

私はエポック500分の20の後に、それは常に私に1.000 accurancy

どれ助言PLSを与えることを追加する必要がありますか?

def load_data(stock, seq_len): 
    amount_of_features = len(stock.columns) 
    data = stock.as_matrix() #pd.DataFrame(stock) 
    sequence_length = seq_len + 1 
    result = [] 
    for index in range(len(data) - sequence_length): 
     result.append(data[index: index + sequence_length]) 

    result = np.array(result) 
    row = round(0.9 * result.shape[0]) 
    train = result[:int(row), :] 
    x_train = train[:, :-1] 
    y_train = train[:, -1][:,-1] 
    x_test = result[int(row):, :-1] 
    y_test = result[int(row):, -1][:,-1] 

    x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], amount_of_features)) 
    x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], amount_of_features)) 

    return [x_train, y_train, x_test, y_test] 

def build_model(layers): 
    model = Sequential() 

    model.add(LSTM(
     input_dim=layers[0], 
     output_dim=layers[1], 
     return_sequences=True)) 
    model.add(Dropout(0.0)) 

    model.add(LSTM(
     layers[2], 
     return_sequences=False)) 
    model.add(Dropout(0.0)) 

    model.add(Dense(
     output_dim=layers[2])) 
    model.add(Activation("linear")) 

    start = time.time() 
    model.compile(loss="mse", optimizer="rmsprop",metrics=['accuracy']) 
    print("Compilation Time : ", time.time() - start) 
    return model 

def build_model2(layers): 
     d = 0.2 
     model = Sequential() 
     model.add(LSTM(128, input_shape=(layers[1], layers[0]), return_sequences=True)) 
     model.add(Dropout(d)) 
     model.add(LSTM(64, input_shape=(layers[1], layers[0]), return_sequences=False)) 
     model.add(Dropout(d)) 
     model.add(Dense(16, activation="relu", kernel_initializer="uniform"))   
     model.add(Dense(1, activation="relu", kernel_initializer="uniform")) 
     model.compile(loss='mse',optimizer='adam',metrics=['accuracy']) 
     return model 


window = 5 
X_train, y_train, X_test, y_test = load_data(df[::-1], window) 
print("X_train", X_train.shape) 
print("y_train", y_train.shape) 
print("X_test", X_test.shape) 
print("y_test", y_test.shape) 

# model = build_model([3,lag,1]) 
model = build_model2([len(df.columns),window,1]) #11 = Dataframe axis 1 

model.fit(
    X_train, 
    y_train, 
    batch_size=512, 
    epochs=500, 
    validation_split=0.1, 
    verbose=1) 


trainScore = model.evaluate(X_train, y_train, verbose=0) 
print('Train Score: %.2f MSE (%.2f RMSE)' % (trainScore[0], math.sqrt(trainScore[0]))) 

testScore = model.evaluate(X_test, y_test, verbose=0) 
print('Test Score: %.2f MSE (%.2f RMSE)' % (testScore[0], math.sqrt(testScore[0]))) 


# print(X_test[-1]) 
diff=[] 
ratio=[] 
p = model.predict(X_test) 
for u in range(len(y_test)): 
    pr = p[u][0] 
    ratio.append((y_test[u]/pr)-1) 
    diff.append(abs(y_test[u]- pr)) 
    #print(u, y_test[u], pr, (y_test[u]/pr)-1, abs(y_test[u]- pr)) 


print (p) 
print (y_test) 
+0

天気をチェックして、偶然、目標値をトレーニングデータとして含めました。あなたがそのような間違いをしていない限り、これは私が推測することは不可能です。 –

+0

私のデータフレームには何の問題もありません...コードはありますが、それは理解できません –

+1

好奇心の喪失から、MSEを最小限に抑えて、最終層をReLUに分類するのはなぜですか? – jonnybazookatone

答えて

1

(あなたはそれを明確にしていないので、私はあなたがテスト精度について話していることを、ここで前提と - 。列車の精度が実際にあなたのデータ&モデルの詳細に応じて、1.0することができます)

問題、損失、およびメトリックが混乱すると、このような問題は通常発生します。binary_crossentropyがマルチクラス分類問題のケラスでの損失として使用されている場合、同様の混乱についてはthis answer of mineを参照してください。

解決策を試す前に、いくつかの例を手動で予測してください(つまり、model.evaluateではなくmodel.predict)。私はあなたのデータを持っていないので自分自身で行うことはできませんが、私はあなたが得られる結果を賭けるでしょうあなたのmodel.evaluate結果が暗示した完全な精度に準拠します。あなたの問題の核心に

:あなたは、バイナリ分類問題を持っているので、あなたは間違いなくmseモデルのコンパイルにloss='binary_crossentropy'を求める、とはなりません。

は正確にあなたがmodel.evaluateから入手1.0の値であるかについて確認することが、私は上記のリンク先の回答で示したように、どのような評価指標Kerasがmetrics=['accuracy']でコンパイルされたモデルのために返すことはlossため、各エントリに大きく依存していることができません;そして私はその質問には問題だったかを把握することが最終的にできた場合でも、私も(正確にあなたが回帰損失のためaccuracy(すなわち分類メトリック)を要求する場合は、ここに何が起こるのか想像mseを起動することはできません。 )...