1. 程式人生 > >貸款逾期(7)---stacking

貸款逾期(7)---stacking

任務

【任務七-模型融合】用你目前評分最高的模型作為基準模型,和其他模型進行stacking融合,得到最終模型及評分。

Stacking

原理:Stacking模型本質上是一種分層的結構。

第一層

使用5-折交叉驗證,5折交叉驗證就是先拿出四折作為training data,另外一折作為testing data。

 

注意:在stacking中此部分資料會用到整個traing set。如:假設我們整個training set包含10000行資料,testing set包含2500行資料,那麼每一次交叉驗證其實就是對training set進行劃分,在每一次的交叉驗證中training data將會是8000行,testing data是2000行。

每一次的交叉驗證包含兩個過程,1. 基於training data訓練模型;2. 基於training data訓練生成的模型對testing data進行預測。在整個第一次的交叉驗證完成之後我們將會得到關於當前testing data的預測值,這將會是一個一維2000行的資料,記為a1。注意!在這部分操作完成後,我們還要對資料集原來的整個testing set進行預測,這個過程會生成2500個預測值,這部分預測值將會作為下一層模型testing data的一部分,記為b1。因為我們進行的是5折交叉驗證,所以以上提及的過程將會進行五次,最終會生成針對testing set資料預測的5列2000行的資料a1,a2,a3,a4,a5,對testing set的預測會是5列2500行資料b1,b2,b3,b4,b5。

在完成對Model1的整個步驟之後,我們可以發現a1,a2,a3,a4,a5其實就是對原來整個training set的預測值,將他們拼湊起來,會形成一個10000行一列的矩陣,記為A1。而對於b1,b2,b3,b4,b5這部分資料,我們將各部分相加取平均值,得到一個2500行一列的矩陣,記為B1。

第二層

以上就是stacking中一個模型的完整流程,stacking中同一層通常包含多個模型,假設還有Model2: LR,Model3:RF,Model4: GBDT,Model5:SVM,對於這四個模型,我們可以重複以上的步驟,在整個流程結束之後,我們可以得到新的A2,A3,A4,A5,B2,B3,B4,B5矩陣。

在此之後,我們把A1,A2,A3,A4,A5並列合併得到一個10000行五列的矩陣作為training data,B1,B2,B3,B4,B5並列合併得到一個2500行五列的矩陣作為testing data。讓下一層的模型,基於他們進一步訓練。

程式碼(調包)

#!/user/bin/env python
#-*- coding:utf-8 -*-
# @Time    : 2018/11/26 17:33
# @Author  : 劉
# @Site    : 
# @File    : Stacking2.py
# @Software: PyCharm
import pickle
import numpy as np
from sklearn import datasets
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingClassifier
from sklearn.externals import joblib
import warnings
warnings.filterwarnings("ignore")
iris = datasets.load_iris()
path = "E:/mypython/moxingxuexi/"
"""=====================================================================================================================
1 讀取特徵
"""
print("0 讀取特徵")
f = open(path + 'feature/V4.pkl', 'rb')
train, test, y_train,y_test= pickle.load(f)
f.close()
X, y = train, y_train

"""=====================================================================================================================
2 讀取模型
"""
print("1 讀取模型")
SVM_linear = joblib.load( path + "model/SVM_linear1.pkl")
SVM_poly = joblib.load( path + "model/SVM_poly1.pkl")
SVM_rbf = joblib.load( path + "model/SVM_rbf1.pkl")
SVM_sigmoid = joblib.load( path + "model/SVM_sigmoid1.pkl")
lg_120 = joblib.load( path + "model/lg_1.pkl")
DT = joblib.load( path + "model/DT1.pkl")
xgb_sklearn = joblib.load( path + "model/xgb_sklearn1.pkl")
lgb_sklearn = joblib.load( path + "model/lgb_sklearn1.pkl")
xgb = joblib.load( path + "model/xgb1.pkl")
lgb = joblib.load( path + "model/lgb1.pkl")

clf1 =SVM_linear
clf2 = lg_120
clf3 = DT
clf4 = SVM_rbf
clf5 = lgb_sklearn
lr = LogisticRegression()
sclf = StackingClassifier(classifiers=[clf1, clf2, clf3,clf4,clf5],meta_classifier=lgb_sklearn)

print('5-fold cross validation:\n')

for clf, label in zip([clf1, clf2, clf3,clf4,clf5 , sclf],
                      ['SVM_linear','lg_120','DT','SVM_rbf','lgb_sklearn','StackingClassifier']):
    scores = model_selection.cross_val_score(clf, X, y,cv=5, scoring='accuracy')
    print("Accuracy: %s (+/- %0.9f) [%s]"
          % (scores.mean(), scores.std(), label))