天天看點

Scikit-learn實作随機森林算法随機森林指的是利用多棵樹對樣本進行訓練并預測的一種分類器

随機森林指的是利用多棵樹對樣本進行訓練并預測的一種分類器

随機森林的原理

  • 在機器學習中,随機森林是一個包含多個決策樹的分類器
  • 根據下列算法而建造每棵樹:

    用N來表示訓練用例(樣本)的個數,M表示特征數目。

    輸入特征數目m,用于确定決策樹上一個節點的決策結果;其中m應遠小于M。

    從N個訓練用例(樣本)中以有放回抽樣的方式,取樣N次,形成一個訓練集(即bootstrap取樣),并用未抽到的用例(樣本)作預測,評估其誤差。

    對于每一個節點,随機選擇m個特征,決策樹上每個節點的決定都是基于這些特征确定的。根據這m個特征,計算其最佳的分裂方式。

    每棵樹都會完整成長而不會剪枝,這有可能在建完一棵正常樹狀分類器後會被采用)。

Scikit-learn實作随機森林和調參

  • 随機森林在Scikit-learn的ensemble子產品中,首先導入相應的子產品
from sklearn import ensemble
from sklearn import tree
from sklearn import datasets
from sklearn.model_selection import train_test_split
           
  • 這裡我們利用Scikit-learn中的紅酒資料集,這個資料集非常适用于機器學習中的樹類模型
wine = datasets.load_wine()
X_data = wine.data
y_data = wine.target
           
  • 随機森林常用的參數和重要屬性說明
  • 1 .min_samples_leaf=10,剪掉樣本數少于10個的葉節點,或者把樣本數少于10個的葉節點分到10個

    2 .n_estimators(預設為10),就是随機森林中樹的個數

    3 .min_impurity_split=30,中間節點樣本個數少于30的不在分化

    4 .min_impurity_decrease=0.3,中間節點的資訊增益低于0.3不再分化

    5 .max_features=2 #限制分支時考慮的特征個數

  • 随機森林的屬性和接口:

    1 .estimators_傳回建的森林的清單,每棵樹的情況

    2 .oob_score 袋外得分,随機森林采用bootstrap有放回的抽樣可能有一些從未抽取到的資料,這些資料可以用來做測試

    四個接口:fit,predict,score,apply

    接口 predict_prob傳回每一個樣本對應的被分到每一類标簽的機率,少數服從多數去選擇預測的标簽

  • 下面構模組化型
X_train,X_test,y_train,y_test = train_test_split(X_data,y_data,test_size = 0.3)
clf = tree.DecisionTreeClassifier(criterion='gini')
rfc = ensemble.RandomForestClassifier(random_state=10)    # 随機森林中樹的棵數
clf = clf.fit(X_train,y_train)
rfc  = rfc.fit(X_train,y_train)
           
  • 檢視決策樹和随機森林的模型得分,可以看到随機森林比決策樹效果好一些
score1 = clf.score(X_test,y_test) 
score2 = rfc.score(X_test,y_test) 
print('Decision tree model score: {}'.format(score1))
print('RandomForest model score: {}'.format(score2))

>> Decision tree model score: 0.9074074074074074
   RandomForest model score: 0.9629629629629629
           
  • 通過交叉驗證驗證一下模型的情況,并用matplotlib畫圖工具展示出來
### 多次交叉驗證
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
rfc_l = []
clf_l = []
for i in range(10):
    rfc = ensemble.RandomForestClassifier(n_estimators=25)
    rfc_s = cross_val_score(rfc,X_train,y_train,cv = 10).mean()
    rfc_l.append(rfc_s)
    
    clf = tree.DecisionTreeClassifier(criterion='entropy')
    clf_s = cross_val_score(clf,X_train,y_train,cv  = 10).mean()
    clf_l.append(clf_s)
    
plt.plot(range(1,11),rfc_l,label='RandomForest')
plt.plot(range(1,11),clf_l,label = "DecisionTree")

plt.legend()
plt.show()
           
Scikit-learn實作随機森林算法随機森林指的是利用多棵樹對樣本進行訓練并預測的一種分類器
  • 随機森林模型的屬性.feature_importances_可以檢視每個特征的重要性的比例
rfc.feature_importances_
>> array([0.22856109, 0.03452478, 0.01369924, 0.00668104, 0.01473769,
       0.09992003, 0.08866531, 0.00509946, 0.02717142, 0.14646766,
       0.07152866, 0.13577966, 0.12716396])
           
  • apple 屬性傳回每個測試樣本所在的葉子節點的索引
clf.apply(X_test)
>> array([[ 9, 10,  2, ...,  6, 17, 10],
       [14, 18, 10, ..., 10, 23, 16],
       [14, 18, 10, ..., 10, 23, 16],
       ...,
       [ 5, 14,  7, ...,  9, 24,  5],
       [ 9, 16,  5, ...,  6, 16, 10],
       [14, 18, 10, ..., 10, 23, 16]], dtype=int64)
           
  • predice屬性傳回每個測試樣本的預測結果,可以對比一下預測樣本的真實标簽 y_test。
rfc.predict(X_test)
>> array([0.22856109, 0.03452478, 0.01369924, 0.00668104, 0.01473769,
       0.09992003, 0.08866531, 0.00509946, 0.02717142, 0.14646766,
       0.07152866, 0.13577966, 0.12716396])
       
y_test
>> array([2, 0, 0, 1, 1, 2, 1, 2, 2, 1, 2, 2, 0, 1, 1, 2, 0, 2, 1, 0, 2, 1,
       1, 0, 1, 0, 0, 2, 2, 0, 0, 1, 0, 2, 0, 0, 2, 1, 1, 1, 1, 2, 0, 1,
       0, 1, 1, 0, 2, 1, 1, 1, 2, 0])