智慧中国杯百万大奖赛解读 | 精准资助机器学习(三)
2016-12-26 00:00
281 查看
通过前面两篇的数据探索,我们对教育精准资助的数据已经有所了解了,接下来我们就要建立模型来进行机器学习了。对于机器学习这个事还真是挺有意思,写的深了会让大家觉得太难,打消大家学习的积极性;写的太浅又没办法深入本质真正进入到机器学习的世界里,这也是本篇文章和前两篇间隔时间这么长的原因之一。
思来想去还是要照顾哪些真正想从事数据分析行业的人群,以通俗易懂的方式结合精准资助的数据来介绍机器学习,建立他们对机器学习的信心,让他们通过使用FEA,知道机器学习也就那么回事!
如果你已经是老司机,可以绕道了。
一、机器学习之分类概况
大千世界中“人以类聚,物以群分”,就是指具有相同(或相近)特征的事物总是归于一类或者说能聚在一起的事物总是拥有相同(或相近)的特征。
机器学习最基本的研究就是解决分类问题,比如哪些邮件是垃圾邮件,哪些邮件是正常邮件,哪些访问(日志)是正常的,哪些访问是不正常的。对于我们这次教育竞赛来讲就是要分出哪些人需要资助1000,哪些人需要资助1500,哪些人需要资助2000,哪些人不需要资助的问题。
解决这些问题最常规的办法是编写规则条件,满足某个条件是什么类,满足另外的条件是什么类。当问题复杂到一定程度,即不能写出明确的规则或者规则很复杂时就可以考虑用机器学习的方法来解决。
那么机器又是如何学习的呢?看下图:
首先,机器学习是要数据的,而且是两类数据:一类能标识人(和物)的特征数据,如每一人的消费次数,消费总额,单笔最大等等;另一类则是标记了人的分类的答案数据(或标记数据),就是需要人根据经验来告诉机器哪些人是一类的,哪些物是一类的。这样再选择合适的算法,让机器来学习。给的数据越多,机器就学习的越多,机器就会变得越”聪明“。我们把这个机器学习的过程叫做训练,训练的结果就是模型。有了这个模型后,就可以进行预测,看下图:
首先是要预测的数据的格式和特征数据的格式一样,不能添加或减少特征,也不能变更特征的名称和顺序,然后使用模型来预测,最后就会得到预测结果。
整个机器学习的过程就是这样了,还简单吧,下面我们就用教育资助的数据操练起来。
二、机器学习过程
(一)数据准备
精准资助主要集中反映在日常的消费数据中,我们先使用消费数据来构造特征数据和标记数据(答案数据)。
特征数据的一个要求是使用一行来描述一个对象(人或物),对象是不重复的,特征数据均为数字类型,不能出现其他类型,如果是字典类型,如性别男女也应该用0,1表示。
标记数据的要求是和特征数据一一对应,同样一行代表一个人(或物),标记需要使用整数形,一个数代表了一个分类。这里的专业叫法是标称型(变量),取值是有限的整数,不能是小数(分类再多总有个最大值的,小数就不知道是哪一类的了,呵呵)。和标称型对应的是数值型,如果标记的答案是数值型的,那就不是分类问题了,与之相对应的是机器学习的另一类应用回归。
以同学ID为对象来计算消费特征数据。
#加载一卡通训练数据
card := load csv by match/fund/card_train.csv with (header=-1)
#修改列名
rename card as (0:"id",1:"pos",2:"address",3:"catalog",4:"time",5:"cost",6:"have")
#根据id进行分组
gt2 = group card by id
#计算每个人的消费情况,消费总额,单次最大消费,单词最小消费,消费均值,消费中位数,消费次数
card_cost = agg gt2.cost by (cost_sum:sum,cost_max:max,cost_min:min,cost_mean:mean,cost_meidan:median,cost_count:count)
#然后卡内计算剩余金额的,最大,最小,平均
card_have = agg gt2.have by (have_max:max,have_min:min,have_mean:mean,have_median:median)
#两张合起来,一个人的消费状况就非常清晰了
card_money = join card_cost,card_have by index
#查查
dump card_money
计算资助金额标记数据
#加载助学金发放训练数据
stn = load csv by match/fund/subsidy_train.csv with (header=-1)
#修改列名
rename stn as (0:"id",1:"money")
#设置id列为索引
stn = @udf stn by udf0.df_set_index with id
#查看数据
dump stn
(二)选择算法
有了特征数据和标记数据,接下来我们就要选择算法了,FEA支持的分类算法有以下几种:
也许你该问了,这么多算法我该使用哪个呢?这就和你的数据息息相关了,这也是个经验的问题。
而在实际的工程中,我们往往会使用多种分类器,来比较一下分类的效果再做选择。那你也许又该说了,这么多算法一个一个试下来,不是很麻烦吗。呵呵,FEA想你之所想,在新的版本中FEA将添加自动分类功能,自动进行多种分类器的训练并打分,有你来选择适合你的一款。
本次我们使用gbdt分类器和svm来做下面的实验。
(三)训练模型
训练数据构建模型
#设置工作区
use edu
#使用gbdt算法构建模型和训练数据,一步完成
gbdt = @udf card_money,stn by ML.gbdt
#评估模型
score = @udf card_money,stn by ML.score with (gbdt@edu)
#查看结果
dump score
结果的取值在0到1之间,代表预测的准确度,最大为1,准确度100%,千万不要看到1就很开心哦,很多情况下1代表了预测结果和你的数据完全拟合,或者说拟合,当真的有新数据来预测时,反而很不准。
可以换一个算法试试:
#设置工作区
use edu
#使用gbdt算法构建模型和训练数据,一步完成
model = @udf card_money,stn by ML.svm
#评估模型
score = @udf card_money,stn by ML.score with (model@edu)
#查看结果
dump score
上述的过程中有可能会失败,一定要确保card_money的数据中没有空值,card_money和stn的行一一对应(数量一致,关连一致)。因为有资助的不一定有消费,有消费的不一定出现在名单中。
简单的处理办法可以采用如下方式:
#还原index为id列
card_money= @udf card_money by udf0.df_reset_index
stn = @udf stn by udf0.df_reset_index
#以资助名单为准关联消费记录
a = @udf stn,card_moneyby udf0.df_ljoin with (id,id)
#填充空值为-1
a = @udf a by udf0.df_fillna with -1
#选出新的特征数据和标记数据
stn = loc a by id,money
card_money= @udf a by udf0.df_drop_col with money
#重设index
stn = @udf stn by udf0.df_set_index with id
card_money= @udf card_moneyby udf0.df_set_index with id
(四)机器预测
模型构建训练好后我们就可以来进行预测了,预测数据和特征数据的计算方法一样,我就不在这里详细描述了。
预测数据的文件为match/fund/card_train.csv
预测的人员文件为match/fund/studentID_test.csv
假定预测数据的DF标为card_1,则预测过程如下:
#使用gbdt模型预测
stt = @udf card_1 by ML.predict with (gbdt@edu)
#使用svm模型预测
stt2 = @udf card_1 by ML.predict with (model@edu)
#查看结果
dump stt
dump stt2
是不是很简单?
没错,照上面的步骤玩下来,你就完成了机器学习的基本过程,就对机器学习就有了初步的了解。
(五)保存模型
机器学习是不是每次都得经过上述步骤(准备数据、训练模型、预测)才能应用呢?
不是的!
当我们训练好一个模型后,可以将模型保存下来,可以分发和部署到新的环境(机器)中直接进行预测,而不用重复训练过程,具体的语句如下:
#保存gbdt模型预测
mfile = @udf df0@sys by ML.save_model with (gbdt@edu)
#保存svm模型预测
mfile2 = @udf df0@sys by ML.save_model with (model@edu)
#查看下载模型
dump mfile
然后就可以到数据目录里下载此模型文件。
发布模型和此相反,先上传模型文件到数据目录里,然后执行load_model函数,具体如下:
#装载模型
model = @udf df0@sys by ML.load_model with (8805e608-c841-11e6-9b72-780cb86c4f4e.zip)
三、小结
本文以通俗易懂的方式结合教育精准资助数据讲解了机器学习的典型过程,为还在机器学习大门口徘徊的人们点亮了一盏明灯,不要犹豫不要徘徊,机器学习,你可以的!
对于机器学习的一些高级话题,如特征选取,参数设置,过采样等将在后续的系列中进行探讨和交流,教你如何打造一个准确率和召回率等都满足实战的模型。
在此也和大家叮嘱一下,模型的优化是无止境的,要耗费大量的脑力和体力。
FEA准备好了,你准备好了吗?
思来想去还是要照顾哪些真正想从事数据分析行业的人群,以通俗易懂的方式结合精准资助的数据来介绍机器学习,建立他们对机器学习的信心,让他们通过使用FEA,知道机器学习也就那么回事!
如果你已经是老司机,可以绕道了。
一、机器学习之分类概况
大千世界中“人以类聚,物以群分”,就是指具有相同(或相近)特征的事物总是归于一类或者说能聚在一起的事物总是拥有相同(或相近)的特征。
机器学习最基本的研究就是解决分类问题,比如哪些邮件是垃圾邮件,哪些邮件是正常邮件,哪些访问(日志)是正常的,哪些访问是不正常的。对于我们这次教育竞赛来讲就是要分出哪些人需要资助1000,哪些人需要资助1500,哪些人需要资助2000,哪些人不需要资助的问题。
解决这些问题最常规的办法是编写规则条件,满足某个条件是什么类,满足另外的条件是什么类。当问题复杂到一定程度,即不能写出明确的规则或者规则很复杂时就可以考虑用机器学习的方法来解决。
那么机器又是如何学习的呢?看下图:
首先,机器学习是要数据的,而且是两类数据:一类能标识人(和物)的特征数据,如每一人的消费次数,消费总额,单笔最大等等;另一类则是标记了人的分类的答案数据(或标记数据),就是需要人根据经验来告诉机器哪些人是一类的,哪些物是一类的。这样再选择合适的算法,让机器来学习。给的数据越多,机器就学习的越多,机器就会变得越”聪明“。我们把这个机器学习的过程叫做训练,训练的结果就是模型。有了这个模型后,就可以进行预测,看下图:
首先是要预测的数据的格式和特征数据的格式一样,不能添加或减少特征,也不能变更特征的名称和顺序,然后使用模型来预测,最后就会得到预测结果。
整个机器学习的过程就是这样了,还简单吧,下面我们就用教育资助的数据操练起来。
二、机器学习过程
(一)数据准备
精准资助主要集中反映在日常的消费数据中,我们先使用消费数据来构造特征数据和标记数据(答案数据)。
特征数据的一个要求是使用一行来描述一个对象(人或物),对象是不重复的,特征数据均为数字类型,不能出现其他类型,如果是字典类型,如性别男女也应该用0,1表示。
标记数据的要求是和特征数据一一对应,同样一行代表一个人(或物),标记需要使用整数形,一个数代表了一个分类。这里的专业叫法是标称型(变量),取值是有限的整数,不能是小数(分类再多总有个最大值的,小数就不知道是哪一类的了,呵呵)。和标称型对应的是数值型,如果标记的答案是数值型的,那就不是分类问题了,与之相对应的是机器学习的另一类应用回归。
以同学ID为对象来计算消费特征数据。
#加载一卡通训练数据
card := load csv by match/fund/card_train.csv with (header=-1)
#修改列名
rename card as (0:"id",1:"pos",2:"address",3:"catalog",4:"time",5:"cost",6:"have")
#根据id进行分组
gt2 = group card by id
#计算每个人的消费情况,消费总额,单次最大消费,单词最小消费,消费均值,消费中位数,消费次数
card_cost = agg gt2.cost by (cost_sum:sum,cost_max:max,cost_min:min,cost_mean:mean,cost_meidan:median,cost_count:count)
#然后卡内计算剩余金额的,最大,最小,平均
card_have = agg gt2.have by (have_max:max,have_min:min,have_mean:mean,have_median:median)
#两张合起来,一个人的消费状况就非常清晰了
card_money = join card_cost,card_have by index
#查查
dump card_money
计算资助金额标记数据
#加载助学金发放训练数据
stn = load csv by match/fund/subsidy_train.csv with (header=-1)
#修改列名
rename stn as (0:"id",1:"money")
#设置id列为索引
stn = @udf stn by udf0.df_set_index with id
#查看数据
dump stn
(二)选择算法
有了特征数据和标记数据,接下来我们就要选择算法了,FEA支持的分类算法有以下几种:
也许你该问了,这么多算法我该使用哪个呢?这就和你的数据息息相关了,这也是个经验的问题。
而在实际的工程中,我们往往会使用多种分类器,来比较一下分类的效果再做选择。那你也许又该说了,这么多算法一个一个试下来,不是很麻烦吗。呵呵,FEA想你之所想,在新的版本中FEA将添加自动分类功能,自动进行多种分类器的训练并打分,有你来选择适合你的一款。
本次我们使用gbdt分类器和svm来做下面的实验。
(三)训练模型
训练数据构建模型
#设置工作区
use edu
#使用gbdt算法构建模型和训练数据,一步完成
gbdt = @udf card_money,stn by ML.gbdt
#评估模型
score = @udf card_money,stn by ML.score with (gbdt@edu)
#查看结果
dump score
结果的取值在0到1之间,代表预测的准确度,最大为1,准确度100%,千万不要看到1就很开心哦,很多情况下1代表了预测结果和你的数据完全拟合,或者说拟合,当真的有新数据来预测时,反而很不准。
可以换一个算法试试:
#设置工作区
use edu
#使用gbdt算法构建模型和训练数据,一步完成
model = @udf card_money,stn by ML.svm
#评估模型
score = @udf card_money,stn by ML.score with (model@edu)
#查看结果
dump score
上述的过程中有可能会失败,一定要确保card_money的数据中没有空值,card_money和stn的行一一对应(数量一致,关连一致)。因为有资助的不一定有消费,有消费的不一定出现在名单中。
简单的处理办法可以采用如下方式:
#还原index为id列
card_money= @udf card_money by udf0.df_reset_index
stn = @udf stn by udf0.df_reset_index
#以资助名单为准关联消费记录
a = @udf stn,card_moneyby udf0.df_ljoin with (id,id)
#填充空值为-1
a = @udf a by udf0.df_fillna with -1
#选出新的特征数据和标记数据
stn = loc a by id,money
card_money= @udf a by udf0.df_drop_col with money
#重设index
stn = @udf stn by udf0.df_set_index with id
card_money= @udf card_moneyby udf0.df_set_index with id
(四)机器预测
模型构建训练好后我们就可以来进行预测了,预测数据和特征数据的计算方法一样,我就不在这里详细描述了。
预测数据的文件为match/fund/card_train.csv
预测的人员文件为match/fund/studentID_test.csv
假定预测数据的DF标为card_1,则预测过程如下:
#使用gbdt模型预测
stt = @udf card_1 by ML.predict with (gbdt@edu)
#使用svm模型预测
stt2 = @udf card_1 by ML.predict with (model@edu)
#查看结果
dump stt
dump stt2
是不是很简单?
没错,照上面的步骤玩下来,你就完成了机器学习的基本过程,就对机器学习就有了初步的了解。
(五)保存模型
机器学习是不是每次都得经过上述步骤(准备数据、训练模型、预测)才能应用呢?
不是的!
当我们训练好一个模型后,可以将模型保存下来,可以分发和部署到新的环境(机器)中直接进行预测,而不用重复训练过程,具体的语句如下:
#保存gbdt模型预测
mfile = @udf df0@sys by ML.save_model with (gbdt@edu)
#保存svm模型预测
mfile2 = @udf df0@sys by ML.save_model with (model@edu)
#查看下载模型
dump mfile
然后就可以到数据目录里下载此模型文件。
发布模型和此相反,先上传模型文件到数据目录里,然后执行load_model函数,具体如下:
#装载模型
model = @udf df0@sys by ML.load_model with (8805e608-c841-11e6-9b72-780cb86c4f4e.zip)
三、小结
本文以通俗易懂的方式结合教育精准资助数据讲解了机器学习的典型过程,为还在机器学习大门口徘徊的人们点亮了一盏明灯,不要犹豫不要徘徊,机器学习,你可以的!
对于机器学习的一些高级话题,如特征选取,参数设置,过采样等将在后续的系列中进行探讨和交流,教你如何打造一个准确率和召回率等都满足实战的模型。
在此也和大家叮嘱一下,模型的优化是无止境的,要耗费大量的脑力和体力。
FEA准备好了,你准备好了吗?
相关文章推荐
- 康诺云推出三款智能硬件产品,为健康管理业务搭建数据池
- MySQL中使用innobackupex、xtrabackup进行大数据的备份和还原教程
- php+ajax导入大数据时产生的问题处理
- C# 大数据导出word的假死报错的处理方法
- 用Python实现协同过滤的教程
- Python利用多进程将大量数据放入有限内存的教程
- mongodb常遇到的错误。
- Stack数据结构的特点后进先出的应用:大数据运算
- Spark机器学习(一) -- Machine Learning Library (MLlib)
- Spark机器学习(二) 局部向量 Local-- Data Types - MLlib
- Spark机器学习(三) Labeled point-- Data Types
- YARN或将成为Hadoop新发力点
- Hadoop 1.x版本伪单机配置
- Glusterfs的编译选项 #pragma GCC poison system popen
- 企业开发-Akka配置文件的动态更新
- Python 大数据思维导图
- elk 简单实用
- Spark HA部署方案
- Spark HA原理架构图