一、隨機森林是什么?
隨機森林是一種多功能的機器學習算法,能夠執行①回歸和②分類的任務,
同時也是一種③數據降維手段,用於處理缺失值、異常值等
擔任了集成學習中的重要方法,可以將④幾個低效模型整合為一個高效模型
在隨機森林中,我們將生成很多的決策樹,並不像在CART模型中只生成唯一的樹
1)分類 => 當在基於某些屬性對一個新對象進行分類判別時,隨機森林中的每一顆樹都會給出自己的分類選擇,並由此進行“投票”,森林整體的輸出結果是的票數最多的分類選項


2)回歸 => 而在回歸問題中,隨機森林的輸出將會是所有決策樹輸出的平均值
隨機森林現實意義:
現實情況下,一個數據集中往往有成百上千個特征,如何在其中選擇比結果影響最大的那幾個特征,以此來【縮減建立模型時特征數】是我們比較關心的問題。
這樣的方法其實很多,比如主成分分析,lasso等等。不過這里我們學習的是用隨機森林來進行特征篩選。
二、隨機森林詳細
1)隨機森林生成方式
- 從樣本集中通過bootstrap的方式產生n個樣本。
- 假設樣本特征數目為a,對n個樣本選擇a中的k個特征,用建立決策樹的方式獲得最佳分割點。
- 在CART每次branching的時候隨機抽取一部分特征計算Gini impurity或均方誤差來選擇best split feature(RF作者使用的這種方法)
- 每棵樹都是解決一部分問題的專家
- 重復m次,產生m棵決策樹。
- 多數投票機制進行預測。
Q1.隨機森林中的隨機是什么意思?
- 隨機采樣:隨機森林在計算每棵樹時,從全部訓練樣本(樣本數為n)中選取一個可能有重復的、大小同樣為n的數據集進行訓練(即booststrap采樣)。
- 特征選取的隨機性:在每個節點隨機選取所有特征的一個子集,用來計算最佳分割方式。
2)隨機森林的優點
- 表現性能好,與其他算法相比有着很大優勢。
- 隨機森林能處理很高維度的數據(也就是很多特征的數據),並且不用做特征選擇。
- 在訓練完之后,隨機森林能給出哪些特征比較重要。
- 訓練速度快,容易做成並行化方法(訓練時,樹與樹之間是相互獨立的)。
- 在訓練過程中,能夠檢測到feature之間的影響。
- 隨機森林算法有很強的抗干擾能力(具體體現在6,7點)。所以當數據存在大量的數據缺失,用RF也是不錯的。
- 對於不平衡數據集來說,隨機森林可以平衡誤差。當存在分類不平衡的情況時,隨機森林能提供平衡數據集誤差的有效方法。
- 如果有很大一部分的特征遺失,用RF算法仍然可以維持准確度。
- 隨機森林抗過擬合能力比較強(雖然理論上說隨機森林不會產生過擬合現象,但是在現實中噪聲是不能忽略的,增加樹雖然能夠減小過擬合,但沒有辦法完全消除過擬合,無論怎么增加樹都不行,再說樹的數目也不可能無限增加的。)
- 隨機森林能夠解決分類與回歸兩種類型的問題,並在這兩方面都有相當好的估計表現。(雖然RF能做回歸問題,但通常都用RF來解決分類問題)。
- 在創建隨機森林時候,對generlization error(泛化誤差)使用的是無偏估計模型,泛化能力強。
3)隨機森林的缺點
- 隨機森林在解決回歸問題時,並沒有像它在分類中表現的那么好,這是因為它並不能給出一個連續的輸出。當進行回歸時,隨機森林不能夠做出超越訓練集數據范圍的預測,這可能導致在某些特定噪聲的數據進行建模時出現過度擬合。(PS:隨機森林已經被證明在某些噪音較大的分類或者回歸問題上回過擬合)。
- 對於許多統計建模者來說,隨機森林給人的感覺就像一個黑盒子,你無法控制模型內部的運行。只能在不同的參數和隨機種子之間進行嘗試。
- 可能有很多相似的決策樹,掩蓋了真實的結果。
- 對於小數據或者低維數據(特征較少的數據),可能不能產生很好的分類。(處理高維數據,處理特征遺失數據,處理不平衡數據是隨機森林的長處)。
- 比決策樹算法更復雜,計算成本更高。
- 由於其本身的復雜性,它們比其他類似的算法需要更多的時間來訓練
PS:最后幾個重要的點
1. RF采用多個決策樹的投票機制來改善決策樹。
2. 為什么不能用全樣本去訓練m棵決策樹?
答:全樣本訓練忽視了局部樣本的規律,對於模型的泛化能力是有害的(如果有m個決策樹,那就需要m個一定數量的樣本集來訓練每一棵樹)
3.產生n個樣本的方法,采用Bootstraping法,這是一種又放回的抽樣方法,產生n個樣本。
4.最終采用Bagging的策略來獲得,即多數投票機制。
適用於:抹平異常值
三、極限森林定義
數據集:極限森林和隨機森林類似,但是在每一個決策樹的采樣上不同,RF是隨機采取訓練樣例的部分數據,而極限森林中每一個決策樹都采用原始訓練集;
特征選取:同時,RF在每一個決策樹上,都會選取最優特征值划分點,而極限森林會隨機選取一個特征值來進行划分。
優點
- 規模大。
由於隨機選擇了特征值的划分點位,而不是最優點位,這樣會導致生成的決策樹的規模一般會大於RF所生成的決策樹
- 泛化能力好。
適用於:不知哪個特征重要
四、sklearn代碼和參數解釋
#-*-coding:gb2312-*- import numpy as np import sklearn.datasets as dt from sklearn.tree import DecisionTreeClassifier from sklearn.ensemble import RandomForestClassifier,ExtraTreesClassifier from sklearn.model_selection import train_test_split,cross_val_score if __name__ == '__main__': data = dt.load_iris(True) # 有4個特征 ,If True, returns ``(data, target)`` train_data,train_label = data[0],data[1] # # Code Text # train_data 待划分的樣本特征集合 # train_label 待划分的樣本標簽 # test_size 若在0~1之間,為測試集樣本數目與原始樣本數目之比;若為整數,則是測試集樣本的數目。 # random_state 隨機數種子 # x_train 划分出的訓練集數據(返回值) # x_test 划分出的測試集數據(返回值) # y_train 划分出的訓練集標簽(返回值) # y_test 划分出的測試集標簽(返回值) # x_train,x_test,y_train,y_test = train_test_split(train_data,train_label,test_size=0.2,random_state=1024) # DecisionTree tree = DecisionTreeClassifier(criterion='entropy') print(cross_val_score(tree,x_train,y_train,cv=10).mean()) # cv: 交叉驗證折數或可迭代的次數 # RandomForest # n_estimators確定用於構造的樹的個數 # 要在可承受的內存/時間內選取盡可能大的 n_estimators rf = RandomForestClassifier(n_estimators=128,criterion='entropy') # 2^x 以2的次方吞吐,對cpu資源利用好,不浪費 64 -> 一次64字節 print(cross_val_score(rf,x_train,y_train,cv=10).mean()) # ExtraForest ef = ExtraTreesClassifier(n_estimators=128,criterion='entropy') print(cross_val_score(ef,x_train,y_train,cv=10).mean()) # 特征太少體現不出區別
隨機森林的分類學習器為RandomForestClassifier,回歸學習器為RandomForestRegressor
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=None, random_state=None, verbose=0, warm_start=False, class_weight=None)
參數解釋:
控制bagging框架的參數
- estimators:隨機森林中樹的棵樹,即要生成多少個基學習器(決策樹)。
- boostrap:是否采用自助式采樣生成采樣集。
- obb_score:是否使用袋外數據來估計模型的有效性。
控制決策樹的參數
- criterion:選擇最優划分屬性的准則,默認是"gini",可選"entropy"。
- max_depth:決策樹的最大深度
- max_features:隨機抽取的候選划分屬性集的最大特征數(屬性采樣)
- min_samples_split:內部節點再划分所需最小樣本數。默認是2,可設置為整數或浮點型小數。
- min_samples_leaf:葉子節點最少樣本數。默認是1,可設置為整數或浮點型小數。
- max_leaf_nodes:最大葉子結點數。默認是不限制。
- min_weight_fraction_leaf:葉子節點最小的樣本權重和。默認是0。
- min_impurity_split:節點划分最小不純度。
其他參數:
- n_jobs:並行job的個數
- verbose:是否顯示任務進程
可調用方法:
- predict_proba:計算預測的概率值
- predict(x):預測
- predict_log_proba(x):計算出預測的對數概率值
可調用的屬性:
- estimators_:列出決策樹參數
- feature_importances_:列出變量重要性
- n_features:
- n_outputs_:
- obb_score_:袋外數據測試效果
- obb_prediction_:袋外數據預測結果
