Datawhale 零基础入门数据挖掘-Task5 模型融合

Datawhale 零基础入门数据挖掘-Task5 模型融合

融合是提分和提升模型鲁棒性的一种重要方法,主要有:

1)结果层面的融合,这种是最常见的融合方法,其可行的融合方法也有很多,比如根据结果的得分进行加权融合,还可以做Log,exp处理等。在做结果融合的时候,有一个很重要的条件是模型结果的得分要比较近似,然后结果的差异要比较大,这样的结果融合往往有比较好的效果提升。

2)特征层面的融合,这个层面其实感觉不叫融合,准确说可以叫分割,很多时候如果我们用同种模型训练,可以把特征进行切分给不同的模型,然后在后面进行模型或者结果融合有时也能产生比较好的效果。

3)模型层面的融合,模型层面的融合可能就涉及模型的堆叠和设计,比如加Staking层,部分模型的结果作为特征输入等,这些就需要多实验和思考了,基于模型层面的融合最好不同模型类型要有一定的差异,用同种模型不同的参数的收益一般是比较小的。

类型方式:

1、简单加权融合:

回归(分类概率):算术平均融合(Arithmetic mean),几何平均融合(Geometric mean);

分类:投票(Voting)

综合:排序融合(Rank averaging),log融合

2、stacking/blending:

构建多层模型,并利用预测结果再拟合预测。

'''

5-Fold Stacking

'''

from sklearn.ensemble import RandomForestClassifier

from sklearn.ensemble import ExtraTreesClassifier,GradientBoostingClassifier

import pandas as pd

#创建训练的数据集

data_0 = iris.data

data = data_0[:100,:]

target_0 = iris.target

target = target_0[:100]

#模型融合中使用到的各个单模型

clfs = [LogisticRegression(solver='lbfgs'),

        RandomForestClassifier(n_estimators=5, n_jobs=-1, criterion='gini'),

        ExtraTreesClassifier(n_estimators=5, n_jobs=-1, criterion='gini'),

        ExtraTreesClassifier(n_estimators=5, n_jobs=-1, criterion='entropy'),

        GradientBoostingClassifier(learning_rate=0.05, subsample=0.5, max_depth=6, n_estimators=5)]

#切分一部分数据作为测试集

X, X_predict, y, y_predict = train_test_split(data, target, test_size=0.3, random_state=2020)

dataset_blend_train = np.zeros((X.shape[0], len(clfs)))

dataset_blend_test = np.zeros((X_predict.shape[0], len(clfs)))

#5折stacking

n_splits = 5

skf = StratifiedKFold(n_splits)

skf = skf.split(X, y)

for j, clf in enumerate(clfs):

    #依次训练各个单模型

    dataset_blend_test_j = np.zeros((X_predict.shape[0], 5))

    for i, (train, test) in enumerate(skf):

        #5-Fold交叉训练,使用第i个部分作为预测,剩余的部分来训练模型,获得其预测的输出作为第i部分的新特征。

        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]

        dataset_blend_train[test, j] = y_submission

        dataset_blend_test_j[:, i] = clf.predict_proba(X_predict)[:, 1]

    #对于测试集,直接用这k个模型的预测值均值作为新的特征。

    dataset_blend_test[:, j] = dataset_blend_test_j.mean(1)

    print("val auc Score: %f" % roc_auc_score(y_predict, dataset_blend_test[:, j]))

clf = LogisticRegression(solver='lbfgs')

clf.fit(dataset_blend_train, y)

y_submission = clf.predict_proba(dataset_blend_test)[:, 1]

print("Val auc Score of Stacking: %f" % (roc_auc_score(y_predict, y_submission)))

3、boosting/bagging(在xgboost,Adaboost,GBDT中已经用到):

多树的提升方法

你可能感兴趣的:(Datawhale 零基础入门数据挖掘-Task5 模型融合)