1. 程式人生 > >泰坦尼克號資料探勘專案實戰——Task7 模型融合

泰坦尼克號資料探勘專案實戰——Task7 模型融合

參考:

【1】https://blog.csdn.net/qq_39422642/article/details/78566763

【2】https://blog.csdn.net/u014356002/article/details/54376138

【3】https://blog.csdn.net/junxinwoxin/article/details/80407917

【4】https://blog.csdn.net/jiaoyangwm/article/details/81186509

【5】https://zhuanlan.zhihu.com/p/30538352

【6】https://blog.csdn.net/m0_37725003/article/details/81095555

      之前在task4 模型整合的時候簡單介紹過模型融合,這次又查到了一點資料,所以再來補充一丟丟。

    模型融合:把獨立的學習器組合起來的結果。如果獨立的學習器為同質,稱為基學習器(都為SVM或都為LR);如果獨立的學習器為異質,稱為組合學習器(將SVM+LR組合)。

    為什麼要進行模型融合:將幾個獨立學習器的結果求平均,在統計、計算效率、效能表現上都有較好的效果。

  1. 統計上:假設空間中幾個學習器的假設函式的平均更接近真實的假設f
  2. 計算上:迭代求解可能落入區域性最優解,但是多個區域性最優解的平均更接近全域性最優解,損失函式有可能不是光滑的,不同的初始點和學習率可能有不同的區域性最小,將其平均能得到更好的。
  3. 效能表現上:真實的假設函式f可能不在已知的假設空間H內,學習器的平均更可能接近H外的真實假設H,如果模型本身就不具備表達場景的能力,那麼無論怎麼搜尋H都不會搜到。

 

1.Bagging

從特徵,引數,樣本的多樣性差異性來做多模型融合,參考隨機森林。

2.Stacking

將訓練集劃分為兩個正交集D1(x,y),D2(x’,y’),利用D1來學習三個模型,假設分別為LR,SVM,DT,
利用第二份資料D2的x分別作為第一層學到的三個模型的輸入,得到預測值y1,y2,y3,將其組合可以得到預估的輸出y^y^
已有真實輸出的標籤y’,可以學習到如何從預估的y^y^,來學習如何得到真實的y。
第一層的資料:為了訓練得到三個模型第二層的資料:為了用三個模型來預測輸出,得到的輸入送入線性分類器得到最終的預估y^y^,再不斷的訓練模型使得模型的預估和真實的y′y′最接近,之所以將資料分成兩組,是為了避免過擬合。
 也可以參見下圖的例子:

stacking在第一層模型中通過交叉驗證的方式生成預測的label,作為第二層線性模型的輸入特徵(第一層有幾個模型第二層就有幾個特徵),一般模型差異越大融合效果越好。實際中也可以將預測的幾個label特徵加入到原始特徵中,然後用複雜模型再次訓練。 


這裡寫圖片描述

blending和stacking的比較:

blending是將train劃分為2份不相交的資料,一份用來訓練生成新的特徵,並將其加入到第二層繼續訓練,第二層只用到了部分資料;
stacking將train進行cv劃分來訓練。第二層用到了第一層的全部資料,並且需要訓練大量的模型。

3.Adaboost

4、Gradient Boosting Tree

解決迴歸問題

通過不斷的擬合預測和真實的殘差來學習,也就是每次迭代儘量擬合損失函式在當前情況下的負梯度,構建的樹是能使得損失函式降低最多的學習器,來解決迴歸問題,調整後也能解決分類問題。


   好啦,接下來是本次task的程式碼部分:

1. Bagging 方法,即投票法,使用sklearn.ensemble中的VotingClassifier。

#### task7 模型融合
# 1 Bagging法,使用sklearn.ensemble中的VotingClassifier
from sklearn.ensemble import VotingClassifier

clf_vc = VotingClassifier(estimators=[('lr',LogisticRegression()),('DTree',DecisionTreeClassifier()),('RTree',RandomForestClassifier()),('svm',SVC()), ('xgb', XGBClassifier())])
clf_vc.fit(train_X,target_Y)
print(clf_vc.score(train_X, target_Y))

2. Stacking 方法,使用mlxtend.classifier中的StackingCVClassifier

ps:自己總是忘記SVC()內要賦值true。使用前要安裝庫 mlxtend。

svm=SVC(probability=True);

# 2 Stacking法
from mlxtend.classifier import StackingCVClassifier
sclf = StackingCVClassifier(classifiers=[lr,DTree,RTree,svm], meta_classifier= xgb, use_probas=True)
sclf.fit(train_X.values,target_Y.values)
print(sclf.score(train_X, target_Y))

同樣的資料,投票法的結果更好些,可能是因為資料量小,所以Stacking並不佔優勢。