金融风控TASK5_风控m0-程序员宅基地

技术标签: 数据分析  机器学习  


模型融合是指将一组不同的模型以合适的方法组合在一起,进而能够让组合模型获得更好的表现。

5.1 平均法

对于一个回归问题而言,假如存在三种不同的模型,各自有着不同的预测结果。一种朴素的思路是将折三个不同的模型的进行简单平均,得到一个新的预测值。进一步,可以尝试调整各个模型的的权重来获得不同的线性组合。将不同模型通过线性组合的方式组合到一起,往往能够比原先的单个模型具有更好的效果。

5.1.1 简单平均

简单加权平均,结果直接融合 求多个预测结果的平均值。

5.1.2 加权平均法

加权平均法 一般根据之前预测模型的准确率,进行加权融合,将准确性高的模型赋予更高的权重。

5.2投票

以分类任务为例,假设存在多个不同的模型,多个模型具有不同的分类结果。对于一个对象而言,最终的分类结果可以采用投票最多的类为最终的预测结果。

5.3 综合法

a. 排序融合
b. log融合

5.4 stacking

Stacking模型的本质是一种分层的结构,用了大量的基分类器,将其预测的结果作为下一层输入的特征,这样的结构使得它比相互独立训练模型能够获得更多的特征。
在这里插入图片描述
如图:图中有五个基分类器,将数据分别放入其中进行训练然后得到预测结果,再将得到的五个预测结果作为模型六的输入特征再次进行训练,得到最终结果。但是由于直接由五个基学习器获得结果直接带入模型六中,容易导致过拟合,因此在使用五个及以上模型进行训练的时候,使用k折交叉验证。

5.5 blending

blending是将预测的值作为新的特征和原特征合并,构成新的特征值,用于预测。为了防止过拟合,将数据分为两部分d1、d2,使用d1的数据作为训练集,d2数据作为测试集。预测得到的数据作为新特征使用d2的数据作为训练集结合新特征,预测测试集结果。
在这里插入图片描述
stacking与blending区别:
a. stacking
(1)stacking中由于两层使用的数据不同,所以可以避免信息泄露的问题。
(2)在组队竞赛的过程中,不需要给队友分享自己的随机种子。
b. Blending
(1)blending比stacking简单,不需要构建多层模型。
(2)由于blending对将数据划分为两个部分,在最后预测时有部分数据信息将被忽略。
(3)同时在使用第二层数据时可能会因为第二层数据较少产生过拟合现象。

5.6 代码示例

// 简单投票
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=4, min_child_weight=2,
subsample=0.7,objective='binary:logistic')
vclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('xgb', clf3)])
vclf = vclf .fit(x_train,y_train)
print(vclf .predict(x_test))

#加权投票
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, VotingClassifier
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=4, min_child_weight=2,
subsample=0.7,objective='binary:logistic')
vclf = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('xgb', clf3)],
voting='soft', weights=[2, 1, 1])
vclf = vclf .fit(x_train,y_train)
print(vclf .predict(x_test))

#stacking
import warnings
warnings.filterwarnings('ignore')
import itertools
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib.gridspec as gridspec
from sklearn import datasets
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.model_selection import cross_val_score, train_test_split
from mlxtend.plotting import plot_learning_curves
from mlxtend.plotting import plot_decision_regions
# 以python自带的鸢尾花数据集为例
iris = datasets.load_iris()
X, y = iris.data[:, 1:3], iris.target
clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = GaussianNB()
lr = LogisticRegression()
sclf = StackingClassifier(classifiers=[clf1, clf2, clf3],
meta_classifier=lr)
label = ['KNN', 'Random Forest', 'Naive Bayes', 'Stacking Classifier']
clf_list = [clf1, clf2, clf3, sclf]
fig = plt.figure(figsize=(10,8))
gs = gridspec.GridSpec(2, 2)
grid = itertools.product([0,1],repeat=2)
clf_cv_mean = []
clf_cv_std = []
for clf, label, grd in zip(clf_list, label, grid):
scores = cross_val_score(clf, X, y, cv=5, scoring='accuracy')
print("Accuracy: %.2f (+/- %.2f) [%s]" %(scores.mean(), scores.std(), label))
clf_cv_mean.append(scores.mean())
clf_cv_std.append(scores.std())
clf.fit(X, y)
ax = plt.subplot(gs[grd[0], grd[1]])
fig = plot_decision_regions(X=X, y=y, clf=clf)
plt.title(label)
plt.show()

#blending
# 以python自带的鸢尾花数据集为例
data_0 = iris.data
data = data_0[:100,:]


target_0 = iris.target
target = target_0[:100]
 
#模型融合中基学习器
clfs = [LogisticRegression(),
        RandomForestClassifier(),
        ExtraTreesClassifier(),
        GradientBoostingClassifier()]
 
#切分一部分数据作为测试集
X, X_predict, y, y_predict = train_test_split(data, target, test_size=0.3, random_state=914)


#切分训练数据集为d1,d2两部分
X_d1, X_d2, y_d1, y_d2 = train_test_split(X, y, test_size=0.5, random_state=914)
dataset_d1 = np.zeros((X_d2.shape[0], len(clfs)))
dataset_d2 = np.zeros((X_predict.shape[0], len(clfs)))
 
for j, clf in enumerate(clfs):
    #依次训练各个单模型
    clf.fit(X_d1, y_d1)
    y_submission = clf.predict_proba(X_d2)[:, 1]
    dataset_d1[:, j] = y_submission
    #对于测试集,直接用这k个模型的预测值作为新的特征。
    dataset_d2[:, j] = clf.predict_proba(X_predict)[:, 1]
    print("val auc Score: %f" % roc_auc_score(y_predict, dataset_d2[:, j]))

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/m0_49190544/article/details/108834552

智能推荐

谓词逻辑在计算机中的,基于谓词逻辑的知识表示和知识推理及在Prolog中的实现...-程序员宅基地

摘要:数理逻辑和计算机的关系非常密切,它的研究方法和研究成果在计算机科学各领域都有广泛的应用.一阶谓词逻辑,是数理逻辑的基础部分,由于它使用的是一种高度形式化的符号语言,不仅能够精确地表达人类思维和推理的形式结构,而且也能有效地存储到计算机中进行处理,因而成为人工智能研究的主要形式化工具. 知识表示和知识推理是人工智能研究的基本技术.谓词逻辑知识表示法是各种智能系统中最基本的知识表示方式,利用一..._谓词演算 在计算机中的应用

java1.8 常用集合源码学习:LinkedHashSet-程序员宅基地

1、api具有可预知迭代顺序的 Set 接口的哈希表和链接列表实现。此实现与 HashSet 的不同之外在于,它维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代。注意,插入顺序不 受在 set 中重新插入的 元素的影响。(如果在 s.contains(e) 返回 true 后立即调用 s.add(e),则元素 e 会

有序列表跟无序列表的嵌套-制作菜单页面_使用有序列表和无序列表知识设计如下页面-程序员宅基地

<!DOCTYPE html><html lang="zh-cn"><head> <meta charset="utf-8"> <title>有序列表跟无序列表的嵌套-制作菜单页面</title> <link href="css/style.css" type="text/css"..._使用有序列表和无序列表知识设计如下页面

x的取余_x取余0-程序员宅基地

X*X mod P = A,其中P为质数。给出P和A,求&lt;=P的所有X。Input两个数P A,中间用空格隔开。(1 &lt;= A &lt; P &lt;= 1000000, P为质数)Output输出符合条件的X,且0 &lt;= X &lt;= P,如果有多个,按照升序排列,中间用空格隔开。如果没有符合条件的X,输出:No SolutionSample Input..._x取余0

AT&T汇编语言寻址方式-程序员宅基地

现在,能够静下心来去读一段汇编代码的程序员已经不多,因为大多数人的工作中基本用不到。但是能够读懂汇编代码能够提高程序员对程序如何在机器上跑起来的理解和提高程序员的基本功。 想要看懂汇编语言,首先就要熟悉汇编语言各种寻址方式。汇编语言不同的代码格式,本文主要介绍AT&T。Linux 内核使用的就是这样格式,linux 上的工具如gcc和objdump默认生成的代码也是AT&T格

redis脑裂是什么意思?如何预防?如何处理?-程序员宅基地

redis脑裂是什么意思?如何预防?如何处理?redis脑裂分为两种情况,第一种是哨兵模式下的脑裂情况,另外一种是集群模式下的脑裂倾狂哨兵模式当哨兵找不到主节点的时候,认为主节点宕机;需要选举备份节点,选举一个备份作为主节点。旧master上的客户端连接如果有未中断的,可以继续写入数据;新的master处理新的客户端写操作。两个主节点数据不一致。当旧的master与哨兵恢复通讯,旧的mast..._redis脑裂

随便推点

NFS - 2 搭建_qumy97的博客-程序员宅基地

NFS - 目录NFS - 2 搭建一、NFS 搭建1. 安装 nfs-server2. 配置 nfs-client(非必选)一、NFS 搭建1. 安装 nfs-server安装 nfs 及相关依赖。yum install -y nfs-utilsecho "/data/nfs/data/ *(insecure,rw,sync,no_root_squash)" > /etc/exports# 创建文件存储/共享目录mkdir -p /data/nfs/data# 启动 nf.

UI recorder 自动化UI测试框架使用手册_uirecorder-程序员宅基地

一.前言此文档为前端自动化UI测试框架 UI recorder 的搭建以及使用文档。二.准备环境我们需要准备以下环境,安装顺序没有先后,环境之间相互无依赖:安装 java jdk(需要jdk 1.8及以上),并配置相应的环境变量。安装 node.js 和 npm。配置 npm 国内镜像 cnpm。2.1 安装 java jdk打开 java官网,找到你系统对应的jdk版本,点..._uirecorder

原创 Hi3516dv300 开发第五讲 rootfs.ubifs 转成rootfs.ext4-程序员宅基地

由于hi3516dv300 sdk里面只有spi/nand flash上用的根文件系统,是否可以将其转成emmc上使用ext4 rootfs呢?答案是肯定的:0.找到ubi格式的rootfsrootfs_hi3516dv300_2k_128k_32M.ubifs:1.安装工具mtd-utils: sudo apt-get install mtd-utils2.执行如下的scrip...

【PyCharm错误处理】Server‘s certificate is not trusted_pycharm tools server-程序员宅基地

打开PyCharm时出现如下弹窗解决方法:点击:File>>Setting>>Tools>>Server Certificates勾选Accept non-trusted certificates automatically_pycharm tools server

小技巧: Linux下用SSH退出符切换SSH会话-程序员宅基地

原文链接:http://hi.baidu.com/edeed/item/ee757d5c035ea310da1635b7

PHP开发的AZ自动发卡网站系统源码_az源码-程序员宅基地

介绍:PHP开发的AZ自动发卡网站系统源码内附安装说明支付配置先去易支付注册个号然后复制api、id与key填写即可 后台可自定义支付接口网盘下载地址:https://zijiewangpan.com/DtfviHB0tVv图片:..._az源码