集成与堆叠

一、集成学习介绍

基础集成技术:最大投票法(max voting)、平均法(averaging)、加权平均法(weighted average)

高级集成技术:堆叠(stacking)、混合(Blending)

1.例子买车:

1.问别人哪种车好

2.上网查询其价格

3.4S店去问

4.综合各种信息买到自己想要的车

 

最大投票方法通常用于分类问题。这种技术中使用多个模型来预测每个数据点。每个模型预测都被视为一次“投票”。大多数模型得到的预测被用作最终预测结果。

model1 = tree.DecisionTreeClassifier()
model2 = KneighborsClassifier()
model3 = LogisticRegression()
model1.fit(x_train,y_train)
model2.fit(x_train,y_train)
model3.fit(x_train,y_train)
pred1 = model1.predict(x_test)
pred2 = model2.predict(x_test)
pred2 = model3.predict(x_test)

final_pred = np.array([])
for i in range(0,len(x_test)):
    final_pred = np.append(final_pred,model([pred1[i],pred2[i],pred3[i]))

平均法类似于最大投票技术,这里对每个数据点的多次预测进行平均。在这种方法中,我们从所有模型中取平均值作为最终预测。平均法可用于在回归问题中进行预测或在计算分类问题的概率时使用。

finalpred = (pred1+pred2+pred3)/3

加权平均法是平均法的扩展。为了所有模型分配不同的权重,定义每个模型的预测重要性。

finalpred = pred1*0.3+pred2*0.3+pred3*0.4

二 、 高级集成技术

1.模型的堆叠(stacking)

2.模型的融合(blending)

 

堆叠是一种集成学习技术,它使用多个模型(例如决策树、knn或svm)的预测来构建新模型。该模型用于对测试集进行预测。

以下是简单堆叠集成法的逐步解释:

第一步:把训练集分成10份:

第二步:基础模型(假设是决策树)在其中9分上进行拟合,并对第10份进行预测。

第三步:对训练集上的每一份如此做一遍。

第四步:然后将基础模型(此处是决策树)拟合到整个训练集上。

第五步:使用此模型,在测试集上进行预测。

第六步:对另一个基础模型(比如knn)重复上述的2-4步,产生对训练集合测试集的另一组预测。

第七步:训练集的预测被用作构建新模型的特征

第八步:该新模型用于对测试预测集(test prediction,上图的右下角)进行最终的预测。

示例代码

我们首先定义一个函数来对n折的训练集合测试集进行预测。此函数返回每个模型对训练集和测试集的预测。

def stacking(model,train,y,test,n_fold):
    folds = StratifiedKFold(n_splits=n_fold,random_state=1)
    test_pred = np.empty((test.shape[0],1),float)
    train_pred = np.empty((0,1),float)
    for train_indices,val_indices in folds.split(train,y.values):
        x_train,x_val = train.iloc[train_indices],train.iloc[val_indices]
        y_train,y_val = y.iloc[train_indices],y.iloc[val_indices]

        model.fit(X=x_train,y=y_train)
        train_pred=np.append(train_pred,model.predict(x_val))#取train的1/n来得到下一层的输入
        test_pred=np.append(test_pred,model.predict(test))#得到的是这个测试集的新特征
    return test_pred.reshape(-1,1),train_pred

现在我们将创建两个基本模型:决策树和knn。

model1 = tree.DecisionTreeClassifier(random_state=1)

test_pred1,train_pred1 = Stacking(model=model1,n_fold=10,train=x_train,test=x_test,y=y_train)

train_pred1 = pd.DataFrame(train_pred1)
test_pred1 = pd.DataFrame(test_pred1)

model2 = KNeighborsClassifier()

test_pred2,train_pred2 = Stacking(model=model2,n_fold=10,train=x_train,test=x_test,y=y_train)

train_pred2 = pd.DataFrame(train_pred2)
test_pred2 = pd.DataFrame(test_pred2)

创建第三个模型,逻辑回归,在决策树和knn模型的预测之上。

df = pd.concat([train_pred1,train_pred2]),axis=1)
df_test = pd.concat([test_pred1,test_pred2],axis=1)

model = LogisticRegression(random_state=1)
model.fit(df,y_train)
model.score(df_test,y_test)

为了简化上面的解释,我们创建的堆叠模型只有两层。决策树和knn模型建立在零级,而逻辑回归模型建立在第一级。其实可以随意的在堆叠模型中创建多个层次。

 

### 堆叠集成(Stacking Ensemble)的概念 堆叠集成是一种高级的机器学习技术,它通过组合多个模型来提高预测性能。这种方法的核心思想是利用一个元模型(meta-model),该模型基于基础模型(base models)的输出来进行最终预测[^1]。 在堆叠过程中,基础模型通常由不同的算法组成,例如决策树、支持向量机或神经网络等。这些模型各自独立训练并生成预测结果。随后,元模型接收这些预测作为输入特征,并进一步学习如何最佳地结合它们以形成更强大的预测器[^2]。 ### 实现方法 以下是堆叠集成的一个典型实现过程: #### 数据划分 为了防止数据泄露,需将原始数据集划分为三部分:训练集、验证集和测试集。其中,验证集用于生成基础模型的预测值,而测试集则用来评估整个堆叠系统的性能。 #### 训练基础模型 每种选定的基础模型都应单独使用训练集进行拟合。之后,在验证集上运行这些已训练好的模型,收集其预测结果作为新特征矩阵的一部分。 #### 构建元模型 一旦获得了来自不同基础模型的预测值集合,就可以构建元模型了。这个阶段可以采用线性回归、逻辑回归或者更加复杂的非线性模型如XGBoost等作为元分类器/回归器的选择依据取决于具体应用场景的需求以及实验效果比较后的决定。 下面给出一段简单的Python代码示例展示如何创建一个基本版本的Stacking框架: ```python from sklearn.model_selection import KFold, train_test_split import numpy as np from sklearn.base import clone def get_oof(clf, X_train, y_train, X_val): oof_train = np.zeros((X_train.shape[0],)) oof_val = np.zeros((X_val.shape[0],)) kf = KFold(n_splits=5) for i, (train_index, val_index) in enumerate(kf.split(X_train)): clf_ = clone(clf) X_tr = X_train[train_index] y_tr = y_train[train_index] X_vl = X_train[val_index] clf_.fit(X_tr, y_tr) oof_train[val_index] += clf_.predict(X_vl)/kf.n_splits oof_val += clf_.predict(X_val)/kf.n_splits return oof_train.reshape(-1, 1), oof_val.reshape(-1, 1) # Example usage with classifiers classifiers = [ RandomForestClassifier(), GradientBoostingClassifier() ] X_train_meta = [] for clf in classifiers: oof_train_, oof_val_ = get_oof(clf, X_train, y_train, X_val) X_train_meta.append(oof_train_) X_train_meta = np.hstack(X_train_meta) meta_model = LogisticRegression() meta_model.fit(X_train_meta, y_train) ``` 上述脚本定义了一个函数`get_oof()`用于计算每个基学习者的out-of-fold predictions,然后把这些预测当作新的特征传给顶层的学习者即所谓的Meta Model来做最后的融合判断工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值