模型融合 python_模型融合及 python 实现

模型融合及 python 实现

“如果你没有什么好的思路的话,那么就模型融合吧!”

Stacking 利器(mlxtend 库):

在 KDD CUP、Kaggle、天池等数据挖掘比赛中,常常用到集成学习。使用了集成学习后,模型的效果往往有很大的进步。

本文将介绍常见的集成学习方法,包括但不限于:

集成学习为什么有效

Voting

Linear Blending

Stacking

Bagging

随机森林

集成学习

如果硬要把集成学习进一步分类,可以分为两类,一种是把强分类器进行强强联合,使得融合后的模型效果更强,称为模型融合。另一种是将弱分类器通过学习算法集成起来变为很强的分类器,称为机器学习元算法。

这里我们把用来进行融合的学习器称为个体学习器。

模型融合的代表有:投票法 (Voting)、线性混合 (Linear Blending)、Stacking。

而机器学习元算法又可以根据个体学习器之间是否存在依赖关系分为两类,称为 Bagging 和 Boosting:

Bagging: 个体学习器不存在依赖关系,可同时对样本随机采样并行化生成个体学习器。代表作为随机森林 (Random Forest)

Boosting: 个体学习器存在依赖关系, 基于前面模型的训练结果误差生成新的模型,必须串行化生成。代表的算法有:Adaboost、GBDT、XGBoost

模型融合

上面提到,模型融合是把强分类器进行强强联合,变得更强。

在进行模型融合的时候,也不是说随意的融合就能达到好的效果。进行融合时,所需的集成个体(就是用来集成的模型)应该好而不同。好指的是个体学习器的性能要好,不同指的是个体模型的类别不同。

这里举个西瓜书的例子,在介绍例子之前,首先提前介绍简单投票法,以分类问题为例,就是每个分类器对样例进行投票,哪个类别得到的票数最多的就是融合后模型的结果。

在上面的例子中,采用的就是简单的投票法。中间的图 b 各个模型输出都一样,因此没有什么效果。第三个图 c 每个分类器的精度只有 33%,融合后反而更糟。也就是说,想要模型融合有效果,个体学习器要有一定的准确率,并且要有多样性,学习器之间具有差异,即” 好而不同 “。

如何做到好而不同呢?可以由下面几个方面:

针对输入数据:使用采样的方法得到不同的样本(比如 bagging 方法采用自助法进行抽样)

针对特征:对特征进行抽样

针对算法本身:

个体学习器

来自不

同的模型集合

个体学习器

来自于同一个模型集合的

不同超参数

,例如学习率η不同

算法本身具有随机性,例如用不同的随机种子来得到不同的模型

针对输出:对输出表示进行操纵以增强多样性

如将多分类转化为多个二分类任务来训练单模型

将分类输出转化为回归输出等

投票和平均 Voting and Average

分类

对于分类任务来说,可以使用投票的方法:

简单投票法:

即各个分类器输出其预测的类别,取最高票对应的类别作为结果。若有多个类别都是最高票,那么随机选取一个。

加权投票法:

和上面的简单投票法类似,不过多了权重αi,这样可以区分分类器的重要程度,通常

此外,个体学习器可能产生不同的

的值,比如类标记和类概率。

类标记

,若 hi 将样本

x

预测为类别

取值为 1,否则为 0。使用类标记的投票亦称 “硬投票”。(其实就是多分类的输出),使用类标记的称为

硬投票

类概率

,即输出类别为

的概率。使用类概率的投票称为

软投票

对应 sklearn 中的 VotingClassifier 中 voting 参数设为 soft。

PS:使用类概率进行结合往往比直接基于类标记的效果好,即使分类器估计出的概率值一般都不太准确。

回归

对于回归任务来说,采用的为平均法 (Average):

简单平均:

加权平均:

首先我们回顾两个概念:

holdout 和交叉验证是两个常用的评估分类器预测准确率的技术,它们均是在给定数据集中随机取样划分数据。 holdout:将所给定的数据集随机划分成两个独立部分:一个作为训练数据集,而另一个作为测试数据集,通常训练数据集包含初始数据集中的三分之二的数据,而其余的三分之一则作为测试数据集的内容。利用训练集数据学习获得一个分类器

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Stacking是一种用于模型融合的技术,可以通过将多个模型的预测结果作为特征来训练另一个模型,从而提升整体的预测性能。以下是一个利用Python实现Stacking的实例。 首先,我们需要导入相关的库和数据集。在这个例子中,我们使用波士顿房价数据集。代码如下: ```python import pandas as pd import numpy as np from sklearn.datasets import load_boston from sklearn.model_selection import KFold from sklearn.linear_model import LinearRegression from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor boston = load_boston() X = pd.DataFrame(boston.data, columns=boston.feature_names) y = boston.target ``` 接下来,我们定义三个不同的模型:线性回归、决策树回归和随机森林回归。然后,我们使用KFold对数据进行交叉验证,并在每个fold上训练三个模型并记录其预测结果。代码如下: ```python n_splits = 5 kf = KFold(n_splits=n_splits) lr_oof = np.zeros((X.shape[0],)) dt_oof = np.zeros((X.shape[0],)) rf_oof = np.zeros((X.shape[0],)) for train_idx, test_idx in kf.split(X): X_train, y_train = X.iloc[train_idx], y[train_idx] X_test, y_test = X.iloc[test_idx], y[test_idx] # Linear Regression lr = LinearRegression() lr.fit(X_train, y_train) lr_oof[test_idx] = lr.predict(X_test) # Decision Tree Regression dt = DecisionTreeRegressor(random_state=42) dt.fit(X_train, y_train) dt_oof[test_idx] = dt.predict(X_test) # Random Forest Regression rf = RandomForestRegressor(random_state=42) rf.fit(X_train, y_train) rf_oof[test_idx] = rf.predict(X_test) ``` 现在我们有了三个模型的预测结果,我们将这些预测结果作为新的特征,并使用一个线性回归模型对其进行训练。代码如下: ```python X_new = pd.DataFrame({"lr_oof": lr_oof, "dt_oof": dt_oof, "rf_oof": rf_oof}) stacker = LinearRegression() stacker.fit(X_new, y) ``` 最后,我们可以使用stacker模型来进行预测。代码如下: ```python y_pred = stacker.predict(X_new) ``` 这就是用Python实现Stacking模型融合的基本过程。当然,这只是一个简单的示例,实际中可能需要对模型进行更复杂的调整和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值