作者:chen_h
微信號(hào) & QQ:862251340
微信公眾號(hào):coderpai
(一)機(jī)器學(xué)習(xí)中的集成學(xué)習(xí)入門(mén)
(二)bagging 方法
(三)使用Python進(jìn)行交易的隨機(jī)森林算法
在這篇文章中,我們將討論什么是隨機(jī)森林,他們?nèi)绾喂ぷ鳎麄內(nèi)绾螏椭朔Q策樹(shù)的局限性。
隨著機(jī)器學(xué)習(xí)及其技術(shù)在當(dāng)前環(huán)境中的蓬勃發(fā)展,越來(lái)越多的算法在各種領(lǐng)域中找到應(yīng)用。 機(jī)器學(xué)習(xí)各個(gè)算法的工作彼此不同,其中一個(gè)算法對(duì)于某個(gè)問(wèn)題可能比另一個(gè)算法更好。 機(jī)器學(xué)習(xí)算法不斷更新和升級(jí),以擴(kuò)大其應(yīng)用范圍并最大限度地減少其缺點(diǎn)。
隨機(jī)森林算法就是這樣一種算法,旨在克服決策樹(shù)的局限性。在這篇博客中,我們將介紹它。在直接介紹隨機(jī)森林之前,讓我們首先簡(jiǎn)要了解決策樹(shù)及其工作原理。
什么是決策樹(shù)?
正如其名稱(chēng)所示,決策樹(shù)具有分層或者樹(shù)狀結(jié)構(gòu),其分支充當(dāng)節(jié)點(diǎn)。我們可以通過(guò)遍歷這些節(jié)點(diǎn)來(lái)做出某個(gè)決策,這些節(jié)點(diǎn)通過(guò)數(shù)據(jù)特征進(jìn)行參數(shù)選擇。
但是,決策樹(shù)存在過(guò)度擬合的問(wèn)題。 過(guò)度擬合通常在樹(shù)中添加越來(lái)越多的節(jié)點(diǎn)來(lái)增加樹(shù)內(nèi)的特異性以達(dá)到某個(gè)結(jié)論,從而增加樹(shù)的深度并使其更復(fù)雜。
此外,在本博客中,我們將了解 Random Forest 如何幫助克服決策樹(shù)的這一缺點(diǎn)。
什么是隨機(jī)森林?
隨機(jī)森林是一種使用集成方法的監(jiān)督分類(lèi)機(jī)器學(xué)習(xí)算法。 簡(jiǎn)而言之,隨機(jī)森林由眾多決策樹(shù)組成,有助于解決決策樹(shù)過(guò)度擬合的問(wèn)題。 通過(guò)從給定數(shù)據(jù)集中選擇隨機(jī)特征來(lái)隨機(jī)構(gòu)造這些決策樹(shù)。
隨機(jī)森林根據(jù)從決策樹(shù)收到的最大投票數(shù)得出決策或預(yù)測(cè)。 通過(guò)眾多決策樹(shù)達(dá)到最大次數(shù)的結(jié)果被隨機(jī)森林視為最終結(jié)果。
隨機(jī)森林的工作原理
隨機(jī)森林基于集成學(xué)習(xí)技術(shù),簡(jiǎn)單地表示一個(gè)組合或集合,在這種情況下,它是決策樹(shù)的集合,一起稱(chēng)為隨機(jī)森林。集合模型的準(zhǔn)確性優(yōu)于單個(gè)模型的準(zhǔn)確性,因?yàn)樗鼌R總了單個(gè)模型的結(jié)果并提供了最終結(jié)果。
那么,如何從數(shù)據(jù)集中選擇特征以構(gòu)建隨機(jī)森林的決策樹(shù)呢?
我們使用稱(chēng)為 bagging 的方法隨機(jī)選擇特征。根據(jù)數(shù)據(jù)集中可用的特征集,通過(guò)選擇具有替換的隨機(jī)特征來(lái)創(chuàng)建許多訓(xùn)練子集。這意味著可以在不同的訓(xùn)練子集中同時(shí)重復(fù)一個(gè)特征。
例如,如果數(shù)據(jù)集包含20個(gè)特征,并且要選擇5個(gè)特征的子集來(lái)構(gòu)建不同的決策樹(shù),則將隨機(jī)選擇這5個(gè)特征,并且任何特征都可以是多個(gè)子集的一部分。這確保了隨機(jī)性,使樹(shù)之間的相關(guān)性更小,從而克服了過(guò)度擬合的問(wèn)題。
選擇特征后,將根據(jù)最佳分割構(gòu)建樹(shù)。每棵樹(shù)都給出一個(gè)輸出,該輸出被認(rèn)為是從該樹(shù)到給定輸出的“投票”。輸出
接收最大’投票’的隨機(jī)森林選擇最終輸出/結(jié)果,或者在連續(xù)變量的情況下,所有輸出的平均值被視為最終輸出。
例如,在上圖中,我們可以觀察到每個(gè)決策樹(shù)已經(jīng)投票或者預(yù)測(cè)了特定的類(lèi)別。隨機(jī)森林選擇的最終輸出或類(lèi)別將是N類(lèi),因?yàn)樗哂卸鄶?shù)投票或者是四個(gè)決策樹(shù)中的兩個(gè)預(yù)測(cè)輸出。
隨機(jī)森林的 Python 代碼
在此代碼中,我們將創(chuàng)建一個(gè)隨機(jī)森林分類(lèi)器并對(duì)其進(jìn)行訓(xùn)練,并且給出每日回報(bào)。
導(dǎo)入庫(kù)
import
quantrautil
as
q
import
numpy
as
np
from
sklearn
.
ensemble
import
RandomForestClassifier
上面導(dǎo)入的庫(kù)將按照如下方式使用:
- quantrautil:這將用于從雅虎 finance 中獲取 BAC 股票的價(jià)格數(shù)據(jù);
- numpy:對(duì)BAC股票價(jià)格執(zhí)行數(shù)據(jù)操作,以計(jì)算輸入特征和輸出結(jié)果。如果你想要了解更多關(guān)于 numpy 的信息,可以查看 numpy 官網(wǎng);
- Sklearn:sklearn 是很多工具和機(jī)器學(xué)習(xí)模型的集合,你可以很自由使用;
- RandomForestClassifier:將用于創(chuàng)建 Random Forest 分類(lèi)器模型;
獲取數(shù)據(jù)
下一步是從 quantrautil 導(dǎo)入 BAC 庫(kù)存的價(jià)格數(shù)據(jù)。quantrautil 的 get_data 函數(shù)用于獲取從 2000 年1月1日到2019年1月31日的 BAC 數(shù)據(jù)。如下所示:
data
=
q
.
get_data
(
'BAC'
,
'2000-1-1'
,
'2019-2-1'
)
print
(
data
.
tail
(
)
)
[*********************100%***********************] 1 of 1 downloaded
Open High Low Close Adj Close Volume Source
Date
2019-01-25 29.28 29.72 29.14 29.58 29.27 72182100 Yahoo
2019-01-28 29.32 29.67 29.29 29.63 29.32 59963800 Yahoo
2019-01-29 29.54 29.70 29.34 29.39 29.08 51451900 Yahoo
2019-01-30 29.42 29.47 28.95 29.07 28.77 66475800 Yahoo
2019-01-31 28.75 28.84 27.98 28.47 28.17 100201200 Yahoo
創(chuàng)建輸入和輸出數(shù)據(jù)
在這一步中,我將創(chuàng)建輸入和輸出變量。
輸入變量:我使用 (open-close)/open ,(High-Low)/Low,過(guò)去5議案的標(biāo)準(zhǔn)差(std_5),過(guò)去五天的平均值(ret_5)。
輸出變量:如果明天的收盤(pán)價(jià)大于今天的收盤(pán)價(jià),則輸出變量設(shè)置為 1 ,否則設(shè)置為 -1。1 表示購(gòu)買(mǎi)股票,-1表示賣(mài)出股票。
輸入和輸出數(shù)據(jù)的特征完全是隨機(jī)的,如果你有興趣可以查看 wiki 。
# Features construction
data
[
'Open-Close'
]
=
(
data
.
Open
-
data
.
Close
)
/
data
.
Open
data
[
'High-Low'
]
=
(
data
.
High
-
data
.
Low
)
/
data
.
Low
data
[
'percent_change'
]
=
data
[
'Adj Close'
]
.
pct_change
(
)
data
[
'std_5'
]
=
data
[
'percent_change'
]
.
rolling
(
5
)
.
std
(
)
data
[
'ret_5'
]
=
data
[
'percent_change'
]
.
rolling
(
5
)
.
mean
(
)
data
.
dropna
(
inplace
=
True
)
# X is the input variable
X
=
data
[
[
'Open-Close'
,
'High-Low'
,
'std_5'
,
'ret_5'
]
]
# Y is the target or output variable
y
=
np
.
where
(
data
[
'Adj Close'
]
.
shift
(
-
1
)
>
data
[
'Adj Close'
]
,
1
,
-
1
)
訓(xùn)練集合和測(cè)試集合的劃分
我們現(xiàn)在將數(shù)據(jù)集拆分為 75% 的訓(xùn)練數(shù)據(jù)集,25% 的測(cè)試數(shù)據(jù)集。
# Total dataset length
dataset_length
=
data
.
shape
[
0
]
# Training dataset length
split
=
int
(
dataset_length
*
0.75
)
split
3597
# Splitiing the X and y into train and test datasets
X_train
,
X_test
=
X
[
:
split
]
,
X
[
split
:
]
y_train
,
y_test
=
y
[
:
split
]
,
y
[
split
:
]
# Print the size of the train and test dataset
print
(
X_train
.
shape
,
X_test
.
shape
)
print
(
y_train
.
shape
,
y_test
.
shape
)
(
3597
,
4
)
(
1199
,
4
)
(
3597
,
)
(
1199
,
)
訓(xùn)練機(jī)器學(xué)習(xí)模型
全部數(shù)據(jù)設(shè)置完畢!讓我們訓(xùn)練一個(gè)決策樹(shù)分類(lèi)器模型。樹(shù)中的 RandomForestClassifier 函數(shù)存儲(chǔ)在變量 clf 中,然后使用 X_train 和 y_train 數(shù)據(jù)集作為參數(shù)調(diào)用 fit 方法,以便分類(lèi)器模型可以學(xué)習(xí)輸入和輸出之間的關(guān)系。
clf
=
RandomForestClassifier
(
random_state
=
5
)
# Create the model on train dataset
model
=
clf
.
fit
(
X_train
,
y_train
)
from
sklearn
.
metrics
import
accuracy_score
print
(
'Correct Prediction (%): '
,
accuracy_score
(
y_test
,
model
.
predict
(
X_test
)
,
normalize
=
True
)
*
100.0
)
Correct Prediction
(
%
)
:
50.29190992493745
# Run the code to view the classification report metrics
from
sklearn
.
metrics
import
classification_report
report
=
classification_report
(
y_test
,
model
.
predict
(
X_test
)
)
print
(
report
)
precision recall f1-score support
-1 0.50 0.61 0.55 594
1 0.51 0.40 0.45 605
avg / total 0.50 0.50 0.50 1199
策略回報(bào)
data
[
'strategy_returns'
]
=
data
.
percent_change
.
shift
(
-
1
)
*
model
.
predict
(
X
)
每日返回直方圖
%
matplotlib inline
import
matplotlib
.
pyplot
as
plt
data
.
strategy_returns
[
split
:
]
.
hist
(
)
plt
.
xlabel
(
'Strategy returns (%)'
)
plt
.
show
(
)
策略回報(bào)
(
data
.
strategy_returns
[
split
:
]
+
1
)
.
cumprod
(
)
.
plot
(
)
plt
.
ylabel
(
'Strategy returns (%)'
)
plt
.
show
(
)
圖中輸出是根據(jù)隨機(jī)森林分類(lèi)器的代碼顯示策略回報(bào)和每日回報(bào)。
優(yōu)點(diǎn)
- 避免過(guò)度擬合
- 可用于分類(lèi)和回歸
- 可以處理缺失值
缺點(diǎn)
- 大量的樹(shù)結(jié)構(gòu)會(huì)占用大量的空間和利用大量時(shí)間
在這篇博客中,我們學(xué)習(xí)了利用隨機(jī)森林來(lái)進(jìn)行簡(jiǎn)單的策略編寫(xiě)。
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元

