通过Amazon Machine Learning建立一个数值回归模型

实际生产中,业务经常会碰到预测未来值的情况。预测可以帮助进行更好的资源规划及业务决策制定。通常情况下,鉴于无法承受如数值回归等复杂模型所带来的开销,机构安于使用过去一阶段平均值并附加一些假想变化这种廉价的模式。

本篇博文以自行车租赁程序为例,预测一个特定城市每个小时的自行车需求。在这个情景中,你需要机器学习模型来基于一组特征(或者predictor)来预测一个值。在这里,你将基于 Kaggle上开放的一些数据来建立一个回归模型。通过学习建立这个模型,你可以在自己的场景中应用自己的机器学习。

分析和机器学习的区别

自行车租赁程序可以很好地描述分析系统在做精准预测时的限制所在。Kaggle参赛者之一建立了下面这个网页来分析所提供的数。如果你点击Plots标签,你可以看到一个使用R建立的数据可视化。Shiny是一个很流行的免费分析软件,同时也是R非常流行的一个网络接口,详情访问View Bike Sharing Demand页面。

这张图显示了工作日与假期中人们对自行车的不同需求,峰值时间是8点和17点。同时,你还可以做一些更深度的挖掘,比如对比注册用户和游客的不同。数据可视化显示了临时用户更喜欢在周末和周一租车,而注册用户则更喜欢在工作日租车。

这也就是说,通过上面的可视化操作,你可以预测自行车租赁服务的使用率。然而,在这之外,是否还有其他因素影响着预测结果?比如天气、假日等。在加入这些附加因素后,预测将变得异常复杂,这也就是我们转向机器学习的原因。

为建立机器学习模型准备数据

如果想建立一个成功的机器学习模型,首先你需要找到合适的数据。其核心思想就是“Garbage-In-Garbage-Out”(或者“Gold-In-Gold-Out”,取决于你的看法”)。在特征识别过程中,专业知识可以帮助你判定是否要针对某个特征进行训练。

在上面的例子中,你看到了工作日和周末对结果产生了重要的影响。在自行车使用上,你同样看到了天气的影响重大,下雨或者冷空气来袭时,人们可能很少租车。我们可以很简单的取得历史天气信息,以及未来几日的天气预报。Kaggle上的竞赛组织者准备了以下的一些数据:

datetime - hourly date + timestamp 
season -  1 = spring, 2 = summer, 3 = fall, 4 = winter
holiday - whether the day is considered a holiday
workingday - whether the day is neither a weekend nor holiday
weather - 1: Clear, Few clouds, Partly cloudy, Partly cloudy
2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist
3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light
Rain + Scattered clouds
4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog
temp - temperature in Celsius
atemp - "feels like" temperature in Celsius
humidity - relative humidity
windspeed - wind speed
casual - number of non-registered user rentals initiated
registered - number of registered user rentals initiated
count - number of total rentals

列表最下方显示了你需要预测的3个数字:临时用户租赁的数量,注册用户租赁的数量,以及租赁的总数量。鉴于总数量是前两个数字之和,同时你也清楚临时用户和注册用户的行为区别,你需要分别建立两个不同的模型进行预测。

你可以使用不同的工具来处理CSV文件的列,比如Microsoft Excel或者RStudio IDE,它们在数据科学家群体中非常流行。在本篇博文中,你将使用cut、sed和awk来维护数据。

首先需要做的就是对训练数据的行进行shuffle,从而移除数据中任何可能存在的顺序,它们都可能让机器学习模型产生偏差。

# shuffle the lines except for the first header line
tail -n+2 train.csv | gshuf -o BikeShareTrainData.csv
# Add the header line from the original file as the first line of the
shuffled file
head -1 train.csv | cat - BikeShareTrainData.csv > temp && mv temp BikeShareTrainData.csv

为了给预测临时用户租赁建立一个训练数据模型,你需要去掉原始训练数据文件的最后两列(registered和count)。在一个为临时用户新建立的数据文件中使用cut和定界符“,”来存储前10个字段:

cat BikeShareTrainData.csv | cut -d',' -f1-10 > BikeShareCasualTrainData.csv

为注册用户预测重复相同的步骤,通过去掉第十个字段(casual)保留第十一个字段(registered):

cat BikeShareTrainData.csv | cut -d',' -f1-9,11 > BikeShareRegisteredTrainData.csv

为了训练这个模型,你需要将文件上传到Amazon S3。在与训练模型运行的AWS region中建立一个bucket,并使用AWS CLI将数据拷贝到这个bucket中。

aws s3 cp BikeShareCasualTrainData.csv s3://<BUCKET_NAME>/ML/input/ --region us-east-1
aws s3 cp BikeShareRegisteredTrainData.csv s3://<BUCKET_NAME>/ML/input/ --region us-east-1

在后续的预测中,请确保你已经移除了你不需要的数据。举个例子,如果你没有移除训练数据中的 casual和registered 字段并预测计数变量,那么模型将变得非常简单,它会简单地把两个变量相加,然后忽视天气和其他feature。

在Amazon ML控制台,将数据源指向你刚上传到Amazon S3的训练数据。随后,为数据定义和优化一个模式。

填写season变量,由数字来表示季节(比如春天为1,夏天为2),同时在数据类型中将其标识为类别而非数值。数值变量拥有一个值来描述可被数字度量的量,比如“how many或者how much”。如果你清楚某个特殊的数字代表的不是量,那么在数据类型中将其定义为category 类型更好些。下一步,选择机器学习模型需要预测的目标:

在这个模型中,选择casual变量作为预测目标。服务会将识别成一个数字,并提示它会使用数值回归。在下个界面中选择默认配置,并开始建立流程。建立流程需要花费数分钟的时间,具体时间取决于数据的大小。在后续工作中,你可能发现很多更好的途径来建立模型,但是对于新手来说使用简单和默认的选项显然更好一些。

评估机器学习模型

模型被建立后,你就可以对其进行评估;如果你使用了简单和默认的途径创建流程,那么评估将自动进行。使用非训练数据来测试模型评估非常重要。默认的简单模式下,Amazon ML通过对数据进行随机划分完成这个步骤,70%的数据用来训练,余下的进行评估。当然,你可以根据自己的需求对数据进行划分。

模型的评估结果会产生numeric value 和一个可视化图表。对于一个数值回归来说,numeric value也就是均方根误差(RMSE)。在这里,RMSE数值越小,预测产生的误差就越小,也就代表建立的模型越合适。在这个例子中,取平均值得到的RMSE是49,而数值回归的RMSE是39。

同时,你同样可以评估每个变量对预测目标的影响(temp、windspeed、working day等等):在这个例子中,就是临时或者注册用户租赁。

如图中所示,值越高越有帮助产生更好的预测结果。在这个例子中,对于临时用户来说,atemp(类似温度)拥有一个0.32的值,而风速的影响只是0.01。而有意思的是,datatime也占一个0.21比重。

mazon同样可以分析文本字段,提取类似01、02、03等标记作为模型的预测因子。

现在,你可以决定是使用原始模型,还是通过获得更低的RMSE来对其进行提升。现在,你就可以从datetime中抽取hour(特征抽取操作),随后服务会议一个合适的方式来完成这个操作。以此类推,你也可以从week或者month中抽取day。下面是一个示例脚本,它会将某周中的某天加入变量,并将它复制到临时用户训练集:

每个特征的转换都可能潜在地提升模型精度,因此专家可以识别出究竟需要增加哪个变量。

awk 'NR>1{system("date -j -f \"%Y-%m-%d\" " $1 " +%A")}' BikeShareTrain.csv >
BikeShareTrainDoW.csv
paste -d "," BikeShareTrainDoW.csv BikeShareCasualTrain.csv > BikeShareCasualDoW.csv

使用ML模型进行批预测

在得到了所需模型后,你可以开始使用它来进行预测。当规模大或者实时性要求较高时,我们可以进行批预测。

在作业结束后,通常是数分钟,下载批预测产生的结果。在提交结果之前,对所有预测值(临时+注册)进行求和以获得每个小时需要出租的自行车总量。

你可以通过下述代码进行:

paste casual_batch.out registered_batch.out | awk '$1+$2>0 {print int($1 + $2); next} {print "0"}' > bike_share_sub_test.csv

原文发布于微信公众号 - 人工智能头条(AI_Thinker)

原文发表时间:2015-05-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏IT派

如何用 OpenCV、Python 和深度学习实现面部识别?

这篇文章首先将简单介绍下基于深度学习的面部识别的工作原理,以及“深度度量学习”(deep metric learning)的概念。接下来我会帮你安装好面部识别需...

1524
来自专栏大数据文摘

如何用Python在10分钟内建立一个预测模型

4299

根据职位说明使用机器学习来检索相关简历

我们使用平均词嵌入(AWE)模型基于职业描述来检索相关的CV。我们在这提供了一个循序渐进的指南,通过使用西班牙语的文件(简历)训练,将已训练的领域词嵌入与预先训...

3618
来自专栏大闲人柴毛毛

10分钟搞懂蚁群算法

蚂蚁几乎没有视力,但他们却能够在黑暗的世界中找到食物,而且能够找到一条从洞穴到食物的最短路径。它们是如何做到的呢? 蚂蚁寻找食物的过程 单只蚂蚁的行为及其简单...

3.3K14
来自专栏大数据文摘

R的基本绘图功能

1795
来自专栏码神联盟

图像识别 | 使用 Java 实现AI人工智能技术-图像识别功能

说到语音识别、语音翻译、图像识别、人脸识别等等,现在已经非常非常非常普及了,看过‘最强大脑’的朋友,也应该对‘小度’这个机器人有所了解,战胜国际顶尖的‘大脑’-...

1.2K4
来自专栏数据派THU

一招检验10大深度学习框架哪家强!

来源:机器之心 本文长度为2698字,建议阅读4分钟 本文通过构建同一个神经网络,对比当前最流行的 10 种深度学习框架。 [ 导读 ]近日,Ilia Karm...

1807
来自专栏企鹅号快讯

外国网友如何使用机器学习将邮件分类?其实很简单

AiTechYun 编辑:Yining 背景:一名叫做Anthony Dm.的外国网友试图利用机器学习将一堆未标记的电子邮件进行分类,以下是他对这次操作发表的文...

2238
来自专栏机器之心

资源 | DeepPavlov:一个训练对话系统和聊天机器人的开源库

选自GitHub 机器之心编译 参与:思源、刘晓坤 本文介绍了一个构建端到端对话系统和训练聊天机器人的开源项目 DeepPavlov,该开源库的构建基于 Ten...

3884
来自专栏人工智能头条

东北大学研究生:用强化学习玩Chrome里的恐龙小游戏

1895

扫码关注云+社区

领取腾讯云代金券