這一集要定義卷積網路的樣子,然後把圖片和標籤丟進去,
看看卷積神經網路在指數預測的能力如何。
----------------------------------------------------------------------------------------------
六、資料處理
首先,在 data_processing.py 中,繼續加入以下方法,
def data_processing(test_size=0.05, start_year=2000):
# 取出資料以及標籤
df = get_rawdata()
df = df.loc[date(start_year,1,1):date(2015,12,31)]
# 增加技術指標
df['close_mvag5'] = df['close_adjusted'].rolling(window=5).mean()
df['close_mvag20'] = df['close_adjusted'].rolling(window=20).mean()
df['close_mvag60'] = df['close_adjusted'].rolling(window=60).mean()
df.dropna(inplace=True)
# 整理資料欄
df_X = df[['open','high','low','close_adjusted','close_mvag5','close_mvag20',
'close_mvag60','volume']]
df_y = df['label']
# 對資料亂數
datasets = sample_suffling(df_X,df_y)
datasets = np.array(datasets)
testing_size = int(test_size * len(datasets))
# 分類測試組以及訓練組,並且圖像化
train_x = list(datasets[:,0][:-testing_size])
train_x = sample_visualizing(train_x)
train_y = list(datasets[:,1][:-testing_size])
test_x = list(datasets[:,0][-testing_size:])
test_x = sample_visualizing(test_x)
test_y = list(datasets[:,1][-testing_size:])
return train_x, train_y, test_x, test_y
這邊可以執行這個檔案並用 plt.show() 看一下資料長相。
這是其中一張圖片的範例,橫軸代表的是交易日,縱軸代表的是各個技術指標。
由這張圖可以看出,過去20天的狀況是,前面與後面股價強勢,
中間經歷了一個低檔盤整,並且現在處在出量上漲的階段。
看完圖片資料,確定沒問題後,我們就可以繼續著手寫 CNN model。
----------------------------------------------------------------------------------------------
七、卷積模型定義與最佳化
這邊因為之前已經講解過,CNN model的定義與最佳化,
我就直接附上 Github 連結,不多做解釋。
利用 tensorboard 可視化後,看到我們 CNN model 是長這樣,
然後終端機中,運行我們模型的預測能力,跑出來的結果是這樣,
準確率 0.48 丟銅板都還高一點。
----------------------------------------------------------------------------------------------
八、結果與討論
這邊大概討論一下,為什麼會這麼失敗呢?
像我們這個 loss 完全沒有掉下來的狀況,我會直接分類為兩種可能性,
一種是 輸入資料根本無法學習到東西,
第二種是 這個模型不夠好,無法學到東西。
我們先討論第二種狀況,
overfitting 就是屬於第二種狀況,看一下我們上面 CNN model的圖像化,
多麽複雜,經過兩次的 filter 轉換再搭配 兩次的 full connected layers。
在最佳化上面,
這一個超不線性維度超高的 model 照理說是可以完美的 fit 到我們的 training data,
那正因為這樣子,而造成 test data 的性質完全無法被 model 給預測出來,
因為 model 已經是 training data 的形狀,而非原本全部資料的形狀了。
那處理的方法,我們可以去降低 model 的自由度,或者是加上 drop_rate。
我有試著改過,也確實沒有比較好 QQ
那第一種情況呢?
其實這就比較直觀,也是我本人比較相信的觀點,
因為我認為這種超高自由度的 operator 本該可以學會任何東西,
如果學不到東西,一定是因為我們教錯了,
可能我們給了兩張一樣的圖片,結果一張說是漲一張說是跌,那這樣模型當然無法學習,
但這在股票市場卻是非常有可能會發生的,不是嗎?
所以,必須要換個資料處理的方式,或甚至是要預測的東西,才能夠換得更好的成果。
除此之外,
最一開始提到了,我 paper 沒有仔細看,而浪費時間做了這個 project 是為什麼呢?
因為基礎的 CNN 是沒有辦法對於空間有辨識度的,
意思就是,假設圖片中的貓在右上角或在左下角,模型都可以判別為貓。
但這在我們股票的假設就不行了,因為我們的橫軸是交易日,
明顯地,訊號出現在右邊與出現在左邊,並不會是相同的狀況,
所以我們在基本假設上就失敗了。
關於改善的方法呢,大致上可以列為下列幾個,
1. 縮小 model 的自由度
2. 更改學習的資料,使用不受 x,y 位置影響的 input
3. 更改標籤資料
4. 以 CNN 搭配具備時間辨識能力的模型來訓練。
這次悲慘的練習,就到這裡,
不要擔心,下次會更好。
我自己在處理資料時,學到很多東西,
也藉由這個練習,對 CNN 有了更深刻的理解!
下一集,我們將使用 RNN 模型,來對台指做辨識,結果其實滿令人興奮的。
------------------------------------------------------------------------------------------------------------
Reference
[1] Practical Machine Learning Problem
[2] 圖解機器學習
[3] Coursera - Machine Leanring
[4] A tour of machine learning algorithms
感謝大大的分享!
回覆刪除想請問關於文中 "CNN 是沒有辦法對於空間有辨識度的"有哪篇paper有理論說明可以參考嗎?
假設如此,CNN是否都不適合拿來解時間序列的問題呢? 謝謝!
TI-POOLING: transformation-invariant pooling for feature learning in Convolutional Neural Networks
回覆刪除https://arxiv.org/pdf/1604.06318.pdf
A Theoretical Analysis of Feature Pooling in Visual Recognition
http://machinelearning.wustl.edu/mlpapers/paper_files/icml2010_BoureauPL10.pdf
Fukushima, K and Miyake, S. Neocognitron: A new al- gorithm for pattern recognition tolerant of deformations and shifts in position. Pattern Recognition, 1982.
這三篇都有提到,主要的說詞都說是因為 pooling,
我自己的理解是 filter 和 pooling 都會造成這種 translation invariance。
很多人是把 CNN 加上 lstm 去做,
http://blog.revolutionanalytics.com/2016/09/deep-learning-part-3.html
https://github.com/yoonkim/lstm-char-cnn
類似說,我們用 CNN 取出每日線圖的 features 然後去給 lstm 學這樣,
希望有回答到你。