6. 整合學習&隨機森林

柏林牆發表於2020-10-26

1. 整合學習

  • 思想:基於不同演算法,算出不同的結果,對每一個值投票選擇多數的那個作為結果,比如對一個值預測三種演算法分別為:0,1,0,此時選擇0作為預測結果

1. hard voting: 少數服從多數,

from sklearn.ensemble import VotingClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier

voting_clf = VotingClassifier(
    estimators=[
        ('logic', LogisticRegression()),
        ('svm', SVC()),
        ('dtc', DecisionTreeClassifier())
    ],
    voting='hard'
)

voting_clf.fit(x_train, y_train)
voting_clf.score(x_test, y_test)

2. soft voting:考慮權重、概率相加:

要求每一個模型都能估計概率 predict_proba

SVC中的probability

from sklearn.ensemble import VotingClassifier

voting_soft = VotingClassifier(
    estimators=[
        ('logic', LogisticRegression()),
        ('svm', SVC(probability=True)),   # 對於SVM需要開啟probability概率
        ('dt', DecisionTreeClassifier(random_state=666))
    ],
    voting='soft'
)

voting_soft.fit(x_train, y_train)
voting_soft.score(x_test, y_test)

3. 子模型

  • 雖然機器學習方法很多,但是投票角度還是較少,需要更多的子模型,子模型準確率不需要太高,但是子模型之間不能一致,需要有差異性
  • 建立差異性:每個子模型是同一種模型的對不同樣本資料處理,比如500個樣本,每一個子模型隨機(放回Bagging或不放回Pasting)抽取100個,
from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier

# 使用bagging建立子模型,傳入模型方法,n_estimators為子模型個數,隨機抽取的樣本數量max_samples,放回的隨機抽取為bootstrap=True, 使用n_jobs平行計算各個隨機抽樣
bagging_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500, max_samples=100, bootstrap=True, n_jobs=-1)
bagging_clf.fit(x_train, y_train)
bagging_clf.score(x_test, y_test)
  • 但是對於放回的隨機抽樣,平均大約有37%的樣本沒有被取到,不單獨劃分測試資料集,直接使用剩下的沒有取到的37%樣本作為測試資料集,oob_score=True
bagging_clf3 = BaggingClassifier( DecisionTreeClassifier(), n_estimators=500, max_samples=100, bootstrap=True, oob_score=True )
bagging_clf3.fit(x, y)
bagging_clf3.oob_score_
  • 針對Bagging的深入:針對特徵隨機取樣:max_features=10(最多的特徵隨機取樣), bootstrap_features=True 特徵也是放回取樣

2. 隨機森林和Extra-Trees

  • 隨機森林:在決策樹節點劃分上,隨機生成多個樹
from sklearn.ensemble import RandomForestClassifier

rf_clf = RandomForestClassifier(n_estimators=500, bootstrap=True, oob_score=True, n_jobs=-1)
rf_clf.fit(x, y)
rf_clf.oob_score_
  • Extra-Trees: 決策樹在節點劃分上,使用隨機的特徵和隨機的閾值,提供了額外的隨機性,抑制過擬合,但增加了bias,具有更快的訓練速度
from sklearn.ensemble import ExtraTreesClassifier

et_clf = ExtraTreesClassifier(n_estimators=500, bootstrap=True, oob_score=True, n_jobs=-1,max_leaf_nodes=16)
et_clf.fit(x, y)
et_clf.oob_score_

3. Boosting

整合多個模型,每一個模型都在增強Boosting整體的效果

  • Ada Boosting

每一輪都是對上一輪沒有擬合好的資料賦值較高權重,使得在當前輪能夠擬合上一輪沒有擬合好的資料,不斷的整合

  • Gradient Boosting

每一次訓練都針對上次產生錯誤的資料子集訓練

from sklearn.ensemble import GradientBoostingClassifier

gb_clf = GradientBoostingClassifier(n_estimators=500)
gb_clf.fit(x_train, y_train)
gb_clf.score(x_test, y_test)
  • 使用Boosting解決迴歸問題
from sklearn.ensemble import AdaBoostRegressor
from sklearn.ensemble import GradientBoostingRegressor

相關文章