在 《【Get】用深度学习识别手写数字》 中,我们通过一个手写数字识别的例子,体验了如何使用 深度学习 + tensorflow 解决一个具体的问题。
实际上,这是一个分类问题,即将输入的图片数据分成 0-9 共 10 个类别,而且我们的数据都是直接使用 MNIST 上下载的处理好的数据。
在现实生产中,我们的数据源通常来自于数据库,是没有经过预处理的,那么我们该做些什么来让这些数据库里的数据能够用于进行机器学习呢?
机器学习的前置步骤,数据预处理就是解决这个问题的。
本篇 CoorChice 将会通过一个回归预测问题,来展示如何进行这个过程。
原始数据
我们用于机器学习的数据的量不能太少,否则训练效果会极差。但是我们个人如何才能获取到大量的数据来进行训练呢?
CoorChice 推荐 kaggle:https://www.kaggle.com/datasets,这是全球最大的数据科学社区和数据竞赛平台。在这个美妙的地方,我们可以轻松的找到各种各样的,海量的,精彩绝伦的数据。
打开链接就可以看到海量的数据,我们很随意的选择其中一个数据源来进行训练。
就选第一条吧!
第一条数据是关于一个面包店的交易的数据。点击进入后,找到下载就可以下载这套数据了。
也许你可能不能立刻下载,因为他会要求你先登录。那就成为 Kaggle 的会员吧。
我们使用表格打开刚刚下载的数据观察观察。
My God! 这是一堆简陋不堪的数据,共有 21293 条数据,每条只有 4 个特征! 4 个特征! 4 个特征!
没关系,我们只是学习如何处理数据的过程,所以就凑合着用一下吧。
开始数据处理
实际上,通常我们的数据呆在数据库中,就是这种表格的形式。
在开始之前,需要先安装一下 Pandas 这个 Python 库,它被用来读取我们的表格数据,和进行增、删、改、查等操作。
下好了,我们就开始吧…
观察数据
进行数据处理最重要的一步,就是对数据进行观察和分析。通过观察和分析,我们要除去一些无关紧要的数据列,比如在预测天气预报的时候,我们就应该把 ‘李雷早上吃了什么’ 这个数据列去掉,因为对模型训练毫无帮助。
同时,我们要从数据中挖掘出一些隐藏的信息,以扩充特征。日入在预测产品的交易信息时,我们从日期这个数据列,就能知道当天是否是一个节日,是什么节日。
在我们下载的这堆面包店的交易数据中,仅有惨不忍睹的 4 个类目!
通常,当我们使用机器学习来解决问题时,都会有一个目的。比如,在这堆数据中,CoorChice 希望通过机器学习训练一个模型,能够用于预测未来一定条件下的某种类型的面包所能达到的交易量是多少。
因此,我们将交易量 Transaction 这一列数据作为数据集的标签数据。
接下来剩下的只有 日期、时间、面包类目
这三个特征了。
从数据中挖掘更多的信息
仅有这三个特征来进行训练,结果可想而知会有多差。比你想的差还要差,所以我们需要从现有的数据中挖掘出更多的信息来。比如,在图片数据中,通常会进行一些旋转、平移之类的操作,来补充数据量。
日期 Date
首先看看日期能挖掘到什么有用的信息?
-
当然是星期啦。今天是星期一、星期二、…、对交易肯定是有影响的。我们通过 Date 可以计算出当前日期是周几。
-
还有什么可挖掘的吗?嗯,左思右想…咦,节日肯定也是影响面包交易量的一个重要因素,有了 Date 我们也能知道当前日期是什么节日。
-
然后,通过观察可以发现,随着日期的增加,交易量也是在累加的,所以日期的大小也可直接作为一个特征。
-
由于 CoorChice 要尝试预测的是未来某个时间、某种面包所能达到的交易量,所以日期的大小对结果必然是有影响的。但我们不能直接将日期转换为一个形如
20161030
这样的数字,因为一年只有 12 个月,每一个月天数不一样的,所以这个数值跳跃度比较大,这样就大大增加了训练的难度和准确率。我们需要的是一个统一标准的数值。如果确定某一天为基准,然后把日期转换为和这一天的距离,那量化标准自然就是很明了的了。因为数据是从2016-10-30
开始,那么把这天作为基准日就再合适不过了。
时间 Time
接下来观察 Time 有什么可用的没。
-
Time 本身是一些比较密集的数据,间隔不大。我们可以把它划归到小时里,因此就会有 24 个小时。比如,“10:13:03” 就让它属于 10 点这个小时吧。
-
通过时间,我们还可以知道现在是处于
早晨、上午、中午、下午、傍晚、晚上、深夜
中的那个时间段。不同的时间段或多或少也会影响交易量。
确定好了思路,接下来就开始找着这个思路处理数据了。
处理原始数据
处理数据的第一步当然是先读取数据啦,我们前面下载的 Pandas 就使用来干这个的。
读取数据
# 读取数据
datas = pd.read_csv('data/BreadBasket_DMS.csv')
读取数据后,输出一下看看长什么样子。
print(datas.head())
->>
Date Time Transaction Item
0 2016-10-30 09:58:11 1 Bread
1 2016-10-30 10:05:34 2 Scandinavian
2 2016-10-30 10:05:34 2 Scandinavian
3 2016-10-30 10:07:57 3 Hot chocolate
4 2016-10-30 10:07:57 3 Jam
[5 rows x 4 columns]
增强数据
然后,我们对原始数据按照上面分析的思路进行处理。
# 挖掘,周几对交易量的影响
datas['Weekday'] = datas['Date']
datas['Weekday'] = datas['Weekday'].map(lambda x: get_weekday(x))
# 挖掘,各个节日对交易量的影响
datas['Festival'] = datas['Date']
datas['Festival'] = datas['Festival'].map(lambda x: get_festival(x))
# 挖掘,当前所处的时间段对交易量的影响
datas['Time_Quantum'] = datas['Time']
datas['Time_Quantum'] = datas['Time_Quantum'].map(lambda x: get_time_quantum(x))
# 将 Date 一列变为与 2016-10-30 这天的距离
datas['Date'] = datas['Date'].map(lambda x: get_delta_days(x))
# 将时间转变为时段
datas['Time'] = datas['Time'].map(lambda x: get_time_range(x))
# 缩小数据大小
datas['Transaction'] = datas['Transaction'].map(lambda x: (float(x) / 1000.))
现在,再输出一下数据看看。
print(datas.head())
->>
Date Time Transaction ... Weekday Festival Time_Quantum
0 0.0 9 0.001 ... 6 null 上午
1 0.0