公號:碼農充電站pro
主頁:https://codeshellme.github.iohtml
本篇文章來介紹隨機森林(RandomForest)算法。node
在前邊的文章《AdaBoost 算法-分析波士頓房價數據集》中,咱們介紹過集成算法。集成算法中有一類算法叫作 bagging 算法。python
bagging 算法是將一個原始數據集隨機抽樣成 N 個新的數據集。而後將這 N 個新的數據集做用於同一個機器學習算法,從而獲得 N 個模型,最終集成一個綜合模型。git
在對新的數據進行預測時,須要通過這 N 個模型(每一個模型互不依賴干擾)的預測(投票),最終綜合 N 個投票結果,來造成最後的預測結果。github
bagging 算法的流程可用下圖來表示:算法
隨機森林算法是 bagging 算法中比較出名的一種。shell
隨機森林算法由多個決策樹分類器組成,每個子分類器都是一棵 CART 分類迴歸樹,因此隨機森林既能夠作分類,又能夠作迴歸。bootstrap
當隨機森林算法處理分類問題的時候,分類的最終結果是由全部的子分類器投票而成,投票最多的那個結果就是最終的分類結果。dom
當隨機森林算法處理迴歸問題的時候,最終的結果是每棵 CART 樹的迴歸結果的平均值。機器學習
sklearn 庫即實現了隨機森林分類樹,又實現了隨機森林迴歸樹:
RandomForestClassifier 類的原型以下:
RandomForestClassifier(n_estimators=100, 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=None, random_state=None, verbose=0, warm_start=False, class_weight=None, ccp_alpha=0.0, max_samples=None)
能夠看到分類樹的參數特別多,咱們來介紹幾個重要的參數:
RandomForestRegressor 類的原型以下:
RandomForestRegressor(n_estimators=100, criterion='mse', 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=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)
迴歸樹中的參數與分類樹中的參數基本相同,但 criterion 參數的取值不一樣。
在迴歸樹中,criterion 參數有下面兩種取值:
下面使用隨機森林分類樹來處理鳶尾花數據集,該數據集在《決策樹算法-實戰篇》中介紹過,這裏再也不介紹,咱們直接使用它。
首先加載數據集:
from sklearn.datasets import load_iris iris = load_iris() # 準備數據集 features = iris.data # 獲取特徵集 labels = iris.target # 獲取目標集
將數據分紅訓練集和測試集:
from sklearn.model_selection import train_test_split train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)
接下來構造隨機森林分類樹:
from sklearn.ensemble import RandomForestClassifier # 這裏均使用默認參數 rfc = RandomForestClassifier() # 訓練模型 rfc.fit(train_features, train_labels)
estimators_
屬性中存儲了訓練出來的全部的子分類器,來看下子分類器的個數:
>>> len(rfc.estimators_) 100
預測數據:
test_predict = rfc.predict(test_features)
測試準確率:
>>> from sklearn.metrics import accuracy_score >>> accuracy_score(test_labels, test_predict) 0.96
在機器學習算法模型中,通常都有不少參數,每一個參數都有不一樣的取值。如何才能讓模型達到最好的效果呢?這就須要參數調優。
sklearn 庫中有一個 GridSearchCV 類,能夠幫助咱們進行參數調優。
咱們只要告訴它想要調優的參數有哪些,以及參數的取值範圍,它就會把全部的狀況都跑一遍,而後告訴咱們參數的最優取值。
先來看下 GridSearchCV 類的原型:
GridSearchCV(estimator, param_grid, scoring=None, n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score=nan, return_train_score=False)
其中有幾個重要的參數:
下面咱們對隨機森林分類樹進行參數調優,仍是使用鳶尾花數據集。
首先載入數據:
from sklearn.datasets import load_iris iris = load_iris()
構造分類樹:
from sklearn.ensemble import RandomForestClassifier rfc = RandomForestClassifier()
若是咱們要對分類樹的 n_estimators
參數進行調優,調優的範圍是 [1, 10]
,則準備變量:
param = {"n_estimators": range(1,11)}
建立 GridSearchCV 對象,並調優:
from sklearn.model_selection import GridSearchCV gs = GridSearchCV(estimator=rfc, param_grid=param) # 對iris數據集進行分類 gs.fit(iris.data, iris.target)
輸出最優準確率和最優參數:
>>> gs.best_score_ 0.9666666666666668 >>> gs.best_params_ {'n_estimators': 7}
能夠看到,最優的結果是 n_estimators
取 7,也就是隨機森林的子決策樹的個數是 7 時,隨機森林的準確度最高,爲 0.9667。
本篇文章主要介紹了隨機森林算法的原理及應用,並展現瞭如何使用 GridSearchCV 進行參數調優。
(本節完。)
推薦閱讀:
歡迎關注做者公衆號,獲取更多技術乾貨。