目錄
一、集成學習的含義
二、集成學習的代表
三、集成學習的應用
1、分類問題集成。(基學習器是分類模型)
2、回歸問題集成。(基學習器是回歸模型)
3、特征選取集成。
四、Bagging之隨機森林
1、隨機森林是有多個決策樹,我們將他們構成出森林。
2、隨機森林總共有四個特點:
(1)數據采樣隨機
(2)特征選取隨機
(3)森林
(4)基分類器為決策樹
3、隨機森林的生成步驟
1、對原始數據集進行隨機采樣
2、每個基分類器獲取不同的數據集,每個數據的的特征也是隨機抽取的
3、將隨機抽取的數據及特征傳遞給決策樹進行訓練
4、通過強分類器投票,選出性能指標占比最多的作為結果(例如結果中很多預測的是0,那么最終就會通過強分類器預測為0)
五、Bagging之隨機森林的優缺點(集成學習的共有優點)
1、具有極高的準確率
2、隨機性的引入,使得隨機森林的抗噪聲能力很強
3、隨機性的引入,使得隨機森林不容易過擬合
4、能夠處理很高維度的數據,不用做特征選擇
5、容易實現并行化計算
6、缺點
六、隨機森林模型的簡單使用
1、隨機森林模型的參數
一、集成學習的含義
集成學習是將多個基學習器進行組合,來實現比單一學習器顯著優越的學習性能。
這里的每個基學習器可以是任意機器學習的模型,可以是線性回歸、邏輯回歸、KNN、決策樹等模型,基學習器可以使用單一模型組合,也可以使用多模型隨機組合。
使用訓練數據進行模型訓練,然后將測試集的數據傳入,選擇結果。
二、集成學習的代表
.bagging方法:典型的是隨機森林方法
.boosting方法:典型的Xgboost
.stacking方法:堆疊模型
三、集成學習的應用
1、分類問題集成。(基學習器是分類模型)
2、回歸問題集成。(基學習器是回歸模型)
3、特征選取集成。
(場景:當我們的數據集特別大時,就會有很多的特征,那么這些特征對分離結果的影響有多大,我們可以計算該特征與分類結果之間的相關系數來進行估量,在隨機森林模型中可以對每個特征進行特征選取,它可以內部對每個特征量化一個指標,最終結果會選擇盡可能多的相關性比較大的特征。)
所以集成學習之隨機森林既可以做分類問題也可以做回歸問題。
四、Bagging之隨機森林
1、隨機森林是有多個決策樹,我們將他們構成出森林。
2、隨機森林總共有四個特點:
(1)數據采樣隨機
假設我們有一個數據集,那么針對每一個基分類器,我們都會隨機抽取一定比例(例如80%)的數據做為訓練集,其余作為測試集,特別要注意,針對每一個基分類器都是隨機抽取,這保證了我們的數據會被充分使用,同時隨機抽取會最大程度的覆蓋所有可能的情況。
(2)特征選取隨機
針對同一個數據集,那么我們每次選取數據時,會隨機抽取80%(這時認為根據實際情況設定的)的特征,那么對于每個數據集的特征選取會出現有的數據集抽到很差的特征那么該數據集展現的性能就會很差,如果抽取到的都是好的特征,那么模型的性能也會很好。
(3)森林
有多個決策樹,所以稱之為森林。
(4)基分類器為決策樹
每個決策樹學習的數據都是不同的。
3、隨機森林的生成步驟
1、對原始數據集進行隨機采樣
2、每個基分類器獲取不同的數據集,每個數據的的特征也是隨機抽取的
3、將隨機抽取的數據及特征傳遞給決策樹進行訓練
4、通過強分類器投票,選出性能指標占比最多的作為結果(例如結果中很多預測的是0,那么最終就會通過強分類器預測為0)
五、Bagging之隨機森林的優缺點(集成學習的共有優點)
1、具有極高的準確率
2、隨機性的引入,使得隨機森林的抗噪聲能力很強
數據的隨機抽取會使得某些基分類器抽取到噪聲數據,也會有抽取不到噪聲數據的基分類器,因為噪聲數據出現的概率占少數,所以在強分類器投票選擇時,這些抽取到噪聲的基分類器對我們最終分類結果的影響特別小,因此我們的抗噪聲能力特別強。
3、隨機性的引入,使得隨機森林不容易過擬合
因為隨機森林的結果是由多個決策樹決定的,所以不容易出現過擬合,過擬合的表現是在訓練集上表現得很好,但是在測試集上得效果很差,產生原因是由于受單一數據影響太大,而隨機森林會根據多個結果共同決定基本不會出現過擬合得情況。
4、能夠處理很高維度的數據,不用做特征選擇
不用做特征選取的原因,很差的特征對決策樹的影響很小,因為即使是很差的特征,我們每個基分類器抽取是隨機的,不會有很多分類器抽到這個差的特征,所以對最終結果的影響不大,就不用去特意選擇特征。
5、容易實現并行化計算
隨機森林的結構是由多個基分類器構成,那么每個基分類器都可以部署在一個單獨的服務器上,多個分類器可以放在多個服務器上,實現了多個分類器同時訓練,并行計算。
6、缺點
1、當隨機森林中的決策樹的個數很多時,訓練時需要的空間和時間會比較大。
2、隨機森林模型還有許多不好解釋的地方,有點像個黑盒模型。
六、隨機森林模型的簡單使用
1、隨機森林模型的參數
class?sklearn.ensemble.RandomForestClassifier(n_estimators=’warn’,?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)
隨機森林重要的一些參數:
1.n_estimators?:(隨機森林獨有)
????????隨機森林中決策樹的個數。
????????在0.20版本中默認是10個決策樹;
????????在0.22版本中默認是100個決策樹;
2.?criterion?:(同決策樹)
節點分割依據,默認為基尼系數。
可選【entropy:信息增益】
3.max_depth:(同決策樹)【重要】
????????default=(None)設置決策樹的最大深度,默認為None。
(1)數據少或者特征少的時候,可以不用管這個參數,按照默認的不限制生長即可
(2)如果數據比較多特征也比較多的情況下,可以限制這個參數,范圍在10~100之間比較好
4.min_samples_split?:?(同決策樹)【重要】
????????這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少于設定值,則不會再繼續分裂。默認是2.如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則建議增大這個值。
5.min_samples_leaf?:(同決策樹)【重要】
????????這個值限制了葉子節點最少的樣本數,如果某葉子節點數目小于樣本數,則會和兄弟節點一起被剪枝。 默認是1,可以輸入最少的樣本數的整數,或者最少樣本數占樣本總數的百分比。如果樣本量不大,不需要管這個值。如果樣本量數量級非常大,則推薦增大這個值。
?【葉是決策樹的末端節點。 較小的葉子使模型更容易捕捉訓練數據中的噪聲。 一般來說,我更偏向于將最小葉子節點數目設置為大于50。在你自己的情況中,你應該盡量嘗試多種葉子大小種類,以找到最優的那個。】
【比如,設定為50,此時,上一個節點(100個樣本)進行分裂,分裂為兩個節點,其中一個節點的樣本數小于50個,那么這兩個節點都會被剪枝】
6.min_weight_fraction_leaf?:?(同決策樹)
????????這個值限制了葉子節點所有樣本權重和的最小值,如果小于這個值,則會和兄弟節點一起被剪枝。 默認是0,就是不考慮權重問題。一般來說,如果我們有較多樣本有缺失值,或者分類樹樣本的分布類別偏差很大,就會引入樣本權重,這時我們就要注意這個值了。【一般不需要注意】
7.max_features?:?(隨機森林獨有)【重要】
????????隨機森林允許單個決策樹使用特征的最大數量。選擇最適屬性時劃分的特征不能超過此值。
當為整數時,即最大特征數;當為小數時,訓練集特征數*小數;if “auto”, then max_features=sqrt(n_features).If “sqrt”, then max_features=sqrt(n_features).If “log2”, then max_features=log2(n_features).If None, then max_features=n_features.
【增加max_features一般能提高模型的性能,因為在每個節點上,我們有更多的選擇可以考慮。 然而,這未必完全是對的,因為它降低了單個樹的多樣性,而這正是隨機森林獨特的優點。 但是,可以肯定,你通過增加max_features會降低算法的速度。 因此,你需要適當的平衡和選擇最佳max_features。】
8.max_leaf_nodes:(同決策樹)
????????????????通過限制最大葉子節點數,可以防止過擬合,默認是"None”,即不限制最大的葉子節點數。如果加了限制,算法會建立在最大葉子節點數內最優的決策樹。如果特征不多,可以不考慮這個值,但是如果特征分成多的話,可以加以限制,具體的值可以通過交叉驗證得到。
【比如,一顆決策樹,如果不加限制的話,可以分裂100個葉子節點,如果設置此參數等于50,那么最多可以分裂50個葉子節點】
9.min_impurity_split:(同決策樹)
????????這個值限制了決策樹的增長,如果某節點的不純度(基于基尼系數,均方差)小于這個閾值,則該節點不再生成子節點。即為葉子節點 。一般不推薦改動默認值1e-7。
10.bootstrap=True(隨機森林獨有)
????????是否有放回的采樣,按默認,有放回采樣
11.?n_jobs=1:
????????并行job個數。這個在是bagging訓練過程中有重要作用,可以并行從而提高性能。1=不并行;n:n個并行;-1:CPU有多少core,就啟動多少job。
2、代碼簡單實現
(1)導入必要的庫
import pandas as pd
(2)數據讀取及預處理
data=pd.read_csv('./data/spambase.csv')x=data.iloc[:,:-1]
y=data.iloc[:,-1]
3、數據集劃分
from sklearn.model_selection import train_test_splitx_train,x_test,y_train,y_test= \train_test_split(x,y,test_size=0.2,random_state=2)
4、模型導入訓練
from sklearn.ensemble import RandomForestClassifierrf=RandomForestClassifier(n_estimators=100,max_features='auto',# max_leaf_nodes=50,random_state=4
)rf.fit(x_train,y_train)
5、模型效果預測
from sklearn import metrics# 自測
train_predicted=rf.predict(x_train)
print(metrics.classification_report(y_train,train_predicted))
# cm_plot(y_train,train_predicted)# 測試集test_predicted=rf.predict(x_test)
print(metrics.classification_report(y_test,test_predicted))
# cm_plot(y_test,test_predicted)
6、數據可視化
import matplotlib.pyplot as pltimportances=rf.feature_importances_
im=pd.DataFrame(importances,columns=['importances'])clos=data.columns
clos_1=clos.values
clos_2=clos_1.tolist()
clos=clos_2[0:-1]
im['clos']=closim=im.sort_values(by=['importances'],ascending=False)[:10]index=range(len(im))
plt.yticks(index,im.clos)
plt.barh(index,im['importances'])
plt.show()
7、最終效果