3.0 任务说明

用你目前评分最高的模型作为基准模型,和其他模型进行stacking融合,得到最终模型及评分果。

3.1 stacking模型融合

Stacking(有时候也称之为stacked generalization)是指训练一个模型用于组合(combine)其他各个模型。即首先我们先训练多个不同的模型,然后再以之前训练的各个模型的输出为输入来训练一个模型,以得到一个最终的输出。如果可以选用任意一个组合算法,那么理论上,Stacking可以表示上面提到的各种Ensemble方法。然而,实际中,我们通常使用单层logistic回归作为组合模型。

对于stacking的过程这篇文章我认为讲得比较清楚:

https://blog.csdn.net/qq_32742009/article/details/81366768

我这里再简要说明一下。首先说明一下,stacking可以看成两层结构,第一层结构的输出作为第二层的输入。

我们第一层以svm,lightgbm,xgboost为例,第二层以LR为例作一个讲解,假设训练集有15000个数据,测试集3000个数据,步骤如下:

(1)用svm作五折交叉训练,训练五次,每次将训练集划分为5份,其中一份作为验证集。

(2)每一次将验证集的预测值竖着组合在一起,5次的预测值分别为a1,a2,a3,a4,a5,假设a的大小都是3000*1,将这5个a值再竖着拼在一起,组成A1,A1的大小为15000*1。A1为上图中最后一个橙块。此时A1各个特征对应的标签设为Label_new。

(3)将每一次验证集得到的结果对Test Data作测试,假设每一次测试后产生2000*1的数据,那么五次验证后产生,5个2000*1的数据b1,b2,b3,b4,b5。b1,b2,b3,b4,b5各个位置相加后取平均值得到1个2000*1的数据B1。这个B1为上图中倒数第二个绿块。

(3)同理,将gbm和xgb五折交叉训练后的预测值竖着组成在一起,分别组成A2,A3。将他们对Test Data作预测,得到B2,B3。

(4)将A1,A2,A3横着合并得到一个15000行3列的矩阵A,将B1,B2,B3横着合并得到一个2000行3列的矩阵B。

(5)矩阵A即为新的训练集的特征,矩阵B即为新的测试集的特征。让下一层的模型,基于他们进一步训练。矩阵A的标签是上面步骤2个Label_new,矩阵B的标签即为原来测试集的标签。

我自己写的函数如下:

def Stacking(model,num_folds,x_train,y_train,x_test,y_test):    #输入的模型集合里最后一个模型用作stacking里第二层模型y_train=np.array(y_train)x_train_folds = []y_train_folds = []x_train_folds=np.array_split(x_train,num_folds)y_train_folds=np.array_split(y_train,num_folds)y_pred_A=[]y_pred_testseting_A=[]label_1=[]model_len=len(model)for i in range (0,model_len-1):y_pred_A.append([])y_pred_testseting_A.append([])for i in range (num_folds):            #五折交叉验证x_train_now=np.zeros((1,x_train.shape[1]))y_train_now=np.array([[0]])for k in range (5):   #这里的循环是为了将验证集组合在一块儿if(k!=i):x_train_now=np.vstack((x_train_now,x_train_folds[k]))y_train_folds[k]=y_train_folds[k].reshape(y_train_folds[k].shape[0],1)y_train_now=np.vstack((y_train_now,y_train_folds[k]))x_validation=x_train_folds[i]y_validation=y_train_folds[i]y_validation=y_validation.reshape((y_validation.shape[0],1))x_train_now=np.delete(x_train_now,0,0)   #由于之前vstack之前有1列0,现在需要删除。y_train_now=np.delete(y_train_now,0,0)        for model_nums in range(0,model_len-1):model[model_nums].fit(x_train_now,y_train_now)label_1.append(y_validation)for j in range(0,model_len-1):y_pred_A[j].append ( model[j].predict(x_validation))y_pred_testseting_A[j].append(model[j].predict(x_test))y_pred_A[j][i]=y_pred_A[j][i].reshape((y_pred_A[j][i].shape[0],1))y_pred_testseting_A[j][i]=y_pred_testseting_A[j][i].reshape((y_pred_testseting_A[j][i].shape[0],1))A=[]   # A里面装博客里写的A1,A2,A3矩阵B=[]   #B里面装博客里写的B1,B2..矩阵for i in range(0,model_len-1):A.append([])B.append([])for j in range(0,model_len-1):y_preds=np.array([[0]])for i in range(num_folds):y_preds=np.vstack((y_preds,y_pred_A[j][i]))#将5次预测出来的标签组在一起。y_preds=np.delete(y_preds,0,0)A[j].append(y_preds.copy())B1=np.zeros((x_test.shape[0],1))for i in range(num_folds):B1=B1+y_pred_testseting_A[j][i]B[j].append(B1/num_folds)x_train_new=np.zeros((A[0][0].shape[0],1))x_test_new=np.zeros((B[0][0].shape[0],1))label_layer1=np.array([[0]])for i in range(0,model_len-1):A_now=np.array(A[i]).reshape((A[0][0].shape[0],1))B_now=np.array(B[i]).reshape((B[0][0].shape[0],1))x_train_new=np.hstack((x_train_new,A_now))x_test_new=np.hstack((x_test_new,B_now))x_train_new=np.delete(x_train_new,0,1)x_test_new=np.delete(x_test_new,0,1)                          #第二层的训练集和测试集特征for i in range(num_folds):              print(label_1[i].shape)label_layer1=np.vstack((label_layer1,label_1[i]))         #第二层训练集标签label_layer1=np.delete(label_layer1,0,0)y_train_new=label_layer1.copy()y_test_new=y_test.copy()y_test_new=np.array(y_test_new)y_test_new=y_test_new.reshape((y_test_new.shape[0]))model[model_len-1].fit(x_train_new,y_train_new)r,recall,precision,F1,auc=evaluate(model[model_len-1],x_test_new,y_test_new)print(r,recall,precision,F1,auc)

我将逻辑回归、lightgbm,rfc,gbdt作为第一层,xgboost作为第二层,代码和结果如下:

Xgb = xgb.XGBClassifier()
gbdt=GradientBoostingClassifier()
gbm = lgb.LGBMClassifier()
rfc = RandomForestClassifier()
Dtree = tree.DecisionTreeClassifier()
svm = SVC(probability=True)
lr = LogisticRegressionCV()
models=[]
models.append(rfc);models.append(gbdt);models.append(gbm);models.append(lr);models.append(Xgb)
Stacking(models,5,x_train,y_train,x_test,y_test)

3.1 stacking接口

自己写完函数才发现,在mlxtend包里有stacking接口,安装直接pip即可:

pip install mlxtend。

StackingClassifier 使用API及参数解析:
StackingClassifier(classifiers, meta_classifier, use_probas=False, average_probas=False, verbose=0, use_features_in_secondary=False)
参数:
classifiers : 基分类器,数组形式,[cl1, cl2, cl3]. 每个基分类器的属性被存储在类属性 self.clfs_.
meta_classifier : 目标分类器,即将前面分类器合起来的分类器
use_probas : bool (default: False) ,如果设置为True, 那么目标分类器的输入就是前面分类输出的类别概率值而不是类别标签
average_probas : bool (default: False),用来设置上一个参数当使用概率值输出的时候是否使用平均值。
verbose : int, optional (default=0)。用来控制使用过程中的日志输出,当 verbose = 0时,什么也不输出, verbose = 1,输出回归器的序号和名字。verbose = 2,输出详细的参数信息。verbose > 2, 自动将verbose设置为小于2的,verbose -2.
use_features_in_secondary : bool (default: False). 如果设置为True,那么最终的目标分类器就被基分类器产生的数据和最初的数据集同时训练。如果设置为False,最终的分类器只会使用基分类器产生的数据训练。

属性:
clfs_ : 每个基分类器的属性,list, shape 为 [n_classifiers]。
meta_clf_ : 最终目标分类器的属性

方法:
fit(X, y)
fit_transform(X, y=None, fit_params)
get_params(deep=True),如果是使用sklearn的GridSearch方法,那么返回分类器的各项参数。
predict(X)
predict_proba(X)
score(X, y, sample_weight=None), 对于给定数据集和给定label,返回评价accuracy
set_params(params),设置分类器的参数,params的设置方法和sklearn的格式一样

代码如下:

from mlxtend.classifier import StackingClassifiersclf = StackingClassifier(classifiers=[rfc, gbdt, gbm,lr], use_probas=True,average_probas=False,meta_classifier=Xgb)
re = sclf.fit(x_train, y_train)
evaluate(re,x_test,y_test)

结果:

将stacking模型和其他模型写一起对比,代码如下(预处理见前两篇文章):

import csv
import os
import numpy as np
import random
import requests
import pandas as pd
import matplotlib.pyplot as plt
import sklearn
from sklearn.linear_model import LogisticRegressionCV,LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn import metrics
from sklearn.svm import SVC
from sklearn import tree
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import GradientBoostingClassifier
import xgboost as xgb
from xgboost import plot_importance
import lightgbm as lgb
from mlxtend.classifier import StackingClassifierdef evaluate(re,x_test,y_test):    #单个模型评估r = re.score(x_test,y_test)y_pred = re.predict(x_test)    #测试数据预测值cmat=metrics.confusion_matrix(y_test, y_pred)  #混淆矩阵y_scores=re.predict_proba(x_test) #预测出来的得分,有两列,第一列为此值为0的概率,第二列为此值为1的概率y_scores=y_scores[:,1]  #我们这里只需要预测为1的概率recall=metrics.recall_score(y_test, y_pred)   #查全率precision=metrics.precision_score(y_test,y_pred)  #查准率F1=metrics.f1_score(y_test,y_pred)auc=metrics.roc_auc_score(y_test, y_scores)  #auc值return r,recall,precision,F1,aucdef evaluateAll(models,x_test,y_test):   #所有模型评估length=len(models) #模型个数r=np.zeros((length));recall=np.zeros((length));precision=np.zeros((length));F1=np.zeros((length));auc=np.zeros((length))evaluates=np.zeros((length,5))   #装所有的指标for i in range(length):r[i],recall[i],precision[i],F1[i],auc[i]=evaluate(models[i],x_test,y_test)evaluates[i][0]=r[i];evaluates[i][1]=recall[i];evaluates[i][2]=precision[i];evaluates[i][3]=F1[i];evaluates[i][4]=auc[i];return r,recall,precision,F1,auc,evaluatesdef drawROC(re,x_test,y_test,title):   #单个模型画ROCy_scores=re.predict_proba(x_test) #预测出来的得分,有两列,第一列为此值为0的概率,第二列为此值为1的概率y_scores=y_scores[:,1]  #我们这里只需要预测为1的概率fpr, tpr, thresholds=metrics.roc_curve(y_test,y_scores,pos_label=None,sample_weight=None,drop_intermediate=True)auc=metrics.auc(fpr,tpr)plt.plot(fpr,tpr,marker = 'o',label='AUC:{a:0.2f}'.format(a=auc))plt.legend(loc="lower right")plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title(title)plt.show()def drawAllROC(models,models_name,x_test,y_test,title):   #画所有的ROC曲线nums=len(models) #模型个数y_scores0=[]    y_scores=[]for i in range(nums):y_scores0.append(models[i].predict_proba(x_test)) #预测出来的得分,有两列,第一列为此值为0的概率,第二列为此值为1的概率   y_scores.append(y_scores0[i][:,1])  #我们这里只需要预测为1的概率fpr0, tpr0, thresholds0=metrics.roc_curve(y_test,y_scores[0],pos_label=None,sample_weight=None,drop_intermediate=True)fpr=[]tpr=[]thresholds=[]auc=[]plt.figure()plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')for i in range(nums):fpr.append((metrics.roc_curve(y_test,y_scores[i],pos_label=None,sample_weight=None,drop_intermediate=True))[0])tpr.append((metrics.roc_curve(y_test,y_scores[i],pos_label=None,sample_weight=None,drop_intermediate=True))[1])thresholds.append((metrics.roc_curve(y_test,y_scores[i],pos_label=None,sample_weight=None,drop_intermediate=True))[2])auc.append(metrics.auc(fpr[i],tpr[i]))plt.plot(fpr[i],tpr[i],label='{0} (AUC:{1:0.2f})'.format(models_name[i], auc[i]))plt.legend(loc="lower right")plt.xlabel('False Positive Rate')plt.ylabel('True Positive Rate')plt.title(title)plt.show()
#-------------------------------------划分数据----------------------------------------#x_train, x_test,y_train,y_test= train_test_split(X, y, test_size=0.3,random_state=2018)   #数据集三七分,随机种子2018
#-------------------------------------数据标准化----------------------------------------#
ss = StandardScaler()
x_train = ss.fit_transform(x_train) #数据标准化
x_test = ss.fit_transform(x_test) #数据标准化#-------------------------------------logstic----------------------------------------#
lr = LogisticRegressionCV()
lr.fit(x_train,y_train)
#-------------------------------------svm-----------------------------------------#
svm = SVC(probability=True)
svm.fit(x_train,y_train)
#-------------------------------------tree-----------------------------------------#Dtree = tree.DecisionTreeClassifier()Dtree.fit(x_train, y_train)
#-------------------------------------随机森林-----------------------------------------#rfc = RandomForestClassifier()
rfc.fit(x_train, y_train)#-------------------------------------gbdt-----------------------------------------#
gbdt=GradientBoostingClassifier()
gbdt.fit(x_train, y_train)#-------------------------------------XGBoost-----------------------------------------#Xgb = xgb.XGBClassifier()
Xgb.fit(x_train, y_train)
#-------------------------------------lightgbm-----------------------------------------#
gbm = lgb.LGBMClassifier()
gbm.fit(x_train, y_train)#-------------------------------------Stacking-----------------------------------------#sclf = StackingClassifier(classifiers=[rfc, gbdt, gbm,lr], use_probas=True,average_probas=False,meta_classifier=Xgb)
sclf.fit(x_train, y_train)#---------------------------模型评估-----------------------------#
models=[]
models.append(lr);models.append(svm);models.append(Dtree);models.append(rfc);models.append(gbdt);models.append(Xgb);models.append(gbm);models.append(sclf)
models_name=['LR','SVM','TREE','RFC','GBDT','XGBoost','LightGBM','sclf']r,recall,precision,F1,auc,evaluates=evaluateAll(models,x_test,y_test)
for i in range(len(models)):print(models_name[i],evaluates[i])
drawAllROC(models,models_name,x_test,y_test,"all")

结果:

【机器学习-贷款用户逾期情况分析2】3.stacking模型融合相关推荐

  1. ML实操 - 贷款用户逾期情况分析

    目录 任务描述 实现过程 基本思路 1. 数据集预览 2. 数据预处理 3. 特征工程 4. 模型选择 4.1 数据及划分及数据归一化 4.2 LR 4.3 SVM 4.4 决策树 4.5 Xgboo ...

  2. ML - 贷款用户逾期情况分析5 - 特征工程2(特征选择)

    文章目录 特征选择 (判定贷款用户是否逾期) 1. IV值进行特征选择 1.1 基本介绍 1.2 计算公式 2. 随机森林进行特征选择 2.1 平均不纯度减少 mean decrease impuri ...

  3. ML - 贷款用户逾期情况分析2 - 特征工程1(数据预处理)

    文章目录 数据预处理 (判定贷款用户是否逾期) 1. 删除无用特征 2. 数据格式化 - X_date 3. 数据处理 - 类别特征 X_cate 4. 数据处理 - 其他非数值型特征 5. 数据处理 ...

  4. ML - 贷款用户逾期情况分析6 - Final

    文章目录 思路 1. 导入数据 2. 性能评估函数 3. 模型优化 3.1 LR模型 3.2 SVM模型 3.3 决策树模型 3.4 XGBoost模型 3.5 LightGBM模型 3.6 模型融合 ...

  5. 机器学习 scikit-learn8 - 预测贷款用户是否会逾期 - Stacking模型融合【调包】

    Stacking模型融合 1 简介 2 模型融合的原理 2.1 StackingClassifier 概述 2.2 StackingCVClassifier 概述 3 代码使用方法 4 核心代码说明 ...

  6. 贷款用户逾期问题Task4

    贷款用户逾期问题Task4 任务4 - 模型评估(2天) 评估 任务4 - 模型评估(2天) 任务4:记录5个模型(逻辑回归.SVM.决策树.随机森林.XGBoost)关于accuracy.preci ...

  7. 贷款用户逾期问题Task3

    贷款用户逾期问题Task3 任务3 - 建模(2天) 逻辑回归LR 支持向量机SVM 决策树 任务3 - 建模(2天) 用逻辑回归.svm和决策树:随机森林和XGBoost进行模型构建,评分方式任意, ...

  8. 数据挖掘实践(金融风控-贷款违约预测)(五):模型融合

    数据挖掘实践(金融风控-贷款违约预测)(五):模型融合 目录 数据挖掘实践(金融风控-贷款违约预测)(五):模型融合 1.引言 2.模型融合的方式 2.1 Voting/Averaging 2.2 B ...

  9. B.数据挖掘机器学习[五]---汽车交易价格预测详细版本{模型融合(Stacking、Blending、Bagging和Boosting)}

    [机器学习入门与实践]入门必看系列,含数据挖掘项目实战:数据融合.特征优化.特征降维.探索性分析等,实战带你掌握机器学习数据挖掘 专栏详细介绍:[机器学习入门与实践]合集入门必看系列,含数据挖掘项目实 ...

最新文章

  1. git找回误删的文件
  2. python读取内存和空闲内存
  3. python界面设计实例-Python GUI项目实战(二)主窗体的界面设计与实现
  4. MySQL InnoDB存储引擎
  5. 学习Duwamish7的MSDN说明及相关技术策略
  6. libcareplus支持的补丁类型
  7. 2008已经到来,我们怎能原地踏步!
  8. mysql无法识别双引号_sqlite3迁移mysql问题集合攻略
  9. [转]SQL SERVER数据库开发之触发器的应用
  10. DataList 编辑记录时,更新取不到值的原因。
  11. xml文件查看器_万能文件查看器,一个软件打开电脑所有文件
  12. 关键词选择与维护教程
  13. 《宽带与接入网技术》接入网的基本概念
  14. 学习要趁早年轻要挣钱
  15. 无线网DNS服务器有错误,关于dns错误的原因和解决办法
  16. 迅雷极速版下载被迅雷屏蔽资源
  17. 【2017年中总结】——半饱
  18. 架构师小跟班:SSL证书免费申请及部署,解决页面样式错乱问题完整攻略
  19. ArcGIS地面粗糙度提取
  20. 一款MS SQL查询分析工具(1.3M)

热门文章

  1. 生产签名进行 Base64 编码
  2. HHUOJ 1727 进制转换2
  3. 2021年PHP-Laravel面试题
  4. MediaPlayer创建播放列表实现自动循环播放
  5. 台湾海峡隧道三条规划线路集体加速
  6. 《程序设计基础》 第十章 函数与程序结构 7-1 圆形体体积计算器 (20 分)
  7. flash as游戏制作 - 射击游戏
  8. 物流快递APP开发简单介绍
  9. 计算机音乐算法冯,恒模算法
  10. 如何系统地自学计量经济学?