2017-09-05 18 views
0

我一直在研究一個我一直在嘗試不同機器學習算法的大數據集。我用XGBoost得到了非常好的結果,但是我得到的最好結果來自SVM。但是因爲我有8年的數據傳播時間,所以我想到了使用RNN的時間序列模型。我一直在試驗RNN-LSTM的超參數,通過增加層數或每層節點的數量,因爲沒有經驗法則。但是,我還沒有接近我的XGBoost結果。我注意到的奇怪之處在於,即使將時期數從100增加到1000,或者我將隱藏層的數量從1增加到3,或者我更改了每層的節點,但模型的性能始終是相同的用於培訓和測試集。我分享我的RNN-LSTM代碼,請告訴我是否缺少任何東西。從理論上講,如果不是更好的話,它至少可以和支持向量機一樣好,因爲數據質量也非常好而且很長。提高RNNs的複雜度

# Getting the inputs and the ouputs 
X = allData.iloc[:-48,:-1].values 
y = allData.iloc[:-48,-1].values 
y = y.reshape(-1,1) 

# Feature Scaling 
from sklearn.preprocessing import MinMaxScaler 
sc_x = MinMaxScaler() 
sc_y = MinMaxScaler() 
X = sc_x.fit_transform(X) 
y = sc_y.fit_transform(y) 
y = np.ravel(y) 
X = np.reshape(X, (-1,1,X.shape[1])) 
y = np.reshape(y, (-1,1,1)) 

# Building RNN 
regressor = Sequential() 
regressor.add(LSTM(units = 8,activation = 'tanh',recurrent_activation = 'relu',return_sequences = True, input_shape = (X.shape[1],X.shape[2]))) 
regressor.add(LSTM(units = 3,activation = 'tanh', recurrent_activation ='relu', return_sequences = True)) 
regressor.add(TimeDistributed(Dense(units = 1))) 
regressor.compile(optimizer = 'adam', loss = 'mean_squared_error') 
regressor.fit(X, y, batch_size = 32,shuffle = False, epochs = 100,validation_split=0.1) 

我無法獲得與此模型相當的準確度。我可以在RNN中嘗試做什麼其他的事情,至少可以類似於其他機器學習算法?

+1

在發送到RNN之前,X和y的最終形狀是什麼?另外你爲什麼不使用LSTM中的默認激活?我從不碰這些選項。除非您使用有狀態的LSTM,否則隨機應該始終爲真。 –

+0

X的最終形狀是(3163,24,5),y的最終形狀是(3163,24,1)。 24是因爲數據是小時數據,所以我認爲24會爲LSTM提供最好的信息。我嘗試使用默認激活以及相同的結果。我把洗牌視爲虛假,因爲我不確定如果2016年的一批與2013年的一批相關聯(如果我獲得了正確的洗牌感),時間系列將如何保持。我嘗試使用有狀態的LSTM,但他們表現更差。 – user7400738

+1

只是一些提示。 1.使用標準縮放器2.您是否對XgBoost使用相同的標量? 3.使用默認激活4.增加批量,例如256 5.增加單位,至少說32。 6.您需要按照特定的順序準備數據,以便將數據提供給有狀態的LSTM(現在忽略有狀態)。 7.發佈XgBoost與LSTM MSE的結果。 –

回答

0

我會建議嘗試一個簡單的多級感知器模型,然後再調整它以包含RNN圖層。我面臨着類似的情況,最後我使用了XGBoost模型,這並不是因爲準確性具有可比性,而是更容易解釋和理解。

此外,嘗試將您的問題轉換爲一個分類(bin Y到類等)。

+0

完全同意XGBoost的透明度因子,是的,我也將嘗試一個簡單的多級感知器模型,以設置神經網絡模型的基準。但是,如果現在最終的結果(準確性)是我唯一關心的東西,即使它來自黑盒子,只要它是穩健的,從驗證和測試集的性能就可以看出來。 也將它轉換成分類問題有時可能會有用,但我有一個要求,以獲得確切的數字,而不是一個範圍,所以在這種情況下不能這樣做,但感謝這個想法。 – user7400738

0

我會嘗試使用有狀態的LSTM來獲得長期依賴的全部好處。我還建議不要使用min-max縮放,也許嘗試mean-std縮放,然後剪切-1,1或0,1之間的值。另外,對於我在經常性連接中有relu似乎很奇怪。也許嘗試使用對稱的。

+0

是的,將嘗試有狀態的LSTM。我在運行時使用reset_state()參數時感到困惑,因爲我將批量大小設置爲1,然後在每個時間段後使用reset_state(),它會記住整個系列,這意味着整個5 6年。我希望它記住季節模式超過每年,所以希望我可以相應地reset_state。 這種類型的縮放是否意味着2層縮放。首先我們做標準化,並且我們使用min max並且使得所有內容都在(-1,1)或(0,1)的範圍內? 然後嘗試使用tanh或sigmoid進行經常性連接。 – user7400738

+0

我實際上認爲使用一些固定的縮放器並剪切數據會更好。有時,如果出現最小值或最大值的異常值,則最小值可能會丟失很多方差。 在批量大小爲1之後,您正確地調用了reset_state(),這意味着它不會每年重置,而只會在整個5-6年後重置。如果您想在每年之後重新設置,只需分成5-6個年度示例,並在批量大小爲1的情況下重新設置每個示例之間的狀態。 – convolutionBoy

+0

不會裁剪數據會影響數據的時間序列性質嗎?所以我嘗試了一個有狀態的LSTMs,而不是整個5年6年,我花了1年時間,然後讓模型學到了一切。當我使用激活作爲relu時,我的訓練損失爲nan,因此我將其改爲sigmoid,現在mse接近400。我認爲現在有一些過度配合。但謝謝你的建議。 – user7400738