2017年9月10日 星期日

機器學習_ML_ExtraTreesClassifier(極限樹)

機器學習_ML_ExtraTreesClassifier(極限樹)

Extremely Randomized Trees
原文說明
原文API
極限樹是tree的一種,但是跟隨機森林一樣,都是歸類在整體學習(ensemble)中,不同於隨機森林,隨機森林在隨機產生了樹之後,那個樹會以熵為主去做樹,但極限樹,沒有極限,一切隨緣,以此方式來減少變異數(方差)。
instead of looking for the most discriminative thresholds,
thresholds are drawn at random for each candidate feature
模型的大小:O(M * N * log (N))
M:樹的數量
N:樣本數量
可以再搭配下列參數來控制
min_samples_split, min_samples_leaf, max_leaf_nodes and max_depth.

IMPORT

from sklearn.ensemble import ExtraTreesClassifier

CLASS

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

參數說明

The main parameters to adjust when using these methods is n_estimators and max_features

n_estimators

default 10
k值_決策樹樹量
The larger the better(愈大愈好,但跟學習成本是正相關)

criterion

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

max_depth

default None
建議None搭配min_samples_split=1,但會需要大量記憶體

min_samples_split

default=1
建議搭配max_depth=None,但會需要大量記憶體

min_samples_leaf

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

min_weight_fraction_leaf

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

max_features

default auto
auto:max_features=sqrt(n_features).
sqrt:max_features=sqrt(n_features).
log2:max_features=log2(n_features).
None:max_features=n_features.
max_features=n_features for regression(極限樹迴歸)
max_features=sqrt(n_features) for classification(極限樹分類)

max_leaf_nodes

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

min_impurity_decrease

default 0
似乎是個節點門檻值…需要再研究
原文說明來看是該節點與全樣本的比例如果過低,就刪除該節點?
N_t / N * (impurity - N_t_R / N_t * right_impurity
                    - N_t_L / N_t * left_impurity)

min_impurity_split

0.19之後不再用,改用min_impurity_decrease

bootstrap

default False
搭配oob_score=True

oob_score

default False
是否用額外樣本來估算廣義精度
搭配bootsrap=True

n_jobs

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

random_state

default None
亂數種子

verbose

default 0
過程是否顯示

warm_start

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

class_weight

default None
balance:n_samples / (n_classes * np.bincount(y))
balanced_subsample:理論同上,除了根據每棵樹生長的引導樣本計算權重

方法

apply(X)

回傳每個樣本的決策樹索引
array([[ 3,  5,  4, ..., 12,  4,  6],
       [31, 38, 36, ..., 37, 33, 41],
       [34, 40, 40, ..., 37, 33, 42],
       ...,
       [ 3,  6,  4, ..., 14,  4,  6],
       [32, 40, 40, ..., 38, 34, 44],
       [ 2,  4,  2, ...,  3,  1,  2]], dtype=int64)

decision_path(X)

回傳樹的決策路徑,似乎是個物件。
(<105x372 sparse matrix of type '<class 'numpy.int64'>'
        with 5753 stored elements in Compressed Sparse Row format>,
        array([  0, 35,  76, 117, 144, 177, 210, 253, 292, 327, 372],
        dtype=int32))

fit(X, y[, sample_weight])

適合(訓練)資料集

get_params([deep])

取得參數

predict(X)

回傳預測分類

predict_log_proba(X)

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

predict_proba(X)

回傳類別概率(機率、或然率)
可以看到每一筆資料在這個模組中的預測

score(X, y[, sample_weight])

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

set_params(**params)

設置參數

屬性

estimators_

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

classes_

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

n_classes_

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

feature_importances_

回傳特徵權重
>>> extra_tree.feature_importances_
array([ 0.49439825,  0.50560175])

n_features_

回傳fit的時候用的特徵數,依範例為2

n_outputs_

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

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 ExtraTreesClassifier
extra_tree = ExtraTreesClassifier(criterion='entropy',
                              n_estimators=10,
                              random_state=1,
                              n_jobs=-1)
                             
extra_tree.fit(X_train, y_train)
extra_tree.score(X_train, y_train)
extra_tree.feature_importances_  #  特徵權重

沒有留言:

張貼留言