顯示具有 機器學習 標籤的文章。 顯示所有文章
顯示具有 機器學習 標籤的文章。 顯示所有文章

2019年5月21日 星期二

"程式教學"簡單入門python預測股價-使用stocker套件(predict_future)預測未來股價

沒有看過基礎概念的請先看這篇
http://hn28082251.blogspot.com/2019/04/python-stocker.html

沒有學過如何優化模型的請先看這篇
https://hn28082251.blogspot.com/2019/05/python-stocker-change-point-prior.html

本次資料以VTI(Vanguard Total Stock Market ETF)為例,這是我在美股的持股之一,資料集幫大家整理好了,請點選下方連結下載
https://drive.google.com/file/d/1gNPEnttLHBrbfUoiPU41ZMZmJsFy_Z8u/view?usp=sharing

現在我們有了一個優化後的模型,然後就可以使用predict_future()函數來對股票未來價格的進行預測。

關於這個函數的詳細說明如下
Makes a prediction for the specified number of days in the future using a prophet model trained on the assigned number of years of data. Printed output is the days on which the stock is expected to increase and the days when it is expected to decrease. A graph also shows these results with confidence intervals for the prediction. ​



然後我們輸入下方這個程式碼
vti.predict_future(days=10)

vti.predict_future(days=100)
分別預測10天後與100天後的股價
輸入之後按下執行
會跑出兩張圖


predict_future(days=10)

predict_future(days=100)
因為這個資料集收到最後的資料是貿易戰開打後,VTI代表的是全美市場,所以模型訓練出來的趨勢,是往下走的,然後隨著時間逐漸增加,不確定性會進一步增加。


現在你已經學會用Stocker預測股價了,事實上,如果我們想使用這個模型策略進行交易(我基本上是不建議啦),最好每天都更新資料,然後訓練新的模型,然後預測三天內的價格就好,這套系統的用法有點類似讓電腦去看懂趨勢,並且做預測,總結來說,我覺得這個模型的意義,在於讓大家能夠開心的玩轉python程式,而非拿來賺錢。

這系列文終於寫完了,雖然我們可能沒有辦法用Stocker賺大錢,但是我覺得重點在於coding的過程而不是有沒有賺錢的結果!就算最終失敗,也好過從不嘗試!

You can't connect the dots looking forward; you can only connect them looking backwards.--Steve Jobs

"你無法預先把點點滴滴串連起來;只有在未來回顧時,你才會明白那些點點滴滴是如何串在一起的"--賈伯斯

就像在國中時,我第一次接觸到程式,第一次用c++寫出了一台計算機的時候,我像在沙灘上撿到貝殼的孩子那樣的開心了一整天,我也從來沒想過,過去的那些嘗試與失敗,會讓現在的我走到這麼遠。

我也還在學習的路上,幸運的是身邊有許多大神不吝指導我,距離成功目標的路還很長,但只要開始走就不會遠,祝大家在coding and debug的路上不孤單~


本文章並沒有推薦任何投資標的,單純是個人的一些觀察與見解,為作者自行查看相關資料後整理而成,資料之正確性以各官方公告為主,任何人觀看本文之後,而有投資該股票基金或ETF之行為,自行對所有後果負責。 

歡迎分享轉載文章,願每一個人都能夠衣食無虞。 

我將思想傳授他人,他人之所得,亦無損於我之所有;猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。湯瑪斯‧傑弗遜(Thomas Jefferson)


2019年5月20日 星期一

"程式教學"簡單入門python預測股價-使用stocker套件(Changepoint Prior)模型優化

沒有看過基礎概念的請先看這篇
http://hn28082251.blogspot.com/2019/04/python-stocker.html


本次要教的是如何使用Changepoint Prior,來進行模型調整
官方說明如後
Changepoints represent where a time series goes from increasing to decreasing or from increasing slowly to increasingly rapidly (or vice versa). They occur at the places with the greatest change in the rate of the time series. The changepoint prior scale represents the amount of emphasis given to the changepoints in the model. This is used to control overfitting vs. underfitting (also known as the bias vs. variance tradeoff).

簡單的來說就是控制overfitting(過擬和) 跟 underfitting(欠擬和)

overfitting(過擬和)是指,使用過多參數,以致太適應資料,太適應資料可能會在未來預測的時候失準
underfitting(欠擬和)是使用太少參數,以致於不適應資料


本次資料以VTI(Vanguard Total Stock Market ETF)為例,這是我在美股的持股之一,資料集幫大家整理好了,請點選下方連結下載
https://drive.google.com/file/d/1gNPEnttLHBrbfUoiPU41ZMZmJsFy_Z8u/view?usp=sharing


在基礎教學中,我們已經學會如何快速建模,不過我們要來評估模型的預測效果如何,就用下方的程式碼來用過去資料來看看三個月前開始預測效果如何

vti.evaluate_prediction(start_date='2019-02-04', end_date='2019-05-14')



紅線之前代表訓練集的數據,紅線後代表開始預測,可以看得出來,並不是很理想!!!
但不要因此放棄,因為一開始全部都使用默認的參數,所以我們要開始去調整我們的模型,


趨勢變化過度擬合(靈活性太大)或不足(靈活性不夠),我們可以使用輸入參數調整稀疏之前的強度changepoint_prior_scale。默認情況下,此參數預設為0.05。增加它將使趨勢更加靈活

我們輸入下方這行程式碼並且執行
vti.changepoint_prior_analysis(changepoint_priors=[0.001, 0.05, 0.1, 0.2]) 

可以看到在不同的changepoint_priors下,擬合的狀況也不太相同

接下來我們在更詳細的比較不同的changepoint_priors下,一些其他的參考值


vti.changepoint_prior_validation(start_date='2018-01-04', end_date='2019-01-03', changepoint_priors=[0.001, 0.05, 0.1,0.15, 0.2, 0.25,0.4, 0.5, 0.6])



基於不同changepoint_priors下,訓練和測試準確性曲線和不確定性曲線

大致上可以看得出來,在changepoint_priors=0.25的時候效果較好

於是我們就把changepoint_prior_scale設成0.25吧!請加入下方的程式碼並執行
vti.changepoint_prior_scale = 0.25

然後再去看我們的模型
一樣用下方的程式碼
vti.evaluate_prediction(start_date='2019-02-04', end_date='2019-05-14')

可以看得出來預測效果有比較好一些了,這顯示了模型優化​​的重要性。使用默認值可以提初步預測,但是我們需要調整模型的設定,來讓模型效果更好。

下一篇來談談用優化後的模型來進行預測



本文章並沒有推薦任何投資標的,單純是個人的一些觀察與見解,為作者自行查看相關資料後整理而成,資料之正確性以各官方公告為主,任何人觀看本文之後,而有投資該股票基金或ETF之行為,自行對所有後果負責。 


歡迎分享轉載文章,願每一個人都能夠衣食無虞。 

我將思想傳授他人,他人之所得,亦無損於我之所有;猶如一人以我的燭火點燭,光亮與他同在,我卻不因此身處黑暗。湯瑪斯‧傑弗遜(Thomas Jefferson)







2019年4月16日 星期二

"程式教學"keras 或tensorflow 調用GPU運算出現錯誤訊息:Blas GEMM launch failed解決方法

最近在搞深度學習的模型
好不容易把GPU版本的keras 跟tensorflow 都裝好了
要計算的時候卻發現無法使用
出現以下的錯誤訊息
Blas GEMM launch failed

經過查詢才知道,GPU版的tensorflow或者keras在模型訓練時遇到Blas GEMM launch failed錯誤,(keras 一般將tensorflow作為backend,如果安裝了GPU版本的tensorflow,那麼在使用keras時會優先使用GPU)

這是調用GPU時,記憶體分配遇到了問題,解決方式是在模型訓練之前為tensorflow或者keras分配記憶體空間

而keras就在引入keras時進行參數設置:
程式碼如下

import tensorflow as tf
from keras.backend.tensorflow_backend import set_session
config = tf.ConfigProto()
config.gpu_options.allocator_type = 'BFC' #A "Best-fit with coalescing" algorithm, simplified from a version of dlmalloc.
config.gpu_options.per_process_gpu_memory_fraction = 0.8
config.gpu_options.allow_growth =True

set_session(tf.Session(config=config)) 

======================================================================
config.gpu_options.per_process_gpu_memory_fraction = 0.8
#設定每個GPU要拿出多少容量給程式使用,0.8代表80%
allow_growth option,程式開始執行時分配少量的GPU容量,而後按需求慢慢的增加



如果使用jupyter notebook,做完上述設置後可能出現GPU sync failed,重啟程式就沒問題了。

2018年7月2日 星期一

機器學習演算法—類神經網路(Artificial Neural Network)初探



隨著近期機器學習跟深度學習快速爆紅,有一個名詞-類神經網路,討論的程度也越來越火熱,但其實類神經網路(Artificial Neural Network),並不是一個新出的算法,早在上個世紀中時就已經被發展出來了,只是當時的硬體,尚不足以支撐太多層的神經網路,只能夠訓練學習一些簡單的邏輯函數,所以學術界對於類神經網路的熱情就漸漸消退了。

後來隨著硬體逐漸的發展,直到2012年波茲曼機的發明人Hinton發明了對比分歧法(Contrast Divergence),在分類、特徵抽取等方面頗有斬獲,還可以和多層感知器疊合,創造出了深度神經網路,而後來深度神經網路又加入了Convolutional(中文譯作卷積)運算,成為了卷積神經網路,在影像辨識上非常有效,接著開始推展到人工智慧的各個領域,也就跟上了這一波機器學習與深度學習的熱潮(之後再來開一篇講人工智慧的興衰到再次崛起)。

我知道上面說了一堆專有名詞大家已經頭昏眼花了,接下來簡單的說説類神經網路吧



上圖是一個神經,有樹突(負責輸入資料),有突觸(負責輸出資料),而類神經網路,就是用電腦來模仿生物神經網路的結構和功能的運算模型,建立大量相連的人工神經來模仿生物的神經網路,並且經過不斷學習的過程, 讓機器能夠像人類一樣擁有推導的能力。


類神經網路  from wiki
人工神經元是簡單的模擬生物神經元(如上圖),有隱藏單元(Hidden units)會與外部層進行通訊,而輸入和輸出單元(input and outpot units),只會與隱藏層進行通訊,每一個節點被稱作人工神經元,當他接收的信號量達到處門檻,他就會被觸發,然後發送出信號,藉由傳輸管道將信號發送至其他與之相連的單元,而連接點模擬生物神經的突觸,並具有發射信號強度權重的基本功能,權重用相乘方式計算,而權重本身由連結決定。
簡單介紹各層
輸入層(Input layer):透過許多神經元(Neuron)接受大量資訊。
輸出層(Output layer):資訊在神經元鏈接中傳輸、分析,形成預測結果。
隱藏層(Hidden layer):模擬複雜的非線性關係,好比人類的神經突觸連結越多,就會越聰明。但是過多的話會有過度學習的狀況,所以也不是越多越好。


類神經網路有以下幾個重點
1.每個神經元都與下一層所有神經元連接
2.屬於同一層的神經元之間沒有任何連接
3.有幾層以及每一層有幾個神經元由待解決的問題決定

接下來順帶簡單介紹一下機器學習的學習模式
監督式學習(Supervised learning):在訓練的過程中告訴機器答案、也就是「有標籤Label」的資料,比如給機器各看了 1000 張貓和豿的照片後、詢問機器新的一張照片中是貓還是豿。
非監督式學習(Unsupervised learning):訓練資料沒有標準答案、不需要事先輸入標籤,所以機器在學習的過程中並不知道其分類結果是否正確。訓練時僅須對機器提供輸入範例,機器會自動從這些範例中找出潛在的規則。
增強學習(Reinforcement learning):或稱作強化式學習,透過觀察環境而行動,並會隨時根據新進資料修正、以獲得最大成果,特徵是訓練必須要有正負回報(positive/negative reward)。
另外的半監督式學習(Semi supervised learning),可視為監督式學習與非監督式學習的混合版,資料中少部分有標記,大部分沒有標記。

以上希望可以幫助大家快速了解類神經網路以及機器學習的模式,如果有寫得不夠詳細的部分,也歡迎留言討論。





2018年7月1日 星期日

機器學習演算法—隨機森林(Random Forest)懶人包

會發這篇文章,主要是因爲前陣子針對研究案期中報告時,整個會場中只有我是寫程式出身的,感受到如果你有再好的技術,如果沒有辦法讓決策者理解,那如何能讓這個計畫推展下去呢?不能去埋怨長官們不懂,他們過去又沒有學過,怎麼可能會懂呢?當然,那種食古不化又不願意聽取專業意見的就另當別論了!

簡單介紹隨機森林(Random Forest)顧名思義,是用隨機的方式建立一個森林。

隨機森林的用途,主要是處理分類與回歸問題,並且在沒有提高運算量的情況下提高了精確度。
優點如下
1.有效的處理缺失值,並且填補缺失值,即使有大量數據缺失仍然可以維持高精確度
2.有效的處理少量資料。
3.對於數據挖掘、檢測離群點和數據可視化非常有用。

缺點
1.在某些雜訊較大的分類和回歸問題上會過擬合(overfitting)

簡單的說,隨機森林可以視為決策樹(Decision Tree)的延伸

什麼是決策樹呢?我們可以想想我們的人生,每做一個決策,就會出現不同的結果,種種不同的決策下,長成了現在的我們,這個分叉出去的人生,就像一棵樹倒過來一樣,用下面這個圖比較明瞭。

決策樹-取自維基百科
而隨機森林呢?可以想像是用隨機的方式建立一個森林,森林裡面有很多的決策樹,而每一棵決策樹之間是沒有關聯,最後再用這些樹去投票,來決定結果。


以下用幾張圖來讓大家簡單明瞭



一般很多的決策樹算法都一個重要的步驟 – 剪枝,但是隨機森林不會。(剪枝的意義是:防止決策樹生成過於龐大的子葉,避免實驗預測結果過擬合,在實際生產中效果很差)

隨機森林裡面的每棵樹的產生的過程中,都已經考慮了避免共線性,避免過擬合,剩下的每棵樹需要做的就是盡可能的在自己所對應的數據(特徵)集情況下盡可能的做到最好的預測結果。



用隨機森林對一個新的對象進行分類判別時,隨機森林中的每一棵樹都會給出自己的分類選擇,並由此進行「投票」,森林整體的輸出結果將會是票數最多的分類選項;而在回歸問題中,隨機森林的輸出將會是所有決策樹輸出的平均值。


以上,希望可以幫助大家快速了解隨機森林及用途,如果有寫得不夠詳細的部分,也歡迎留言討論,最後~希望可以讓長官深入淺出快速理解並支持(?


2018年6月29日 星期五

《AlphaGo-世紀對決》觀後感--至此,人工智慧邁出嶄新的一步


這部片前陣子就看了,現在終於有點時間來寫點東西

應該還有些人記得2016年初那場人機大戰,最後的結果是alphaGO以4:1橫掃人類棋王李世石,人工智慧也再度被炒熱了,一瞬間最難的圍棋也被人工智慧攻克

先來說說圍棋,對弈雙方在棋盤網格的交叉點上交替放置黑色和白色的棋子。落子完畢後,棋子不能移動。對弈過程中圍地吃子,以所圍「地」的大小決定勝負,圍棋被認為是目前世界上最複雜的棋盤遊戲之一。下法千變萬化,因為每顆棋子能選擇的路徑很多,每個下一步有將近兩百種的選擇,即使運用全世界的電腦,運行一百萬年,也難以窮盡它所有的變化方式,所以最簡單的窮舉法(暴力演算法),並無用武之地。

接下來為什麼人工智慧要進場了呢?因為過去算完所有步法後找最佳路徑的窮舉法沒辦法在圍棋上使用,於是Deepmind針對這部份,設計了三個區塊的網路,第一個區塊是使用走棋網路Policy Network,用數以萬計的棋譜去訓練他,讓他習得棋手的招式,第二部分是估值網路Value Network,用來衡量棋局情勢,來判斷棋局目前的獲勝機率,第三個部分是Tree Search,用來分析棋局的各種變化情形,在此是使用蒙地卡羅樹搜尋Monte Carlo tree search。alphaGO的原則是把勝率提升到最大,只要贏就好,不在乎贏多少,搜尋樹概念如下圖。


影片的故事從人工智慧打磚塊遊戲開始,說明機器學習如何進步,與進步是多麼神速,接下來是歐洲圍棋冠軍樊麾與alphaGO對弈,一開始樊麾認為自己可以輕鬆取勝,畢竟在過去還沒有圍棋程式能夠戰勝職業棋手,因為圍棋真的是太複雜了,誰知道卻被5:0橫掃,而在此時此刻,AI的發展正式突破了一個臨界點,在跟alphaGO對弈的過程中,人工智慧就像一面鏡子,透過那面鏡子,棋手看到一個不認識的自己,還有深不可測的實力與棋局,進而開始懷疑自己,在影片後段,李世石在面對alphaGO的第37手時,同樣陷入了困境,各地的評論家也完全看不懂,而事後卻證明,alphaGO看到的遠超乎我們想像。
第二場37move
影片中後段,人類棋王李世石對上AlphaGO,從一開始認為自己能夠輕易取勝,到連敗三場,除了李世石陷入極大的壓力外,觀戰的人類們也同時意識到,面對人工智慧毫不留情的碾壓,在深不可測的AlphaGO面前,人類三千年以來累積的知識與智慧,是那麼的渺小,同時也開始懷疑,我們是不是一直以來都下錯了?所幸後來第四局的時候,李世石出其不意的第78手,讓AlphaGO開始錯亂,最後輸掉了比賽,這時全場歡聲雷動,人類的尊嚴在此重新扳回一成,這一段我看了很感動,當時看比賽直播的時候也有這種感覺,雖然看到韓國人贏好像不是那麼習慣開心!?人類的群體意識在共同抵禦群體時顯示出的共同情感,也許就是讓我感動的原因吧。但是第五場最後還是讓AlphaGO獲勝,也許李世石贏的這一場,會是人類面對AlphaGO唯一贏的一場吧。

除了風光比賽的背後,AlphaGO的團隊也令人印象深刻,在世紀大賽的前三天,大家發現了一個重大的缺陷,卻找不到解決的方法,共同傷腦筋的畫面,以及比賽開始時,李世石下了第一步之後,AlphaGO思考了幾分鐘,那一瞬間,竟是那麼的漫長,可想見當時的團隊開發人員,壓力有多大,如果這時候跳出個系統錯誤之類的,或是畫面藍了,那會有多尷尬!人工智慧可能就瞬間變成笑柄了,所幸,AlphaGO下了第一步,棋局正式展開!

最後想說,一群絕頂聰明又具有共同熱情的人,聚在一起,無比專注、無比努力,只想著要攻克一個問題,問題看似很簡單,但是解決的路途卻又遙遠的看似看不到終點,這個過程,非常令人感動。同時我也非常羨慕,羨慕他們能夠聚在一起,長時間熱情的、專注同一件事,共同努力攻克目標。

看完這部片的時候,想到自己手上的專案,也是在用類似的方式,在朝預測自殺的問題邁進,自殺這件事情存在已久,累計的文獻以及資料堆積如山,但至今卻沒有一個非常有效的方式能夠預測,這就是我想要攻克的目標,雖說目前感覺仍似看不到彼岸,但隨著程式碼持續的改進,與訓練模型,也許終點將不再遙遠。





將探吉帶去日本系列-1(赫曼陸龜Testudo hermanni)

 因為接下來要去日本唸書 所以也要把探吉帶去日本 赫曼陸龜(學名:Testudo hermanni) 目前把北部能查的到的代辦寵物移民的問了一圈 得到的回覆是都沒有代辦陸龜 所以得開始研究自己辦理了 (或者有大大知道台灣誰有代辦陸龜出國的可以私訊我,感恩) 孟恭帶邱口去歐洲那間我...