随機森林指的是利用多棵樹對樣本進行訓練并預測的一種分類器
随機森林的原理
- 在機器學習中,随機森林是一個包含多個決策樹的分類器
-
根據下列算法而建造每棵樹:
用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()
- 随機森林模型的屬性.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])