隨機森林和Extra-Trees
隨機森林
先前說了bagging的方法,其中使用的算法都是決策樹算法,對於這樣的模型,因為具有很多棵樹,而且具備了隨機性,那么就可以稱為隨機森林
在sklearn中封裝了隨機森林的類,可以使用這個類直接創建出一個隨機森林,同時sklearn中的隨機森林模型的隨機性更為復雜,對於決策樹來說,都是對每一個節點進行划分,詳情看這里
在sklearn中的封裝的隨機森林默認在每一個節點上,都是在一個隨機的特征子集上尋找一個最優的划分,並不是在節點上對所有的特征進行划分,這就增加了每一個子模型的隨機性
具體使用
(在notebook中)
加載好需要的類庫,虛擬數據的隨機種子設置為666,繪制圖像
import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
X,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=666)
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])
圖像如下
使用sklearn提供的隨機模型只要調用RandomForestClassifier這個類就可以,然后實例化,傳入參數,設置樣本點為500,隨機種子為666,使用全部核心並行,並使用未使用的樣本點進行測試計算准確度,然后進行訓練,計算准確度
from sklearn.ensemble import RandomForestClassifier
rf_clf = RandomForestClassifier(n_estimators=500,random_state=666,oob_score=True,n_jobs=-1)
rf_clf.fit(X,y)
rf_clf.oob_score_
結果如下
新添加一個參數進行實例化,傳入參數max_leaf_nodes,限制每一個決策樹的葉子節點,設置為16,然后訓練並計算樣本的准確度
rf_clf2 = RandomForestClassifier(n_estimators=500,max_leaf_nodes=16,random_state=666,oob_score=True,n_jobs=-1)
rf_clf2.fit(X,y)
rf_clf2.oob_score_
結果如下
可以不斷調參以獲得更好的准確度,這里不難發現,隨機森林的參數是可以使用決策樹的參數的
Extra trees
和隨機森林非常類似的還有Extra trees,極其隨機的森林,其極其的隨機性表現在,在節點划分上,直接使用隨機的特征和隨機的閾值,可以想象,這每棵樹的差別會更加的大,很隨機,這種方式提供了額外的隨機性,而且抑制了過擬合(方差),但是這樣的操作增大了bias(偏差),所以要看問題本身是不是適合使用這種方法
這個方法比起隨機森林而言,有着更快的訓練速度,在sklearn中使用也很簡單,調用ExtraTreesClassifier這個類就可以了,使用的參數也和RandomForestClassifier一樣,需要注意的是,bootsreap默認是flase,所以要使用放回取樣還需要設置為true,然后訓練並計算准確度
from sklearn.ensemble import ExtraTreesClassifier
et_clf = ExtraTreesClassifier(n_estimators=500,bootstrap=True,oob_score=True,random_state=666)
et_clf.fit(X,y)
et_clf.oob_score_
結果如下
添加一個新的參數,添加max_leaf_nodes=,設置為16,然后訓練模型並計算准確度
et_clf2 = ExtraTreesClassifier(n_estimators=500,max_leaf_nodes=16,bootstrap=True,oob_score=True,random_state=666)
et_clf2.fit(X,y)
et_clf2.oob_score_
結果如下
其實集成學習也可以解決回歸問題,在sklearn中可以使用很多類來解決,比如baggingregressor,randomforestregressor,extratreesregressor等類,使用方式和上面大致一樣,不過因為解決的是回歸問題,所以輸出結果是一個數字