我們將要對(duì)我們的股票價(jià)格數(shù)據(jù)執(zhí)行回歸。目前的代碼:
import quandl
import pandas as pd
df = quandl.get("WIKI/GOOGL")
df = df[['Adj. Open', 'Adj. High', 'Adj. Low', 'Adj. Close', 'Adj. Volume']]
df['HL_PCT'] = (df['Adj. High'] - df['Adj. Low']) / df['Adj. Close'] * 100.0
df['PCT_change'] = (df['Adj. Close'] - df['Adj. Open']) / df['Adj. Open'] * 100.0
df = df[['Adj. Close', 'HL_PCT', 'PCT_change', 'Adj. Volume']]
print(df.head())
這里我們已經(jīng)獲取了數(shù)據(jù),判斷出有價(jià)值的數(shù)據(jù),并通過(guò)操作創(chuàng)建了一些。我們現(xiàn)在已經(jīng)準(zhǔn)備好使用回歸開(kāi)始機(jī)器學(xué)習(xí)的過(guò)程。首先,我們需要一些更多的導(dǎo)入。所有的導(dǎo)入是:
import quandl, math
import numpy as np
import pandas as pd
from sklearn import preprocessing, cross_validation, svm
from sklearn.linear_model import LinearRegression
我們會(huì)使用numpy模塊來(lái)將數(shù)據(jù)轉(zhuǎn)換為 NumPy 數(shù)組,它是 Sklearn 的預(yù)期。我們?cè)谟玫?code>preprocessing和cross_validation時(shí),會(huì)深入談?wù)撍麄儯穷A(yù)處理是用于在機(jī)器學(xué)習(xí)之前,對(duì)數(shù)據(jù)清洗和縮放的模塊。交叉驗(yàn)證在測(cè)試階段使用。最后,我們也從 Sklearn 導(dǎo)入了LinearRegression算法,以及svm。它們用作我們的機(jī)器學(xué)習(xí)算法來(lái)展示結(jié)果。
這里,我們已經(jīng)獲取了我們認(rèn)為有用的數(shù)據(jù)。真實(shí)的機(jī)器學(xué)習(xí)如何工作呢?使用監(jiān)督式學(xué)習(xí),你需要特征和標(biāo)簽。特征就是描述性屬性,標(biāo)簽就是你嘗試預(yù)測(cè)的結(jié)果。另一個(gè)常見(jiàn)的回歸示例就是嘗試為某個(gè)人預(yù)測(cè)保險(xiǎn)的保費(fèi)。保險(xiǎn)公司會(huì)收集你的年齡、駕駛違規(guī)行為、公共犯罪記錄,以及你的信用評(píng)分。公司會(huì)使用老客戶,獲取數(shù)據(jù),并得出應(yīng)該給客戶的“理想保費(fèi)”,或者如果他們覺(jué)得有利可圖的話,他們會(huì)使用實(shí)際使用的客戶。
所以,對(duì)于訓(xùn)練機(jī)器學(xué)習(xí)分類器來(lái)說(shuō),特征是客戶屬性,標(biāo)簽是和這些屬性相關(guān)的保費(fèi)。
我們這里,什么是特征和標(biāo)簽?zāi)??我們嘗試預(yù)測(cè)價(jià)格,所以價(jià)格就是標(biāo)簽?如果這樣,什么是特征呢?對(duì)于預(yù)測(cè)我們的價(jià)格來(lái)說(shuō),我們的標(biāo)簽,就是我們打算預(yù)測(cè)的東西,實(shí)際上是未來(lái)價(jià)格。這樣,我們的特征實(shí)際上是:當(dāng)前價(jià)格、HL 百分比和百分比變化。標(biāo)簽價(jià)格是未來(lái)某個(gè)點(diǎn)的價(jià)格。讓我們繼續(xù)添加新的行:
forecast_col = 'Adj. Close'
df.fillna(value=-99999, inplace=True)
forecast_out = int(math.ceil(0.01 * len(df)))
這里,我們定義了預(yù)測(cè)列,之后我們將任何 NaN 數(shù)據(jù)填充為 -99999。對(duì)于如何處理缺失數(shù)據(jù),你有一些選擇,你不能僅僅將 NaN(不是數(shù)值)數(shù)據(jù)點(diǎn)傳給機(jī)器學(xué)習(xí)分類西,你需要處理它。一個(gè)主流選項(xiàng)就是將缺失值填充為 -99999。在許多機(jī)器學(xué)習(xí)分類器中,會(huì)將其是被為離群點(diǎn)。你也可以僅僅丟棄包含缺失值的所有特征或標(biāo)簽,但是這樣你可能會(huì)丟掉大量的數(shù)據(jù)。
真實(shí)世界中,許多數(shù)據(jù)集都很混亂。多數(shù)股價(jià)或成交量數(shù)據(jù)都很干凈,很少有缺失數(shù)據(jù),但是許多數(shù)據(jù)集會(huì)有大量缺失數(shù)據(jù)。我見(jiàn)過(guò)一些數(shù)據(jù)集,大量的行含有缺失數(shù)據(jù)。你并不一定想要失去所有不錯(cuò)的數(shù)據(jù),如果你的樣例數(shù)據(jù)有一些缺失,你可能會(huì)猜測(cè)真實(shí)世界的用例也有一些缺失。你需要訓(xùn)練、測(cè)試并依賴相同數(shù)據(jù),以及數(shù)據(jù)的特征。
最后,我們定義我們需要預(yù)測(cè)的東西。許多情況下,就像嘗試預(yù)測(cè)客戶的保費(fèi)的案例中,你僅僅需要一個(gè)數(shù)字,但是對(duì)于預(yù)測(cè)來(lái)說(shuō),你需要預(yù)測(cè)指定數(shù)量的數(shù)據(jù)點(diǎn)。我們假設(shè)我們打算預(yù)測(cè)數(shù)據(jù)集整個(gè)長(zhǎng)度的 1%。因此,如果我們的數(shù)據(jù)是 100 天的股票價(jià)格,我們需要能夠預(yù)測(cè)未來(lái)一天的價(jià)格。選擇你想要的那個(gè)。如果你只是嘗試預(yù)測(cè)明天的價(jià)格,你應(yīng)該選取一天之后的數(shù)據(jù),而且也只能一天之后的數(shù)據(jù)。如果你打算預(yù)測(cè) 10 天,我們可以為每一天生成一個(gè)預(yù)測(cè)。
我們這里,我們決定了,特征是一系列當(dāng)前值,標(biāo)簽是未來(lái)的價(jià)格,其中未來(lái)是數(shù)據(jù)集整個(gè)長(zhǎng)度的 1%。我們假設(shè)所有當(dāng)前列都是我們的特征,所以我們使用一個(gè)簡(jiǎn)單的 Pnadas 操作添加一個(gè)新的列:
df['label'] = df[forecast_col].shift(-forecast_out)
現(xiàn)在我們擁有了數(shù)據(jù),包含特征和標(biāo)簽。下面我們?cè)趯?shí)際運(yùn)行任何東西之前,我們需要做一些預(yù)處理和最終步驟,我們?cè)谙乱黄坛虝?huì)關(guān)注。