Skip to content

Latest commit

 

History

History
123 lines (64 loc) · 4.6 KB

15_Model_Training_and_Evaluation.md

File metadata and controls

123 lines (64 loc) · 4.6 KB

15. Model Selection and Evaluation

15.1 Overview

Article

15.2 Distributed Training

Library

Article

15.4 Model Ensembling

15.4.1 Overview

Paper

Article

Library

15.4.2 Boosting

Code

15.4.3 Bagging

15.4.4 Stacking

对训练好的基学习器的应用结果进行非线性融合(输入并训练一个新的学习器)

偷懒的话,可直接使用 Out-of-fold(OOF) 做 Stacking

解读方式1:先循环KFold,然后再循环各基模型

定义训练集P={(x1, y1), (x2, y2), ..., (xm, ym)},测试集Q,基模型E1, E2, ..., ET,主模型E,则伪代码如下:

for P1, P2 in KFold(P) do       # 训练集拆分:训练集分成P1(k-1 folds)和P2(1 fold),分别用于训练和验证,要遍历所有KFold
    for t = 1, 2, ..., T do
        Et.train(P1)            # 基模型训练:使用P1训练每个基模型
        prt = Et.apply(P2)      # 基模型应用:基模型应用于P2生成prt
        qrt = Et.apply(Q)       # 基模型应用:基模型应用于Q 生成qrt
    
    pr = [pr1, pr2, ..., prT]   # 收集每个基模型应用结果prt,用于主模型训练,只是1/K份的训练数据
    qr = [qr1, qr2, ..., qrT]   # 收集每个基模型应用结果qrt,用于主模型测试,是全份的测试数据

PR = concate(pr)                # 训练数据纵向堆叠,共同组成总训练数据,共T列,表示T个新特征
QR = average(qr)                # 测试数据纵向求均值,当作最终测试数据,列同上

E.train(PR)                     # 主模型训练
score = E.evaluate(QR)          # 主模型测试

Y(x) = E.apply(E1.apply(x), E2.apply(x), ..., ET.apply(x))  # 全流程应用

注意:各Fold的结果是纵向堆叠或纵向均值

解读方式2:先循环各基模型,然后再循环KFold

每个基模型内先做交叉验证,交叉验证的valid结果纵向拼接为1列,test结果求均值,共同组成该基模型的结果,表示1列特征,最后各基模型的结果横向拼接成T列

Article

15.4.5 Blending

理念与Stacking比较类似,模型分为两层,不过比Stacking简单一些,不需要通过KFold这种CV策略来获得主模型的特征,而是建立一个Holdout集,直接使用不相交的数据集用于两层的训练。以两层Blending为例,详细来说为:

Step1: 训练集划分为两部分P1和P2,测试集为Q

Step2: 用P1训练每个基模型

Step3: 基模型应用于P2的结果,训练主模型

Step4: 基模型应用于Q的结果,测试主模型,模型应用时与测试流程一样。

Article