EnmbleLearning-基于集成学习的模型融合-Python实现

更新时间:2023-05-20 09:16:28 阅读: 评论:0

EnmbleLearning-基于集成学习的模型融合-Python 实现
⽂章⽬录
Wisdom of the crowds == enmble machine learning
1 Enmble Learning-模型融合
通过对多个单模型融合以提升整体性能。
1.1 Voting
投票制即为,投票多者为最终的结果。例如⼀个分类问题,多个模型投票(当然可以设置权重)。最终投票数最多的类为最终被预测的类。
1.2 Averaging Averaging即所有预测器的结果平均。回归问题,直接取平均值作为最终的预测值。(也可以使⽤加权平均)
分类问题,直接将模型的预测概率做平均。(or 加权)
加权平均,其公式如下:
其中表⽰模型的个数, 表⽰该模型权重,表⽰模型i的预测概率值。
例如两个分类器,XGBoost(权重0.4)和LightGBM(权重0.6),其预测概率分别为:0.75、0.5,那么最终的预测概率,(0.4 *0.75+0.6 * 0.5)/(0.4+0.6)=0.6
一点英语模型权重也可以通过机器学习模型学习得到
1.3 Ranking
Rank的思想其实和Averaging⼀致,但Rank是把排名做平均,对于AUC指标⽐较有效。
个⼈认为其实就是Learning to rank的思想,可以来优化搜索排名。具体公式如下:
其中表⽰模型的个数, 表⽰该模型权重,所有权重相同表⽰平均融合。表⽰样本在第i个模型中的升序排名。它可以较快的利⽤排名融合多个模型之间的差异,⽽不需要加权融合概率。
1.4 Binning
将单个模型的输出放到⼀个桶中。参考 , ,
1.5 Bagging
Weight ∗i =1∑n i P i
n Weight i P i i =1∑n Rank i
Weight i
n Weight i Rank i
使⽤训练数据的不同随机⼦集来训练每个 Ba Model,最后每个 Ba Model 权重相同,分类问题进⾏投票,回归问题平均。
机器翻译与人工翻译
随机森林就⽤到了Bagging,并且具有天然的并⾏性。
1.6 Boosting
Boosting是⼀种迭代的⽅法,每⼀次训练会更关⼼上⼀次被分错的样本,⽐如改变被错分的样本的权重的Adaboost⽅法。还有许多都是基于这种思想,⽐如Gradient Boosting等。
经典问题:随机森林、Adaboost、GBDT、XGBoost的区别是什么?(⾯试常常被问)
1.7 Stacking
enter是什么意思
图⽚来⾃。
从上图可以看出,类似交叉验证。
1. 将数据集分为K个部分,共有n个模型。
2. for i in xrange(n):
for i in xrange(k):
⽤第i个部分作为预测,剩余的部分来训练模型,获得其预测的输出作为第i部分的新特征。
对于测试集,直接⽤这k个模型的预测值均值作为新的特征。
3. 这样k次下来,整个数据集都获得了这个模型构建的New Feature。n个模型训练下来,这个模型就有n个New Features。
4. 把New Features和label作为新的分类器的输⼊进⾏训练。然后输⼊测试集的New Features输⼊模型获得最终的预测结果。
1.8 Blending
Blending直接⽤不相交的数据集⽤于不同层的训练。
以两层的Blending为例,训练集划分为两部分(d1,d2),测试集为test。
1. 第⼀层:⽤d1训练多个模型,讲其对d2和test的预测结果作为第⼆层的New Features。
2. 第⼆层:⽤d2的New Features和标签训练新的分类器,然后把test的New Features输⼊作为最终的预测值。
2 融合的条件
**Ba Model 之间的相关性要尽可能的⼩。**这就是为什么⾮ Tree-bad Model 往往表现不是最好但还是要将它们包括在
Enmble ⾥⾯的原因。Enmble 的 Diversity 越⼤,最终 Model 的 Bias 就越低。
**Ba Model 之间的性能表现不能差距太⼤。**这其实是⼀个 Trade-off,在实际中很有可能表现相近的 Model 只有寥寥⼏个⽽且它们之间相关性还不低。但是实践告诉我们即使在这种情况下 Enmble 还是能⼤幅提⾼成绩。
3 Python实现
下⾯只实现了⼀些常⽤的融合⽅法,其他的类推。
3.1 Stacking
'''5折stacking'''
n_folds =5
永远在一起英文skf =list(StratifiedKFold(y, n_folds))
uga
for j, clf in enumerate(clfs):
'''依次训练各个单模型'''
datat_blend_test_j = np.zeros((X_predict.shape[0],len(skf)))
for i,(train, test)in enumerate(skf):
'''使⽤第i个部分作为预测,剩余的部分来训练模型,获得其预测的输出作为第i部分的新特征。'''
X_train, y_train, X_test, y_test = X[train], y[train], X[test], y[test]
clf.fit(X_train, y_train)
英语48个音标表
y_submission = clf.predict_proba(X_test)[:,1]
datat_blend_train[test, j]= y_submission
datat_blend_test_j[:, i]= clf.predict_proba(X_predict)[:,1]
'''对于测试集,直接⽤这k个模型的预测值均值作为新的特征。'''
anewdatat_blend_test[:, j]= datat_blend_an(1)
'''融合使⽤的模型'''
clf = GradientBoostingClassifier(learning_rate=0.02, subsample=0.5, max_depth=6, n_estimators=30) clf.fit(datat_blend_train, y)
y_submission = clf.predict_proba(datat_blend_test)[:,1]
完整代码见:
3.2 Blending盘子的英语单词
下⾯是⼀个两层的Blending的实现
'''切分训练数据集为d1,d2两部分'''
X_d1, X_d2, y_d1, y_d2 = train_test_split(X, y, test_size=0.5, random_state=2017)
datat_blend_train = np.zeros((X_d2.shape[0],len(clfs)))
datat_blend_test = np.zeros((X_predict.shape[0],len(clfs)))
for j, clf in enumerate(clfs):
'''依次训练各个单模型'''
# print(j, clf)
'''使⽤第1个部分作为预测,第2部分来训练模型,获得其预测的输出作为第2部分的新特征。'''
新东方精英英语价格# X_train, y_train, X_test, y_test = X[train], y[train], X[test], y[test]
clf.fit(X_train, y_train)
y_submission = clf.predict_proba(X_test)[:,1]
datat_blend_train[:, j]= y_submission
'''对于测试集,直接⽤这k个模型的预测值作为新的特征。'''
datat_blend_test[:, j]= clf.predict_proba(X_predict)[:,1]
print("val auc Score: %f"% roc_auc_score(y_predict, datat_blend_test[:, j]))affiliated
'''融合使⽤的模型'''
# clf = LogisticRegression()
clf = GradientBoostingClassifier(learning_rate=0.02, subsample=0.5, max_depth=6, n_estimators=30) clf.fit(datat_blend_train, y_test)
y_submission = clf.predict_proba(datat_blend_test)[:,1]
完整代码见:
Reference
1.
2. /kaggle-enmbling-guide/
3. dnc199
4. /p/25836678

本文发布于:2023-05-20 09:16:28,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/90/115620.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模型   预测   作为   部分   训练   融合
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图