作者:chen_h
微信號 & QQ:862251340
微信公眾號:coderpai
(一)機器學習中的集成學習入門
(二)bagging 方法
(三)使用Python進行交易的隨機森林算法
在這篇文章中,我們將討論什么是隨機森林,他們如何工作,他們如何幫助克服決策樹的局限性。
隨著機器學習及其技術在當前環境中的蓬勃發展,越來越多的算法在各種領域中找到應用。 機器學習各個算法的工作彼此不同,其中一個算法對于某個問題可能比另一個算法更好。 機器學習算法不斷更新和升級,以擴大其應用范圍并最大限度地減少其缺點。
隨機森林算法就是這樣一種算法,旨在克服決策樹的局限性。在這篇博客中,我們將介紹它。在直接介紹隨機森林之前,讓我們首先簡要了解決策樹及其工作原理。
什么是決策樹?
正如其名稱所示,決策樹具有分層或者樹狀結構,其分支充當節點。我們可以通過遍歷這些節點來做出某個決策,這些節點通過數據特征進行參數選擇。
但是,決策樹存在過度擬合的問題。 過度擬合通常在樹中添加越來越多的節點來增加樹內的特異性以達到某個結論,從而增加樹的深度并使其更復雜。
此外,在本博客中,我們將了解 Random Forest 如何幫助克服決策樹的這一缺點。
什么是隨機森林?
隨機森林是一種使用集成方法的監督分類機器學習算法。 簡而言之,隨機森林由眾多決策樹組成,有助于解決決策樹過度擬合的問題。 通過從給定數據集中選擇隨機特征來隨機構造這些決策樹。
隨機森林根據從決策樹收到的最大投票數得出決策或預測。 通過眾多決策樹達到最大次數的結果被隨機森林視為最終結果。
隨機森林的工作原理
隨機森林基于集成學習技術,簡單地表示一個組合或集合,在這種情況下,它是決策樹的集合,一起稱為隨機森林。集合模型的準確性優于單個模型的準確性,因為它匯總了單個模型的結果并提供了最終結果。
那么,如何從數據集中選擇特征以構建隨機森林的決策樹呢?
我們使用稱為 bagging 的方法隨機選擇特征。根據數據集中可用的特征集,通過選擇具有替換的隨機特征來創建許多訓練子集。這意味著可以在不同的訓練子集中同時重復一個特征。
例如,如果數據集包含20個特征,并且要選擇5個特征的子集來構建不同的決策樹,則將隨機選擇這5個特征,并且任何特征都可以是多個子集的一部分。這確保了隨機性,使樹之間的相關性更小,從而克服了過度擬合的問題。
選擇特征后,將根據最佳分割構建樹。每棵樹都給出一個輸出,該輸出被認為是從該樹到給定輸出的“投票”。輸出
接收最大’投票’的隨機森林選擇最終輸出/結果,或者在連續變量的情況下,所有輸出的平均值被視為最終輸出。
例如,在上圖中,我們可以觀察到每個決策樹已經投票或者預測了特定的類別。隨機森林選擇的最終輸出或類別將是N類,因為它具有多數投票或者是四個決策樹中的兩個預測輸出。
隨機森林的 Python 代碼
在此代碼中,我們將創建一個隨機森林分類器并對其進行訓練,并且給出每日回報。
導入庫
import
quantrautil
as
q
import
numpy
as
np
from
sklearn
.
ensemble
import
RandomForestClassifier
上面導入的庫將按照如下方式使用:
- quantrautil:這將用于從雅虎 finance 中獲取 BAC 股票的價格數據;
- numpy:對BAC股票價格執行數據操作,以計算輸入特征和輸出結果。如果你想要了解更多關于 numpy 的信息,可以查看 numpy 官網;
- Sklearn:sklearn 是很多工具和機器學習模型的集合,你可以很自由使用;
- RandomForestClassifier:將用于創建 Random Forest 分類器模型;
獲取數據
下一步是從 quantrautil 導入 BAC 庫存的價格數據。quantrautil 的 get_data 函數用于獲取從 2000 年1月1日到2019年1月31日的 BAC 數據。如下所示:
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
創建輸入和輸出數據
在這一步中,我將創建輸入和輸出變量。
輸入變量:我使用 (open-close)/open ,(High-Low)/Low,過去5議案的標準差(std_5),過去五天的平均值(ret_5)。
輸出變量:如果明天的收盤價大于今天的收盤價,則輸出變量設置為 1 ,否則設置為 -1。1 表示購買股票,-1表示賣出股票。
輸入和輸出數據的特征完全是隨機的,如果你有興趣可以查看 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
)
訓練集合和測試集合的劃分
我們現在將數據集拆分為 75% 的訓練數據集,25% 的測試數據集。
# 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
,
)
訓練機器學習模型
全部數據設置完畢!讓我們訓練一個決策樹分類器模型。樹中的 RandomForestClassifier 函數存儲在變量 clf 中,然后使用 X_train 和 y_train 數據集作為參數調用 fit 方法,以便分類器模型可以學習輸入和輸出之間的關系。
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
策略回報
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
(
)
策略回報
(
data
.
strategy_returns
[
split
:
]
+
1
)
.
cumprod
(
)
.
plot
(
)
plt
.
ylabel
(
'Strategy returns (%)'
)
plt
.
show
(
)
圖中輸出是根據隨機森林分類器的代碼顯示策略回報和每日回報。
優點
- 避免過度擬合
- 可用于分類和回歸
- 可以處理缺失值
缺點
- 大量的樹結構會占用大量的空間和利用大量時間
在這篇博客中,我們學習了利用隨機森林來進行簡單的策略編寫。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
