第五次打卡
模型融合是比赛后期上分的重要手段,特别是多人组队学习的比赛中,将不同队友的模型进行融合,可能会收获 意想不到的效果。
往往模型相差越大且模型表现都不错的前提下,模型融合后结果会有大幅提升,以下是模型 融合的方式。
-
平均:
a. 简单平均法
b. 加权平均法 -
投票:
a. 简单投票法
b. 加权投票法
3 . 综合:
a. 排序融合
b. log融合 -
stacking:
a. 构建多层模型,并利用预测结果再拟合预测。 -
blending:
a. 选取部分数据预测训练得到预测结果作为新特征,带入剩下的数据中预测。
Blending只有一层,而Stacking有多层 -
boosting/bagging
-
Blending与stacking的不同
a. stackingstacking中由于两层使用的数据不同,所以可以避免信息泄露的问题。在组队竞赛的过程中,不需要给队友分享自己的随机种子。
b. Blendingblending比stacking简单,不需要构建多层模型。由于blending对将数据划分为两个部分,在最后预测时有部分数据信息将被忽略。 同时在使用第二层数据时可能会因为第二层数据较少产生过拟合现象。
```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]