模型融合是kaggle等比赛中经常使用到的一个利器,它通常可以在各种不同的机器学习任务中使结果获得提升。顾名思义,模型融合就是综合考虑不同模型的情况,并将它们的结果融合到一起。模型融合主要通过几部分来实现:从提交结果文件中融合、stacking和blending。

模型融合的类型

Stacking相关理论介绍

1) 什么是 stacking

简单来说 stacking 就是当用初始训练数据学习出若干个基学习器后,将这几个学习器的预测结果作为新的训练集,来学习一个新的学习器。

将个体学习器结合在一起的时候使用的方法叫做结合策略。对于分类问题,我们可以使用投票法来选择输出最多的类。对于回归问题,我们可以将分类器输出的结果求平均值。

代码示例

回归\分类概率-融合:
1)简单加权平均,结果直接融合
## 生成一些简单的样本数据,test_prei 代表第i个模型的预测值
test_pre1 = [1.2, 3.2, 2.1, 6.2]
test_pre2 = [0.9, 3.1, 2.0, 5.9]
test_pre3 = [1.1, 2.9, 2.2, 6.0]

# y_test_true 代表第模型的真实值
y_test_true = [1, 3, 2, 6]

## 定义结果的加权平均函数
def Weighted_method(test_pre1,test_pre2,test_pre3,w=[1/3,1/3,1/3]):
    Weighted_result = w[0]*pd.Series(test_pre1)+w[1]*pd.Series(test_pre2)+w[2]*pd.Series(test_pre3)
    return Weighted_result

# 打印
pd.Series(test_pre1)
0    1.2
1    3.2
2    2.1
3    6.2
dtype: float64

# 各模型的预测结果计算MAE
print('Pred1 MAE:',metrics.mean_absolute_error(y_test_true, test_pre1))
print('Pred2 MAE:',metrics.mean_absolute_error(y_test_true, test_pre2))
print('Pred3 MAE:',metrics.mean_absolute_error(y_test_true, test_pre3))

Pred1 MAE: 0.1750000000000001
Pred2 MAE: 0.07499999999999993
Pred3 MAE: 0.10000000000000009

## 根据加权计算MAE
w = [0.3,0.4,0.3] # 定义比重权值
Weighted_pre = Weighted_method(test_pre1,test_pre2,test_pre3,w)
print('Weighted_pre MAE:',metrics.mean_absolute_error(y_test_true, Weighted_pre))

Weighted_pre MAE: 0.05750000000000027

# 打印看下这是啥
Weighted_pre

0    1.05
1    3.07
2    2.09
3    6.02
dtype: float64

将个体学习器结合在一起的时候使用的方法叫做结合策略。对于分类问题,我们可以使用投票法来选择输出最多的类。对于回归问题,我们可以将分类器输出的结果求平均值。

回归\分类概率-融合

1、简单加权平均,结果直接融合

sklearn.metrics中的评估方法介绍(accuracy_score, recall_score, roc_curve, roc_auc_score, confusion_matrix)

在理解赛题的时候特意介绍过这几个函数的用法、以及意义。


## 定义结果的加权平均函数
def Weighted_method(test_pre1,test_pre2,test_pre3,w=[1/3,1/3,1/3]):Weighted_result = w[0]*pd.Series(test_pre1)+w[1]*pd.Series(test_pre2)+w[2]*pd.Series(test_pre3)return Weighted_resultw = [0.3,0.4,0.3] # 定义比重权值
Weighted_pre = Weighted_method(test_pre1,test_pre2,test_pre3,w)
print('Weighted_pre MAE:',metrics.mean_absolute_error(y_test_true, Weighted_pre))

还有一些特殊的形式,比如mean平均,median平均

Stacking融合(回归)

def Stacking_method(train_reg1,train_reg2,train_reg3,y_train_true,test_pre1,test_pre2,test_pre3,model_L2= linear_model.LinearRegression()):model_L2.fit(pd.concat([pd.Series(train_reg1),pd.Series(train_reg2),pd.Series(train_reg3)],axis=1).values,y_train_true)Stacking_result = model_L2.predict(pd.concat([pd.Series(test_pre1),pd.Series(test_pre2),pd.Series(test_pre3)],axis=1).values)return Stacking_resultmodel_L2= linear_model.LinearRegression()
Stacking_pre = Stacking_method(train_reg1,train_reg2,train_reg3,y_train_true,test_pre1,test_pre2,test_pre3,model_L2)
print('Stacking_pre MAE:',metrics.mean_absolute_error(y_test_true, Stacking_pre))

可以发现模型结果相对于之前有进一步的提升,这是我们需要注意的一点是,对于第二层Stacking的模型不宜选取的过于复杂,这样会导致模型在训练集上过拟合,从而使得在测试集上并不能达到很好的效果

Voting投票机制
Voting即投票机制,分为软投票和硬投票两种,其原理采用少数服从多数的思想

sklearn的datasets使用
sklearn.datasets模块主要提供了一些导入、在线下载及本地生成数据集的方法,可以通过dir或help命令查看,目前主要有三种形式

1、本地加载数据集

数据集文件在sklearn安装目录下datasets\data文件下,如果有兴趣可进入模块目录查看

2、远程加载数据集

 比较大的数据集,主要用于测试解决实际问题,支持在线下载,下载下来的数据,默认保存在~/scikit_learn_data文件夹下,可以通过设置环境变量SCIKIT_LEARN_DATA修改路径,datasets.get_data_home()获取下载路径。

3、构造数据集

下面以make_regression()函数为例:

make_regression(n_samples=100, n_features=100, n_informative=10, n_targets=1, bias=0.0, effective_rank=None, tail_strength=0.5, noise=0.0, shuffle=True, coef=False, random_state=None)

XGBClassifier函数
xgboost模块的XGBClassifier函数


RandomForestClassifier

参数

class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0, warm_start=False, class_weight=None)
  • 1

详解






硬投票:对多个模型直接进行投票,不区分模型结果的相对重要度,最终投票数最多的类为最终被预测的类

VotingClassifier

调用VotingClassifier上的fit方法将拟合存储在类属性self.estimators中的原始估计器的克隆。估计器可以使用set_params设置为’drop’

如果“硬”,则使用预测类标签进行多数规则投票。否则,如果“软”,则基于预测概率之和的argmax来预测类标签,这是推荐用于经过良好校准的分类器集合的。

软投票:和硬投票原理相同,增加了设置权重的功能,可以为不同模型设置不同权重,进而区别模型不同的重要度

eclf = VotingClassifier(estimators=[('xgb', clf1), ('rf', clf2), ('svc', clf3)], voting='soft', weights=[2, 1, 1])
clf1.fit(x_train, y_train)

分类的Stacking\Blending融合
stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为训练集进行再训练,从而得到完整的stacking模型, stacking两层模型都使用了全部的训练数据

LogisticRegression(solver='lbfgs')

RandomForestClassifier


要并行运行的作业数。拟合、预测、决策路径和应用都是在树上并行的。无表示1,除非在joblib.parallel_后端上下文中。-1表示使用所有处理器。

The function to measure the quality of a split. Supported criteria are “gini” for the Gini impurity and “entropy” for the information gain.
测量分割质量的函数。支持的标准是基尼杂质的“基尼”和信息增益的“熵”。注意:此参数是树特定的。

GradientBoostingClassifier

用于拟合单个基础学习者的样本分数。如果小于1.0,则会导致随机梯度增强。子样本与参数n_估计量相互作用。选择小于1.0的子样本会导致方差减少和偏差增加。

StratifiedKFold用法类似Kfold,但是他是分层采样,确保训练集,测试集中各类别样本的比例与原始数据集中相同。
参数:


KNeighborsClassifier

class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights=’uniform’, algorithm=’auto’, leaf_size=30, p=2, metric=’minkowski’, metric_params=None, n_jobs=1, **kwargs)


StackingClassifier

StackingClassifier(classifiers,meta_classifier,use_probas = False,average_probas = False,verbose = 0)


GridSpec
先是通过gridspec.GridSpec()创建区域,参数5,5的意思就是每行五个,每列五个,最后就是一个5×5的画布,相比于add_subplot(),使用网格布局的话可以更加灵活的控制占用多少空间

itertools.product

itertools.product(*iterables[, repeat])

笛卡尔积创建一个迭代器,生成表示item1,item2等中的项目的笛卡尔积的元组
repeat是一个关键字参数,指定重复生成序列的次数

product(range(2), repeat=3) --> 000 001 010 011 100 101 110 111

plot_decision_regions

plot_decision_regions(X, y, clf, feature_index=None, filler_feature_values=None, filler_feature_ranges=None, ax=None, X_highlight=None, res=None, legend=1, hide_spines=True, markers='s^oxv<>', colors='#1f77b4,#ff7f0e,#3ca02c,#d62728,#9467bd,#8c564b,#e377c2,#7f7f7f,#bcbd22,#17becf', scatter_kwargs=None, contourf_kwargs=None, scatter_highlight_kwargs=None)

参考:数据竞赛—二手车价格预测— 模型融合_你会弹琴吗的博客-CSDN博客

数据挖掘二手车价格预测 Task05:模型融合相关推荐

  1. 二手车价格预测——Task5 模型融合

    文章目录 前言 一.代码示例 1.引入库 2.读入数据 3.建立模型 4.加权融合 总结 前言 当我们在做数据挖掘的时候,往往会发现单个模型的预测结果总是不如人意,这个时候我们不妨尝试模型融合,把多个 ...

  2. 【算法竞赛学习】二手车交易价格预测-Task5模型融合

    二手车交易价格预测-Task5 模型融合 五.模型融合 Tip:此部分为零基础入门数据挖掘的 Task5 模型融合 部分,带你来了解各种模型结果的融合方式,在比赛的攻坚时刻冲刺Top,欢迎大家后续多多 ...

  3. 数据挖掘-二手车价格预测 Task04:建模调参

    数据挖掘-二手车价格预测 Task04:建模调参 模型调参部分 利用xgb进行五折交叉验证查看模型的参数效果 ## xgb-Model xgr = xgb.XGBRegressor(n_estimat ...

  4. 零基础入门金融风控-贷款违约预测-Task05——模型融合

    有幸参加了阿里云举办的零基础入门金融风控-贷款违约预测训练营.收获颇多. 每天记录一些自己之前的知识盲点,需经常温习. 第五次的学习任务,是模型融合. 一.模型融合常用方法 模型融合有常用的如下六种方 ...

  5. 数据挖掘-二手车价格预测 Task03:特征工程

    一.特征工程理论: 常见的特征工程包括: 一.导入数据 import warnings warnings.filterwarnings('ignore') import pandas as pd im ...

  6. 数据挖掘-二手车价格预测 Task02:数据分析

    Task02:数据分析 1.EDA数据探索性分析 读取文件 import warnings warnings.filterwarnings('ignore') import pandas as pd ...

  7. Python二手车价格预测(二)—— 模型训练及可视化

    系列文章目录 一.Python数据分析-二手车数据获取用于机器学习二手车价格预测 二.Python二手车价格预测(一)-- 数据处理 文章目录 系列文章目录 前言 一.明确任务 二.模型训练 1.引入 ...

  8. 【组队学习】【24期】河北邀请赛(二手车价格预测)

    河北邀请赛(二手车价格预测) 开源内容: https://github.com/datawhalechina/team-learning-data-mining/tree/master/SecondH ...

  9. 基于二手车价格预测——特征工程

    特征工程 特征工程 分析: 第一步:异常值处理 箱型图法: 第二步:特征构造 第三步:数据分桶 数据分桶详解 删除不需要的数据 特征归一化 总结--特征 1.特征构造: 2.异常类型处理 3.构造新特 ...

最新文章

  1. Rus入门到放弃——HashMap和BTreeMap
  2. 新版mysql授权命令,缺一不可
  3. 【学习笔记】观察者模式
  4. (provider: 共享内存提供程序, error: 0 - 管道的另一端上无任何进程。) (Microsoft SQL Server,错误: 233)...
  5. Javascript中四种函数调用方式
  6. 中国基座臂行业市场供需与战略研究报告
  7. 字节跳动学前端还是java_【全国】—Java/前端工程师—字节跳动
  8. linux 内核参数分析,linux 内核参数VM调优 之 参数调节和场景分析
  9. mysql编译方式查询_源码编译mysql及其各种查询总结
  10. 2 年前端面试心路历程(字节跳动、YY、虎牙、BIGO)
  11. 宜家IKEA EDI IFTMBF运输预定请求详解
  12. android ios 重力感应器,iOS实时获取当前的屏幕方向之重力感应
  13. 简单的android游戏框架——zgf
  14. 如何判断一笔交易是否属于欺诈 数据挖掘算法与现实生活中的应用案例
  15. 知乎百万热议:程序员如何做到年薪 50 万?
  16. div中图片下方的说明文字如何能添加的上去
  17. svn: E155017: 工作副本的参考文件损坏【解决方案】
  18. 30w 重金等你挑战,数字合肥广邀智慧城市建设英才
  19. QT:在QT中调用摄像头并实现简单的拍照功能
  20. OpenCVSharp入门教程——导读

热门文章

  1. vue-amap - 基于Vue2.0和高德地图的地图组件
  2. git “errno=Connection refused”
  3. laravel的blade模板的布局嵌套
  4. DSOFramer使用说明(转载)))
  5. 程序员面试金典——1.7清除行列
  6. 洛谷 P1451【细胞】
  7. Linux网络和进程管理
  8. 超大文件中查找关键字
  9. JAMA:Java矩阵包
  10. 正则提取 html 里input 标记的value 值