提升机器学习算法准确度的方法:模型融合-集成学习-投票机制 sklearn VotingRegressor 比赛上分大杀器

在机器学习比赛中,模型融合是比赛后期上分的重要手段,因为不同的模型可能对不同的样本有超额的效果。
这样模型融合可以结合不同模型的优势,如果你和你的队友有不同模型,这样融合后大概率能有效上分。

VotingClassifier 投票法

投票法可以根据权重,或者直接平均,将模型的预测结果进行融合。

均值
pre = (pre1 + pre2 + pre3 +…+pren )/n
加权平均
pre = 0.1pre1 + 0.2pre2 +0.7pre3

1.简单均值投票法(hard voting)
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))
2.加权平均投票法(soft voting)
from sklearn import datasets
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import VotingClassifier

iris = datasets.load_iris()
X, y = iris.data[:, 1:3], iris.target

clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(n_estimators=50, random_state=1)
clf3 = GaussianNB()

eclf = VotingClassifier(
    estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)],
    , voting='soft', weights=[2, 1, 1]))

for clf, label in zip([clf1, clf2, clf3, eclf], ['Logistic Regression', 'Random Forest', 'naive Bayes', 'Ensemble']):
    scores = cross_val_score(clf, X, y, scoring='accuracy', cv=5)
    print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))

Stacking/Blending

这一部分建议大家去看这篇文章,下面的内容也摘自这位大神的文章,写的非常详细,由浅入深:链接:https://blog.csdn.net/wuzhongqiang/article/details/105012739

1.Stacking

机器学习比赛中被誉为“七头龙神技”的stacking方法, 但因其模型的庞大程度与效果的提升程度往往不成正比, 所以一般很难应用于实际生产中。

from mxltend.regressor import StackingCVRegressor
2.Blending

Blending是一种和Stacking很相像的模型融合方式,它与Stacking的区别在于训练集不是通过K-Fold的CV策略来获得预测值从而生成第二阶段模型的特征,而是建立一个Holdout集(留出集),例如30%的训练数据(类似于把原始的训练集先分成两部分, 比如70%的数据作为新的训练集, 剩下的30%的数据作为测试集), 但是通过查看资料,好像是有两个版本。

一个版本就是单纯的Holdout集,就是我直接把训练集分成两部分,70%作为新的训练集, 30%作为测试集,然后用这70%的训练集分别训练第一层的模型,然后在30%的测试集上进行预测, 把预测的结果作为第二层模型的训练集特征,这是训练部分。 预测部分就是把真正的测试集先用第一层的模型预测,把预测结过作为第二层测试集的特征进行第二层的预测。 过程图长下面这个样子:
在这里插入图片描述
第二个版本的话依然是有一个Holdout集合,但是引入了交叉验证的那种思想,也就是每个模型看到的Holdout集合并不一样。即每个模型会看到这个30%的数据会不一样,说白了,就是把Stacking流程中的K-Fold CV 改成 HoldOut CV。第二阶段的stacker模型就基于第一阶段模型对这30%训练数据的预测值进行拟合。
在这里插入图片描述
那么究竟有什么区别呢?

Blending的优势在于:

Blending比较简单,而Stacking相对比较复杂; 能够防止信息泄露:generalizers和stackers使用不同的数据;
而缺点在于:

只用了整体数据的一部分; 最终模型可能对留出集(holdout set)过拟合; Stacking多次交叉验证要更加稳健。

在这里插入图片描述

  • 4
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AiFool

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值