Python機(jī)器學(xué)習(xí)回歸部分的應(yīng)用與教程
歡迎閱讀 Python 機(jī)器學(xué)習(xí)系列教程的回歸部分。這里,你應(yīng)該已經(jīng)安裝了 Scikit-Learn。如果沒(méi)有,安裝它,以及 Pandas 和 Matplotlib。
pip install numpy
pip install scipy
pip install scikit-learn
pip install matplotlib
pip install pandas
除了這些教程范圍的導(dǎo)入之外,我們還要在這里使用 Quandl:
pip install quandl
首先,對(duì)于我們將其用于機(jī)器學(xué)習(xí)而言,什么是回歸呢?它的目標(biāo)是接受連續(xù)數(shù)據(jù),尋找最適合數(shù)據(jù)的方程,并能夠?qū)μ囟ㄖ颠M(jìn)行預(yù)測(cè)。使用簡(jiǎn)單的線性回歸,你可以僅僅通過(guò)創(chuàng)建最佳擬合直線,來(lái)實(shí)現(xiàn)它。
這里,我們可以使用這條直線的方程,來(lái)預(yù)測(cè)未來(lái)的價(jià)格,其中日期是 x 軸。
回歸的熱門用法是預(yù)測(cè)股票價(jià)格。由于我們會(huì)考慮價(jià)格隨時(shí)間的流動(dòng),并且使用連續(xù)的數(shù)據(jù)集,嘗試預(yù)測(cè)未來(lái)的下一個(gè)流動(dòng)價(jià)格,所以可以這樣做。
回歸是監(jiān)督的機(jī)器學(xué)習(xí)的一種,也就是說(shuō),科學(xué)家向其展示特征,之后向其展示正確答案來(lái)教會(huì)機(jī)器。一旦教會(huì)了機(jī)器,科學(xué)家就能夠使用一些不可見(jiàn)的數(shù)據(jù)來(lái)測(cè)試機(jī)器,其中科學(xué)家知道正確答案,但是機(jī)器不知道。機(jī)器的答案會(huì)與已知答案對(duì)比,并且度量機(jī)器的準(zhǔn)確率。如果準(zhǔn)確率足夠高,科學(xué)家就會(huì)考慮將其算法用于真實(shí)世界。
由于回歸廣泛用于股票價(jià)格,我們可以使用一個(gè)示例從這里開(kāi)始。最開(kāi)始,我們需要數(shù)據(jù)。有時(shí)候數(shù)據(jù)易于獲取,有時(shí)你需要出去并親自收集。我們這里,我們至少能夠以簡(jiǎn)單的股票價(jià)格和成交量信息開(kāi)始,它們來(lái)自 Quandl。我們會(huì)抓取 Google 的股票價(jià)格,它的代碼是GOOGL:
import pandas as pd
import quandl
df = quandl.get("WIKI/GOOGL")
print(df.head())
注意:寫(xiě)這篇文章的時(shí)候,Quandl 的模塊使用大寫(xiě) Q 引用,但現(xiàn)在是小寫(xiě) q,所以import quandl。
到這里,我們擁有:
Open High Low Close Volume Ex-Dividend
Date
2004-08-19 100.00 104.06 95.96 100.34 44659000 0
2004-08-20 101.01 109.08 100.50 108.31 22834300 0
2004-08-23 110.75 113.48 109.05 109.40 18256100 0
2004-08-24 111.24 111.60 103.57 104.87 15247300 0
2004-08-25 104.96 108.00 103.88 106.00 9188600 0
Split RaTIo Adj. Open Adj. High Adj. Low Adj. Close
Date
2004-08-19 1 50.000 52.03 47.980 50.170
2004-08-20 1 50.505 54.54 50.250 54.155
2004-08-23 1 55.375 56.74 54.525 54.700
2004-08-24 1 55.620 55.80 51.785 52.435
2004-08-25 1 52.480 54.00 51.940 53.000
Adj. Volume
Date
2004-08-19 44659000
2004-08-20 22834300
2004-08-23 18256100
2004-08-24 15247300
2004-08-25 9188600
這是個(gè)非常好的開(kāi)始,我們擁有了數(shù)據(jù),但是有點(diǎn)多了。
這里,我們有很多列,許多都是多余的,還有些不怎么變化。我們可以看到,常規(guī)和修正(Adj)的列是重復(fù)的。修正的列看起來(lái)更加理想。常規(guī)的列是當(dāng)天的價(jià)格,但是股票有個(gè)叫做分拆的東西,其中一股突然就變成了兩股,所以一股的價(jià)格要減半,但是公司的價(jià)值不變。修正的列為股票分拆而調(diào)整,這使得它們對(duì)于分析更加可靠。
所以,讓我們繼續(xù),削減原始的 DataFrame。
df = df[['Adj. Open', 'Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume']]
現(xiàn)在我們擁有了修正的列,以及成交量。有一些東西需要注意。許多人談?wù)摶蛘呗?tīng)說(shuō)機(jī)器學(xué)習(xí),就像無(wú)中生有的黑魔法。機(jī)器學(xué)習(xí)可以突出已有的數(shù)據(jù),但是數(shù)據(jù)需要先存在。你需要有意義的數(shù)據(jù)。所以你怎么知道是否有意義呢?我的最佳建議就是,僅僅簡(jiǎn)化你的大腦??紤]一下,歷史價(jià)格會(huì)決定未來(lái)價(jià)格嗎?有些人這么認(rèn)為,但是久而久之這被證實(shí)是錯(cuò)誤的。但是歷史規(guī)律呢?突出的時(shí)候會(huì)有意義(機(jī)器學(xué)習(xí)會(huì)有所幫助),但是還是太弱了。那么,價(jià)格變化和成交量隨時(shí)間的關(guān)系,再加上歷史規(guī)律呢?可能更好一點(diǎn)。所以,你已經(jīng)能夠看到,并不是數(shù)據(jù)越多越好,而是我們需要使用有用處的數(shù)據(jù)。同時(shí),原始數(shù)據(jù)應(yīng)該做一些轉(zhuǎn)換。
考慮每日波動(dòng),例如最高價(jià)減最低價(jià)的百分比差值如何?每日的百分比變化又如何呢?你覺(jué)得Open, High, Low, Close這種簡(jiǎn)單數(shù)據(jù),還是Close, Spread/VolaTIlity, %change daily更好?我覺(jué)得后者更好一點(diǎn)。前者都是非常相似的數(shù)據(jù)點(diǎn),后者基于前者的統(tǒng)一數(shù)據(jù)創(chuàng)建,但是帶有更加有價(jià)值的信息。