機器學習系列 - 隨機森林(RF)


先記錄一下使用方法,哇我真的吹爆scikit-learn這個庫,之前想做pca分析,手動代碼實現,用了一上午去複習方差協方差矩陣各種線代知識,然後發現scikit-learn直接提供了方法,好吧,對於小白來說總要多走走路纔好,理解一下實現原理也不錯,但是不妨礙scikit-learn這個是真的好用啊,什麼都提供了,機器學習首選!!

1. scikit-learn - RangeForestClassifier

scikit-learn中和隨機森林算法相關的類爲RangeForestClassifier,相關官方文檔講解點擊這裏,這個類的主要參數和方法如下:
類的構造函數:

RandomForestClassifier(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=True, oob_score=False, n_jobs=1, random_state=None,
verbose=0, warm_start=False, class_weight=None)

說明:

參數(params):
    n_estimators:數值型取值
        森林中決策樹的個數,默認是10

    criterion:字符型取值
        採用何種方法度量分裂質量,信息熵或者基尼指數,默認是基尼指數

    max_features:取值爲int型, float型, string類型, or None(),默認"auto"
        尋求最佳分割時的考慮的特徵數量,即特徵數達到多大時進行分割。
        int:max_features等於這個int值
        float:max_features是一個百分比,每(max_features * n_features)特徵在每個分割出被考慮。
        "auto":max_features等於sqrt(n_features)
        "sqrt":同等於"auto"時
        "log2":max_features=log2(n_features)
        None:max_features = n_features

    max_depth:int型取值或者None,默認爲None
        樹的最大深度

    min_samples_split:int型取值,float型取值,默認爲2
        分割內部節點所需的最少樣本數量
        int:如果是int值,則就是這個int值
        float:如果是float值,則爲min_samples_split * n_samples

    min_samples_leaf:int取值,float取值,默認爲1
        葉子節點上包含的樣本最小值
        int:就是這個int值
        float:min_samples_leaf * n_samples

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

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

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

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

    bootstrap:boolean類型取值,默認True
        是否採用有放回式的抽樣方式

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

    n_jobs:int類型取值,默認1
        擬合和預測過程中並行運用的作業數量。如果爲-1,則作業數設置爲處理器的core數。

    class_weight:dict, list or dicts, "balanced"
        如果沒有給定這個值,那麼所有類別都應該是權重1
        對於多分類問題,可以按照分類結果y的可能取值的順序給出一個list或者dict值,用來指明各類的權重.
        "balanced"模式,使用y值自動調整權重,該模式類別權重與輸入數據中的類別頻率成反比,
即n_samples / (n_classes * np.bincount(y)),分佈爲第n個類別對應的實例數。
        "balanced_subsample"模式和"balanced"模式類似,只是它計算使用的是有放回式的取樣中取得樣本數,而不是總樣本數

該類的主要屬性:

屬性:
    estimators_:決策樹列表
        擬合好的字分類器列表,也就是單個決策樹

    classes_:array of shape = [n_features]
        類別標籤列表

    n_classes_:int or list
        類別數量

    n_features:int
        擬合過程中使用的特徵的數量

    n_outputs:int 
        擬合過程中輸出的數量

    featrue_importances:特徵重要程度列表
        值越大,說明越重要

    oob_score:array of shape = [n_features]
        使用oob數據集測試得到的得分數

    oob_decision_funtion_:array of shape = [n_features, n_classes]
        oob樣本預測結果,每一個樣本及相應結果對列表

該類的主要方法:

方法:
    apply(X):用構造好的森林中的樹對數據集X進行預測,返回每棵樹預測的葉子節點。所以結果應該是二維矩陣,
行爲樣本第幾個樣本,列爲每棵樹預測的葉子節點。 

    decision_path(X):返回森林中的決策路徑

    fit(X, y[, sample_weight]):用訓練數據集(x, y)來構造森林

    get_params([deep]):獲得分類器的參數

    predict(X):預測X的類別

    predict_log_proba(X):預測X的類的對數概率,和predict_proba類似,只是取了對數

    predict_proba(X):預測X的類別的概率。輸入樣本的預測類別概率被計算爲森林中樹木的平均預測類別概率。
單個樹的類概率是葉中同一類的樣本的比率。因爲葉子節點並不是完全純淨的,它也有雜質,
不同種類所佔惡比率是不一樣的,但肯定有一類純度很高。返回值是array of shape = [n_samples, n_classes]

    score(X, y[,sample_weight]):返回給定的數據集(數據集指定了類別)的預測準確度

    set_params(**params):設置決策樹的參數

參考:scikit-learn中隨機森林使用詳解

2. Demo - 處理印第安人糖尿病診斷問題

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
import numpy as np

# 導入數據
dataset = np.loadtxt('pima-indians-diabetes.csv', delimiter=',')
# 分割輸入x和輸出Y
x = dataset[:, 0: 8]
Y = dataset[:, 8]

feature_train, feature_test, target_train, target_test = train_test_split(x, Y, test_size=0.2, random_state=56)

rf_model = RandomForestClassifier(n_estimators=100)
rf_model.fit(feature_train, target_train)
predict_results = rf_model.predict(feature_test)

print(accuracy_score(predict_results, target_test))

結果:
在這裏插入圖片描述

3. 使用GridSearchCV調參

官方API
1)引入GridSearchCV

from sklearn.model_selection import GridSearchCV

2)調參1:n_estimators
弱學習器的最大迭代次數,或者說最大的弱學習器的個數。一般來說n_estimators太小,容易欠擬合,n_estimators太大,計算量會太大,並且n_estimators到一定的數量後,再增大n_estimators獲得的模型提升很小,所以一般選擇一個適中的數值,默認是100。

param_test1 = {'n_estimators': range(80, 201, 10)}
gsearch1 = GridSearchCV(estimator=RandomForestClassifier(min_samples_split=100,
                                                         min_samples_leaf=20, max_depth=8, max_features='sqrt',
                                                         random_state=10),
                        param_grid=param_test1, scoring='roc_auc', cv=5)
gsearch1.fit(x, Y)
print(gsearch1.best_params_, gsearch1.best_score_)

結果:在這裏插入圖片描述
3)接着對決策樹最大深度max_depth和內部節點再劃分所需最小樣本數min_samples_split進行網格搜索

# 調參2:max_depth,min_samples_split
param_test2 = {'max_depth': range(3, 14, 2), 'min_samples_split': range(50, 201, 20)}
gsearch2 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=170,
                                                         min_samples_leaf=20, max_features='sqrt', oob_score=True,
                                                         random_state=10),
                        param_grid=param_test2, scoring='roc_auc', iid=False, cv=5)
gsearch2.fit(x, Y)
print(gsearch2.best_params_, gsearch2.best_score_)

結果:
在這裏插入圖片描述
4)對內部節點再劃分所需最小樣本數min_samples_split和葉子節點最少樣本數min_samples_leaf一起調參

# 調參3:min_samples_split,min_samples_leaf
param_test3 = {'min_samples_split': range(80, 150, 20), 'min_samples_leaf': range(10, 60, 10)}
gsearch3 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=170, max_depth=7,
                                                         max_features='sqrt', oob_score=True, random_state=10),
                        param_grid=param_test3, scoring='roc_auc', iid=False, cv=5)
gsearch3.fit(x, Y)
print(gsearch3.best_params_, gsearch3.best_score_)

結果:
在這裏插入圖片描述
5)對最大特徵數max_features調參

# 調參:max_features
param_test4 = {'max_features': range(3, 8, 1)}
gsearch4 = GridSearchCV(estimator=RandomForestClassifier(n_estimators=170, max_depth=7, min_samples_split=80,
                                                         min_samples_leaf=10, oob_score=True, random_state=10),
                        param_grid=param_test4, scoring='roc_auc', iid=False, cv=5)
gsearch4.fit(x, Y)
print(gsearch4.best_params_, gsearch4.best_score_)

結果:
在這裏插入圖片描述參考:機器學習之集成學習(七)隨機森林scikit-learn庫
可見調參不一定是有用的

4. 隨機森林理論學習

參考:[Machine Learning & Algorithm] 隨機森林(Random Forest)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章