在机器学习比赛中,模型融合是比赛后期上分的重要手段,因为不同的模型可能对不同的样本有超额的效果。
这样模型融合可以结合不同模型的优势,如果你和你的队友有不同模型,这样融合后大概率能有效上分。
投票法可以根据权重,或者直接平均,将模型的预测结果进行融合。
均值
pre = (pre1 + pre2 + pre3 +…+pren )/n
加权平均
pre = 0.1pre1 + 0.2pre2 +0.7pre3
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 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))
这一部分建议大家去看这篇文章,下面的内容也摘自这位大神的文章,写的非常详细,由浅入深:链接:https://blog.csdn.net/wuzhongqiang/article/details/105012739
机器学习比赛中被誉为“七头龙神技”的stacking方法, 但因其模型的庞大程度与效果的提升程度往往不成正比, 所以一般很难应用于实际生产中。
from mxltend.regressor import StackingCVRegressor
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多次交叉验证要更加稳健。