zoukankan      html  css  js  c++  java
  • DataWhale《零基础入门数据挖掘》第五次打卡

    在这里插入图片描述

    第五次打卡(4月2日-4月4日)

    菜鸡的学习之路^__^(自己学习,复习使用)
    Task3:模型结果融合
    这是本次组对学习最后一次打卡,时间好快,第一次接触数据挖掘,从赛题理解–>EDA–>特征工程–>模型融合,自己体会了一把数据挖掘的从入门到放弃,感觉就是一个字“累”。但相比深度学习,它的可解释性确实就摆在这,无可厚非。通过此次学习也反映了自己先前的传统机器学习知识掌握得不太牢靠,需要重新好好深入理解,得加把劲啊!

    5.1 啥是模型融合

    (1)如果你打算买一辆车,你会直接走进第一家4S店,然后在店员的推销下直接把车买了吗?

    当然不会,你大概率会先去网站,看看其他人的评价或者一些专业机构在各个维度上对各种车型的对比;也许还会取咨询朋友和同事的意见。

    (2)模型融合采用的是同样的思想,即多个模型的组合可以改善整体的表现
    集成模型是一种能在各种的机器学习任务上提高准确率的强有力技术。

    5.2 投票法(voting)(分类问题)

    基本思想:假设对于一个二分类问题,有3个基础模型,现在我们可以在这些基学习器的基础上得到一个投票的分类器,把票数最多的类作为我们要预测的类别。
    从西瓜书截得一些要点:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    from sklearn.tree import DecisionTreeClassifier
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.linear_model import LogisticRegression
    from sklearn.ensemble import VotingClassifier
    
    model1 = LogisticRegression(random_state=2020)
    model2 = DecisionTreeClassifier(random_state=2020)
    model = VotingClassifier(estimators=[('lr', model1), ('dt', model2)], voting='hard')
    model.fit(x_train, y_train)
    model.score(x_test, y_test)
    

    5.3 平均法(Averaging)(回归问题)

    基本思想:对于回归问题,一个简单直接的思路是取平均。稍稍改进的方法是进行加权平均。权值可以用排序的方法确定,举个例子,比如A、B、C三种基本模型,模型效果进行排名,假设排名分别是1,2,3,那么给这三个模型赋予的权值分别是3/6、2/6、1/6。
    这两种方法看似简单,其实后面的高级算法也可以说是基于此而产生的,Bagging或者Boosting都是一种把许多弱分类器这样融合成强分类器的思想。

    5.3.1 等概率平均法

    (1)和Voting方法类似,Averaging方法就多个模型预测的结果进行平均。

    (2)这种方法既可以用于回归问题,也可以用于对分类问题的概率进行平均。
    在这里插入图片描述

    5.3.2 加权平均法

    这种方法是平均法的扩展。考虑不同模型的能力不同,对最终结果的贡献也有差异,需要用权重来表征不同模型的重要性importance。
    在这里插入图片描述

    5.4 堆叠法(Stacking)

    (1)Stacking的思想是:对不同模型预测的结果再进行建模。
    (2)Stacking的常规流程描述:

    1. 将训练集分成10个fold;
    2. 基模型base model在9个fold上进行训练,并在第10个fold上预测得到结果;由于分为10个fold,所以这个过程可以进行10次;
    3. 然后使用全部的训练集训练base model,得到训练好的base model。
    4. 使用第3步训练好的模型,在测试集上进行预测,得到预测结果。
    5. 第2步到第4步可以再使用其他的基模型base model重复,又得到了新的训练集和测试集的预测结果。
    6. 将训练集的预测结果作为新的特征构建一个新的模型,称为元学习器meta learner 。
    7. 使用元学习器meta learner对上面测试集得到的结果进行预测,得到最终结果。
    def get_oof(clf, x_train, y_train, x_test):
     oof_train = np.zeros((ntrain,))  
     oof_test = np.zeros((ntest,))
     oof_test_skf = np.empty((NFOLDS, ntest))  #NFOLDS行,ntest列的二维array
     for i, (train_index, test_index) in enumerate(kf): #循环NFOLDS次
         x_tr = x_train[train_index]
         y_tr = y_train[train_index]
         x_te = x_train[test_index]
         clf.fit(x_tr, y_tr)
         oof_train[test_index] = clf.predict(x_te)
         oof_test_skf[i, :] = clf.predict(x_test)  #固定行填充,循环一次,填充一行
     oof_test[:] = oof_test_skf.mean(axis=0)  #axis=0,按列求平均,最后保留一行
     return oof_train.reshape(-1, 1), oof_test.reshape(-1, 1)  #转置,从一行变为一列
    
    这里只实现了针对一个基模型做K折交叉验证,因为P1和T1都是多行一列的结构,这里是先存储为一行多列,最后进行转置。
    

    5.5 混合法(Blending)

    (1)Blending采用了和stacking同样的方法,不过只从训练集中选择一个fold的结果,再和原始特征进行concat作为元学习器meta learner的特征,测试集上进行同样的操作。

    (2)Blending训练过程:

    1. 整个训练集划分成训练集training sets和验证集validation sets两个部分;
    2. 在training sets上训练模型;
    3. 在validation sets和test sets上得到预测结果;
    4. 将validation sets的原始特征和不同基模型base model预测得到的结果作为新的元学习器meta learner的输入,进行训练 ;
    5. 使用训练好的模型meta learner在test sets以及在base model上的预测结果上进行预测,得到最终结果。

    5.6 Bagging

    (1)Bagging基于的思想是bootstrap(自采样),也就是有放回的采样。训练子集的大小和原始数据集的大小相同。

    (2)Bagging的技术使用子集来了解整个样本集的分布,通过bagging采样的子集的大小要小于原始集合。

    1. 采用bootstrap的方法基于原始数据集产生大量的子集
    2. 基于这些子集训练弱模型base model
    3. 模型是并行训练并且相互独立的
    4. 最终的预测结果取决于多个模型的预测结果

    Bagging是一种并行式的集成学习方法,即基学习器的训练之间没有前后顺序可以同时进行,Bagging使用“有放回”采样的方式选取训练集,对于包含m个样本的训练集,进行m次有放回的随机采样操作,从而得到m个样本的采样集,这样训练集中有接近36.8%的样本没有被采到。按照相同的方式重复进行,我们就可以采集到T个包含m个样本的数据集,从而训练出T个基学习器,最终对这T个基学习器的输出进行结合。
    Bagging算法的流程如下所示:
    在这里插入图片描述

    5.7 Boosting

    (1)Boosting是一个序列化的过程,后续模型会矫正之前模型的预测结果。也就是说,之后的模型依赖于之前的模型。

    (2)Boosting训练过程:

    1. 基于原始数据集构造子集
    2. 初始的时候,所有的数据点都给相同的权重
    3. 基于这个子集创建一个基模型
    4. 使用这个模型在整个数据集上进行预测
    5. 基于真实值和预测值计算误差
    6. 被预测错的观测值会赋予更大的权重
    7. 再构造一个模型基于之前预测的误差进行预测,这个模型会尝试矫正之前的模型
    8. 类似地,构造多个模型,每一个都会矫正之前的误差
    9. 最终的模型(strong learner)是所有弱学习器的加权融合

    Boosting是一种串行的工作机制,即个体学习器的训练存在依赖关系,必须一步一步序列化进行。其基本思想是:增加前一个基学习器在训练训练过程中预测错误样本的权重,使得后续基学习器更加关注这些打标错误的训练样本,尽可能纠正这些错误,一直向下串行直至产生需要的T个基学习器,Boosting最终对这T个学习器进行加权结合,产生学习器委员会。

    加州大学欧文分校Alex Ihler教授的两页PPT:
    在这里插入图片描述
    在这里插入图片描述


    最后放一张H2O分享的图片总结一下:
    在这里插入图片描述

    5.8 总结与成果

    在这里插入图片描述

    经过几天的学习,把大佬一开始提供的baseline有所改动,结合自己吸取多为代佬的思路及一些精致代码,最好时可以达到线下mae:459.9,刚提交时线上40多名,在自己不断增扎后,哈哈,50多名了,由于自己太菜,目前试了很多方法仍无法再有所提高,名次大大下滑,无奈。。。反正自己这次又不是为了打比赛是吧(心理安慰)。让我最震惊的是,今天突然出现在榜首mae:366.9的代佬,是什么妖魔鬼怪啊。。tql。加油,努力学习!Fighting!


    参考内容:

    1. 《机器学习》(西瓜书)
    2. 《数据挖掘导论》
    3. 《统计学习方法》
    4. 集成学习-Voting
    5. 模型融合
    6. 模型融合方法概述
    7. Datawhale 零基础入门数据挖掘-Task5 模型融合

    关于Datawhale:

    Datawhale是一个专注于数据科学与AI领域的开源组织,汇集了众多领域院校和知名企业的优秀学习者,聚合了一群有开源精神和探索精神的团队成员。Datawhale 以“for the learner,和学习者一起成长”为愿景,鼓励真实地展现自我、开放包容、互信互助、敢于试错和勇于担当。同时 Datawhale 用开源的理念去探索开源内容、开源学习和开源方案,赋能人才培养,助力人才成长,建立起人与人,人与知识,人与企业和人与未来的联结。

    在此特别感谢DataWhale提供的学习机会,为其开源精神点赞,希望自己能在自己的努力下不断进步,很幸运能遇到DataWhale这么优秀的平台。加油加油!!!!
    在这里插入图片描述

  • 相关阅读:
    python入门基础知识
    python数据类型之集合
    python的文件操作
    python 整型,布尔值,字符串相关
    字典和解构初识
    python的小数据池和深浅拷贝
    学习相关的基础知识
    深入理解C指针之一(概念)By kmalloc
    mknod命令及低级文件操作函数
    深入理解C指针之二(数组和指针的关系)By kmalloc
  • 原文地址:https://www.cnblogs.com/Jack-Tim-TYJ/p/12831928.html
Copyright © 2011-2022 走看看