機器學習_ML_RandomForestClassifier(隨機森林)
原文連結
直觀的說,隨機森林可被視為是多個決策樹結合成的一個整體。
整體學習的背後想法是為了結合多個弱學習器來建構一個較強固的模型-強學習器!
一般來說,強學習器較不會發生高度過適問題,誤差也較低!
四步驟:
- 定義大小為n的隨機樣本數,採放回式(取出會放回)
- 從自助樣本中導出決策樹,並對每一個節點隨機選擇d個特徵(取出不放回),使用特徵分割該節點,依目標函數找出最佳方式。
- 重複k次1-2步
- 匯總,以多數決來指定類別標籤!
隨機森林的一個優點在於,我們不需要擔心如何選擇超參數值。
不需修剪隨機森林,因為強學習器不會因為雜訊影響,採多數決。
一般來說,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之後就掛了!
沒有留言:
張貼留言