機器學習實戰(12)—— 隨機森林代碼實現

在上一篇中,我們講解了隨機森林算法的原理,這篇我們進行 python 代碼實戰。

首先看看 sklearn 中隨機森林實現的注意點:

在 sklearn 中,隨機森林的函數模型是:

RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini'max_depth=None, max_features='auto'max_leaf_nodes=None, min_samples_leaf=1, min_samples_split=2, min_weight_fraction_leaf=0.0, n_estimators=10, n_jobs=1, oob_score=False, random_state=None, verbose=0, warm_start=False)

總的來說,調參對隨機森林來說,不會發生很大的波動,相比神經網絡來說,隨機森林即使使用默認的參數,也可以達到良好的結果。

max_fea****tures:隨機森林允許單個決策樹使用特徵的最大數量。

(1)Auto/None :簡單地選取所有特徵,每顆樹都可以利用他們。這種情況下,每顆樹都沒有任何的限制。

(2)sqrt :此選項是每顆子樹可以利用總特徵數的平方根個。例如,如果變量(特徵)的總數是 100,所以每顆子樹只能取其中的 10 個

(3)log2 :max_features=log2(n_features).

(4)0.2:此選項允許每個隨機森林的子樹可以利用變量(特徵)數的 20%。如果想考察的特徵 x%的作用, 我們可以使用 “0.X” 的格式。

增加 max_features 一般能提高模型的性能,因爲在每個節點上,我們有更多的選擇可以考慮。然而,這未必完全是對的,因爲它降低了單個樹的多樣性,而這正是隨機森林獨特的優點。但是,可以肯定,你通過增加 max_features 會降低算法的速度。因此,你需要適當的平衡和選擇最佳 max_features。

n_estimators:子樹的數量

在利用最大投票數或平均值來預測之前,你想要建立子樹的數量。較多的子樹可以讓模型有更好的性能,但同時讓你的代碼變慢。你應該選擇儘可能高的值,只要你的處理器能夠承受的住,默認是 10,使你的預測更好更穩定,一般至少 100。

max_depth: 樹的最大深度

(default=None) 設置樹的最大深度,默認爲 None,這樣建樹時,會使每一個葉節點只有一個類別,或是達到 min_samples_split。

min_samples_split: 默認爲 2,含義:分割內部節點所需的最少樣本數量

min_samples_leaf: 葉子節點包含最少的樣本數,默認爲 1

**bootstrap=True:**是否有放回的採樣。  

min_impurity_decrease: 默認 0,一個節點將會被分裂,如果分裂之後,雜質度的減少效果高於這個值。

min_weight_fraction_leaf:default=0,能成爲葉子節點的條件是:該節點對應的實例數和總樣本數的比值,至少大於這個 min_weight_fraction_leaf 值

max_leaf_nodes:(默認 None)  最大葉子節點數,以最好的優先方式生成樹,最好的節點被定義爲雜質相對較少,即純度較高的葉子節點

min_impurity_split: 樹增長停止的閥值。一個節點將會分裂,如果他的雜質度比這個閥值;如果比這個值低,就會成爲一個葉子節點。

**class_weight=None:**各個 label 的權重。list or dicts, "balanced"

對於多分類問題,可以按照分類結果 y 的可能取值的順序給出一個 list 或者 dict 值,用來指明各類的權重."balanced" 模式,使用 y 值自動調整權重,該模式類別權重與輸入數據中的類別頻率成反比。

oob_score: 默認 False,是否使用袋外樣本來估計該模型大概的準確率

**criterion: **

”gini”or“entropy”(default=”gini”) 是計算屬性的 gini(基尼不純度) 還是 entropy(信息增益),來選擇最合適的節點。

**splitter: **

”best” or “random”(default=”best”), 隨機選擇屬性還是選擇不純度最大的屬性,建議用默認。

**n_jobs: **

這個參數告訴引擎有多少處理器是它可以使用。“-1”意味着沒有限制, 而 “1” 值意味着它只能使用一個處理器,具體寫數字 n 表示使用 n 個。並行 job 個數在集成算法中非常重要,尤其是 bagging。

**random_state: **

此參數讓結果容易復現。一個確定的隨機值將會產生相同的結果, 在參數和訓練數據不變的情況下。 

本次實戰使用泰坦尼克號數據。

首先導入相關模塊並且讀取數據:

# 導入pandas用於數據分析。
import pandas as pd
# 利用pandas的read_csv模塊直接從互聯網收集泰坦尼克號乘客數據。
titanic = pd.read_csv('http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic.txt')

觀察數據:

# 觀察一下前幾行數據,可以發現,數據種類各異,數值型、類別型,甚至還有缺失數據。
titanic.head()

各個字段名解釋:

Pclass => 乘客等級(1/2/3等艙位)
Survived => 是否存活
Name => 乘客姓名
Age => 年齡
Embarked => 登船港口
Home.dest => 住址,目的地
Room =>房間號
Ticket => 船票信息
Boat => 救生船
Sex => 性別

查看數據信息:

# 使用pandas,數據都轉入pandas獨有的dataframe格式(二維數據表格),直接使用info(),查看數據的統計特性。
titanic.info()

主要展示數據字段空值情況和數據字段類型:

選擇包含部分特徵的數據:

# 機器學習有一個不太被初學者重視,並且耗時,但是十分重要的一環,特徵的選擇,這個需要基於一些背景知識。
# 根據我們對這場事故的瞭解,sex, age, pclass這些都很有可能是決定倖免與否的關鍵因素。
X = titanic[['pclass''age''sex']]
y = titanic['survived']

# 對當前選擇的特徵進行探查。
X.info()

缺失值填補:

# 藉由上面的輸出,我們設計如下幾個數據處理的任務:
# 1) age這個數據列,只有633個,需要補完。
# 2) sex 與 pclass兩個數據列的值都是類別型的,需要轉化爲數值特徵,用0/1代替。

# 首先我們補充age裏的數據,使用平均數或者中位數都是對模型偏離造成最小影響的策略。

X['age'].fillna(X['age'].mean()inplace=True)#採用平均數填補
# 對補完的數據重新探查。
X.info()

此時已經沒有缺失值了:

劃分訓練集與測試集:

# 由此得知,age特徵得到了補完。

# 數據分割。
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state = 33)

特徵處理:

# 我們使用scikit-learn.feature_extraction中的特徵轉換器,詳見3.1.1.1特徵抽取。
from sklearn.feature_extraction import DictVectorizer
vec = DictVectorizer(sparse=False)

# 轉換特徵後,我們發現凡是類別型的特徵都單獨剝離出來,獨成一列特徵,數值型的則保持不變。
X_train = vec.fit_transform(X_train.to_dict(orient='record'))
print(vec.feature_names_)

# 同樣需要對測試數據的特徵進行轉換。
X_test = vec.transform(X_test.to_dict(orient='record'))

使用單一決策樹建模:

# 使用單一決策樹進行模型訓練以及預測分析。
# 從sklearn.tree中導入決策樹分類器。
from sklearn.tree import DecisionTreeClassifier
# 使用默認配置初始化決策樹分類器。
dtc = DecisionTreeClassifier()
# 使用分割到的訓練數據進行模型學習。
dtc.fit(X_train, y_train)
# 用訓練好的決策樹模型對測試特徵數據進行預測。
dtc_y_pred = dtc.predict(X_test)

評估單一決策樹模型效果:

# 從sklearn.metrics導入classification_report。
from sklearn.metrics import classification_report

# 輸出單一決策樹在測試集上的分類準確性,以及更加詳細的精確率、召回率、F1指標。
print('The accuracy of decision tree is', dtc.score(X_test, y_test))
print(classification_report(dtc_y_pred, y_test))

使用隨機森林建模:

# 使用隨機森林分類器進行集成模型的訓練以及預測分析。
from sklearn.ensemble import RandomForestClassifier

rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
rfc_y_pred = rfc.predict(X_test)

評估隨機森林模型效果:

# 輸出隨機森林分類器在測試集上的分類準確性,以及更加詳細的精確率、召回率、F1指標。
print('The accuracy of random forest classifier is', rfc.score(X_test, y_test))
print(classification_report(rfc_y_pred, y_test))

這就是隨機森林代碼實現部分,你學會了麼?

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/jKWj_WsHnxyqWJJj-5WTbw