【算法7】集成算法

    集成算法最強的目的就是考慮多個評估器的建模結果,彙總之後得到一個綜合的結果,以此來獲取比單個模型更好的迴歸或分類表現。多個模型集成成爲的模型叫做集成評估器(ensembleestimatorensemble estimator),組成集成評估器的每個模型都叫做基評估器(baseestimatorbase estimator)。通常來說有三類集成算法:裝袋法(BaggingBagging),提升法(BoostingBoosting)和stackingstacking。這裏重點說說BaggingBaggingBoostingBoosting。文中部分內容參考菊安醬的機器學習內容。

1 裝袋法(BaggingBagging

    又稱自主聚集(bootstrap aggregating),是一種根據均勻概率分佈從數據集中重複抽樣(有放回的)的技術。每個新數據集和原始數據集的大小相等。由於新數據集中的每個樣本都是從原始數據集中有放回的隨機抽樣出來的,所以新數據集中可能有重複的值,而原始數據集中的某些樣本可能根本就沒出現在新數據集中。
    在使用袋裝法時要求基評估器要儘量獨立。其實,袋裝法還有另一個必要條件:基分類器的判斷準確率至少要超過隨機分類器。
    baggingbagging方法的代表算法是隨機森林,準確的來說,隨機森林是baggingbagging的一個特化進階版,所謂的特化是因爲隨機森林的弱學習器都是決策樹。所謂的進階是隨機森林在baggingbagging的樣本隨機採樣基礎上,又加上了特徵的隨機選擇,其基本思想沒有脫離baggingbagging的範疇。

1.1使用python—sklearn實現隨機森林分類器

    隨機森林分類器(RandomForestClassifierRandomForestClassifier):

class sklearn.ensemble.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)
參數 含義
n_estimators 這是森林中樹木的數量,即基評估器的數量。這個參數對隨機森林模型的精確性影響是單調的,n_estimators越大,模型的效果往往越好。
criterion 不純度的衡量指標,有基尼係數和信息熵兩種選擇
max_depth 樹的最大深度,超過最大深度的樹枝都會被剪掉
min_samples_leaf 一個節點在分枝後的每個子節點都必須包含至少min_samples_leaf個訓練樣本,否則分枝就不會發生
min_samples_split 一個節點必須要包含至少min_samples_split個訓練樣本,這個節點才允許被分枝,否則分枝就不會發生
max_features max_features限制分枝時考慮的特徵個數,超過限制個數的特徵都會被捨棄,默認值爲總特徵個數開平方取整
min_impurity_decrease 限制信息增益的大小,信息增益小於設定數值的分枝不會發生

    代碼:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split

#切分訓練集和測試集
Xtrain, Xtest, Ytrain, Ytest =
train_test_split(wine.data,wine.target,test_size=0.3)
#建立模型
clf = DecisionTreeClassifier(random_state=0)
rfc = RandomForestClassifier(random_state=0)
clf = clf.fit(Xtrain,Ytrain)
rfc = rfc.fit(Xtrain,Ytrain)
#查看模型效果
score_c = clf.score(Xtest,Ytest)
score_r = rfc.score(Xtest,Ytest)
#打印最後結果
print("Single Tree:",score_c)
print("Random Forest:",score_r)

1.2使用python—sklearn實現隨機森林迴歸器

    隨機森林迴歸器(RandomForestRegressorRandomForestRegressor):

class sklearn.ensemble.RandomForestRegressor (n_estimators=’warn’, criterion=’mse’,
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)

    所有的參數,屬性與接口,全部和隨機森林分類器一致。僅有的不同就是迴歸樹與分類樹的不同,不純度的指標,參數Criterion不一致。
    重要參數:

*參數 含義
criterion 輸入"mse"使用均方誤差mean squared error(MSE),父節點和葉子節點之間的均方誤差的差額將被用來作爲特徵選擇的標準,這種方法通過使用葉子節點的均值來最小化L2損失;輸入“friedman_mse”使用費爾德曼均方誤差,這種指標使用弗裏德曼針對潛在分枝中的問題改進後的均方誤差;輸入"mae"使用絕對平均誤差MAE(mean absolute error),這種指標使用葉節點的中值來最小化L1損失

    最重要的屬性和接口,都與隨機森林的分類器相一致,還是apply, fit, predict和score最爲核心。值得一提的是,隨機森林迴歸並沒有predict_proba這個接口,因爲對於迴歸來說,並不存在一個樣本要被分到某個類別的概率問題,因此沒有predict_proba這個接口。
    代碼:

from sklearn.datasets import load_boston
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestRegressor
boston = load_boston()
regressor = RandomForestRegressor(n_estimators=100,random_state=0)
cross_val_score(regressor, boston.data, boston.target, cv=10
,scoring = "neg_mean_squared_error")
#查看所有可以用的評估指標
sorted(sklearn.metrics.SCORERS.keys())

2 提升法(BoostingBoosting

    boosting是一個迭代的過程,用來自適應地改變訓練樣本的分佈,使得弱分類器聚焦到那些很難分類的樣本上。它的做法是給每一個訓練樣本賦予一個權重,在每一輪訓練結束時自動地調整權重,代表算法有AdaBoost等。

2.1 使用python—sklearn實現AdaBoost分類器

    AdaBoost分類器(AdaBoostClassifierAdaBoostClassifier):

class sklearn.ensemble.``AdaBoostClassifier (base_estimator = None,n_estimators = 50
learning_rate = 1.0,algorithm ='SAMME.R',random_state = None 

    核心參數:
在這裏插入圖片描述
    弱分類器參數:
在這裏插入圖片描述

    代碼:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_gaussian_quantiles

bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=2,
min_samples_split=20,
min_samples_leaf=5)
,algorithm="SAMME",n_estimators=200, learning_rate=0.8)
bdt.fit(X, y)

2.1 使用python—sklearn實現AdaBoost迴歸器

    核心參數:
在這裏插入圖片描述
    弱分類器參數和迴歸器一樣。
    代碼:

#導入所需的模塊和包
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import AdaBoostRegressor
#創造數據集
rng = np.random.RandomState(1)
X = np.linspace(0, 6, 100).reshape(-1,1)
y = np.sin(X).ravel() + np.sin(6 * X).ravel() + rng.normal(0, 0.1, X.shape[0])
#訓練迴歸模型
regr_1 = DecisionTreeRegressor(max_depth=4)
regr_2 = AdaBoostRegressor(DecisionTreeRegressor(max_depth=4),
n_estimators=300, random_state=rng)
regr_1.fit(X, y)
regr_2.fit(X, y)
#預測結果
y_1 = regr_1.predict(X)
y_2 = regr_2.predict(X)

3 小結

    上面介紹了裝代法、提升法兩個集成算法的代表:baggingbaggingAdaBoostAdaBoost,這裏在總結對比一下他們的特點。
在這裏插入圖片描述
    落花生對集成算法的框架、python實現在這裏就粗狂的介紹完了。當然,集成算法如此高大上的機器學習神器不是這樣就能被描述清楚的,後面我肯定會進一步細化,呈給各位小主檢閱… …

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章