2017年8月25日 星期五

機器學習_ML_RandomForestClassifier(隨機森林)

機器學習_ML_RandomForestClassifier(隨機森林)

原文連結
直觀的說,隨機森林可被視為是多個決策樹結合成的一個整體。
整體學習的背後想法是為了結合多個弱學習器來建構一個較強固的模型-強學習器!
一般來說,強學習器較不會發生高度過適問題,誤差也較低!
四步驟:

  1. 定義大小為n的隨機樣本數,採放回式(取出會放回)
  2. 從自助樣本中導出決策樹,並對每一個節點隨機選擇d個特徵(取出不放回),使用特徵分割該節點,依目標函數找出最佳方式。
  3. 重複k次1-2步
  4. 匯總,以多數決來指定類別標籤!

隨機森林的一個優點在於,我們不需要擔心如何選擇超參數值。
不需修剪隨機森林,因為強學習器不會因為雜訊影響,採多數決。
一般來說,k值愈大效果愈多,因為產生愈多的弱學習器,但效能是付出的學習成本。
n過大可能造成過適,而過小,也可以造成效能不佳!
多數的實作中,我們會採scikit-learn的預設置!
記得,隨機森林不需要做任何的資料預處理(標準化或是正規化、降維)

IMPORT

from sklearn.ensemble import RandomForestClassifier

CLASS

RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_impurity_split=1e-07, 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)

參數說明

bootstrap

default True

class_weight

default balance
各目標標籤權重,無設置的話則為相同。

criterion

default gini {gini, entropy}
entropy_熵
原文特別說明,這個參數是決策樹才有的!

max_depth

default None
樹的最大深度,若無設置會一直全部展開到完全分類,或是一直到min_samples_split的設置!

max_features

default auto
最大特徵數
auto:max_features = sqrt(n_features) # sqrt為取正平方根
sqrt:max_features = sqrt(n_features)
log2:max_features=log2(n_features)
None:max_features=n_features
要注意原文說明提到

the search for a split does not stop until at least one valid partition of the node samples is found, even if it requires to effectively inspect more than max_features features.

max_leaf_nodes

default None
最大節點數,未設置就是不限制

min_impurity_split

0.19之後不再用,改用min_impurity_decrease

min_impurity_decrease

default 0
似乎是個節點門檻值…需要再研究
原文說明來看是該節點與全樣本的比例如果過低,就刪除該節點?

A node will be split if this split induces a decrease of the impurity greater than or equal to this value.
The weighted impurity decrease equation is the following:
N_t / N * (impurity - N_t_R / N_t * right_impurity - N_t_L / N_t * left_impurity)

min_samples_leaf

default 1
每一節點的最小樣本數

min_samples_split

default 2
每一層長幾葉,依你的目標資料集設置

min_weight_fraction_leaf

default 0
權重總和的最小加權分數,若未設置則權重相同。

n_estimators

default 10
k值_決策樹樹量

n_jobs

default 1
使用多少CPU核心數
-1代表火力全開

oob_score

default False
是否用額外樣本來估算廣義 精度

random_state

default None
亂數種子

verbose

default 0
過程是否顯示

warm_start

default False
是否用上次的結果來加入計算,或是重新產生樹。
預設是重新產生樹

方法

apply(X)

回傳每個樣本的決策樹索引

decision_path(X)

回傳樹的決策路徑,似乎是個物件。

fit(X, y[, sample_weight])

適合(訓練)資料集

get_params([deep])

取得參數

predict(X)

回傳預測分類

predict_log_proba(X)

回傳類別概率(機率、或然率)對數

predict_proba(X)

回傳類別概率(機率、或然率)

score(X, y[, sample_weight])

這邊的得分是回傳平均準確率

Returns the mean accuracy

set_params(**params)

設置參數

屬性

estimators_

產生的樹的列表,看你設定產生幾棵樹就有多少資料

classes_

回傳目標標籤,依範例為[0, 1, 2]

n_classes_

回傳目標標籤個數,依範例為3

n_features_

n_outputs_

回傳fit的時候的輸出,依範例為1

feature_importances_

回傳特徵權重

oob_score_

oob_decision_function_

範例

from sklearn import datasets
import numpy as np
iris = datasets.load_iris()
X = iris.data[:, [2, 3]]
y = iris.target

#  如果是2.0版的話,from sklearn.model_selection import train_test_split
from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test =  train_test_split(
X, y, test_size=0.3, random_state=0)

from sklearn.ensemble import RandomForestClassifier
forest = RandomForestClassifier(criterion='entropy',
                              n_estimators=10,
                              random_state=1,
                              n_jobs=-1)
                              #  記得上面的備註嗎?多數會用預設的參數。
                              #  定義要產生的樹,定義使用的CPU跟熵或GINI就夠了!
forest.fit(X_train, y_train)
forest.score(X_train, y_train)
forest.feature_importances_  #  特徵權重

透過特徵的權重你也可以確認那些特徵對準度影響性大,或許也可以當做另類的特徵挑選!
我拿了八十萬筆資料來切六成做測試,主機CPU為I3,記憶體為8G,PYTHON跑到記憶體佔3G之後就掛了!

沒有留言:

張貼留言