模型融合是比赛后期上分的重要手段,特别是多人组队学习的比赛中,将不同队友的模型进行融合,可能会收获 意想不到的效果。
往往模型相差越大且模型表现都不错的前提下,模型融合后结果会有大幅提升,以下是模型 融合的方式。
-
平均:
a. 简单平均法
b. 加权平均法 -
投票:
a. 简单投票法
b. 加权投票法
3 . 综合:
a. 排序融合
b. log融合 -
stacking:
a. 构建多层模型,并利用预测结果再拟合预测。 -
blending:
a. 选取部分数据预测训练得到预测结果作为新特征,带入剩下的数据中预测。
Blending只有一层,而Stacking有多层 -
boosting/bagging
-
Blending与stacking的不同
a. stackingstacking中由于两层使用的数据不同,所以可以避免信息泄露的问题。在组队竞赛的过程中,不需要给队友分享自己的随机种子。
b. Blendingblending比stacking简单,不需要构建多层模型。由于blending对将数据划分为两个部分,在最后预测时有部分数据信息将被忽略。 同时在使用第二层数据时可能会因为第二层数据较少产生过拟合现象。
#简单加权平均,结果直接融合求多个预测结果的平均值。
#pre1-pren分别是n组模型预测出来的结果,将其进行加权融合
pre = (pre1 + pre2 + pre3 +...+pren )/n
#1. 加权平均法一般根据之前预测模型的准确率,进行加权融合,将准确性高的模型赋予更高的权重。
pre=n1*pre1+n2*pre2+...+an*pren
#其中n1+n2+...=1
#1. 简单投票
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))
#1 - 加权投票2 在VotingClassifier中加入参数 voting='soft', weights=[2, 1, 1],weights用于调节基模型的权重
from xgboost import XGBClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier, VotingClassifier4 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)], voting='soft', weights=[2, 1, 1])9 vclf = vclf .fit(x_train,y_train)10 print(vclf .predict(x_test))
```python
####下面以鸢尾花数据集简单的测试一下投票法和单个模型的效果对比
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.tree import DecisionTreeClassifier
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
from sklearn.ensemble import AdaBoostClassifier
from xgboost import XGBClassifier
from sklearn.ensemble import RandomForestClassifier
iris = load_iris()
x = iris.data
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3)
clf1 = XGBClassifier(learning_rate=0.1, n_estimators=150, max_depth=3, min_child_weight=2, subsample=0.7,
colsample_bytree=0.6, objective='binary:logistic')
clf2 = RandomForestClassifier(n_estimators=50, max_depth=1, min_samples_split=4,
min_samples_leaf=63,oob_score=True)
clf3 = SVC(C=0.1, probability=True) # 软投票的时候,probability必须指定且为true
# 硬投票
eclf = VotingClassifier(estimators=[('xgb', clf1), ('rf', clf2), ('svc', clf3)], voting='hard')
for clf, label in zip([clf1, clf2, clf3, eclf], ['XGBBoosting', 'Random Forest', 'SVM', 'Voting']):
scores = cross_val_score(clf, x, y, cv=5, scoring='accuracy')
print("Accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))
# 结果如下:
Accuracy: 0.96 (+/- 0.02) [XGBBoosting]
Accuracy: 0.33 (+/- 0.00) [Random Forest]
Accuracy: 0.95 (+/- 0.03) [SVM]
Accuracy: 0.94 (+/- 0.04) [Voting]
1. 简单平均和加权平均是常用的两种比赛中模型融合的方式。其优点是快速、简单。
2. stacking在众多比赛中大杀四方,但是跑过代码的小伙伴想必能感受到速度之慢,
3. 同时stacking多层提升幅度并 不能抵消其带来的时间和内存消耗,
4. 所以实际环境中应用还是有一定的难度,同时在有答辩环节的比赛中,
5. 主办方也会一定程度上考虑模型的复杂程度,所以说并不是模型融合的层数越多越好的。
6. 当然在比赛中将加权平均、stacking、blending等混用也是一种策略,可能会收获意想不到的效果