MachineLearning

玩转大数据也许真的可以离开Hadoop?

之前在学习大数据相关的内容,技术坑很多,水很深。偶然间在一位博主的博客中看到了Tablesaw这款开源工具,号称「MAKING BIGDATA SAMLL AGAIN」,觉得很神奇,遂前去一探究竟。

Tablesaw简介
引用官网的一段介绍:

Tablesaw is a high-performance, in-memory data table in Java.
Tablesaw’s design is driven by two ideas: First, few people need distributed analytics. On a single server, Tablesaw lets you work interactively with a 2,000,000,000 row table. (I plan to raise that ceiling, btw.) Second, it should be super easy to use: To that end I happily steal ideas from everything from spreadsheets to specialized column stores like KDB.

我们来总结下,Tablesaw设计初衷有以下两条:

  1. 作者认为很少有人真的需要进行分布式计算分析,在单台服务器上「Tablesaw」能支持最多20亿条数据,似乎在大多数情况下都能满足用户的计算需求;
  2. 大数据工具应该简单易用,费大把劲去搭建大数据集群估计已经吓退一拨人。

从本质上而言,我们发现「Tablesaw」就是一款基于内存,使用纯java实现的big spreadsheet。嗯,我相信你一定使用过Excel。

Tablesaw主要功能
既然Tablesaw宣称自己简单好用,那到底支持哪些功能呢,笔者新建了一个Maven工程玩了一把,貌似有以下功能:

  • Import data from RDBMS and CSV files, local or remote (http, S3, etc.)
  • Add and remove columns
  • Sort
  • Filter
  • Group
  • Map and reduce operations
  • Descriptive stats (mean, min, max, median, etc.)
  • Plotting for exploratory data analysis and model checking
  • Store tables in a very-fast, compressed columnar storage format

在试用过程中有几点 事项说明 下:

  1. 在数据量不大的情况下,执行简单的查询操作速度很快,不像在Hive中做一个非常简单的查询都会转化成一个MapReduce作业在Hadoop集群上跑几十秒时间(当然你可以通过set hive.fetch.task.conversion=more ,使得简单的查询不会被转化成MapReduce作业);
  2. Tablesaw支持的功能还非常有限,对于复杂的组合查询会很吃力,甚至可能都做不到,Tablesaw作者在博客中强调未来会支持更多的列类型,支持更多的操作,同时把常用的机器学习算法的实现也引入进来,对于未来的设想我们拭目以待;
  3. 在借助Tablesaw做数据展示的时候,使用的是XCharts

Tablesaw适用场景
简单介绍了Tablesaw的主要功能以及未来的设想,其实我更关注的是如何与我们现有的应用场景进行结合,或者说Tablesaw在哪些场景下会比较适用,大致能想到的有以下两个领域:

  1. 作为缓存器,对于热点数据我们从持久化的关系型数据库读到内存之后,可以马上对外提供计算查询的API;
  2. 对于数据分析师,数据科学家等以实验论证形式展开工作的一类人,对他们来讲有一款简单易用的大数据工具绝对是福音。

浅谈大数据技术与人工智能技术之间的关系

重读吴军博士的“智能时代-技术的拐点”章节有感,以及自己的一些思考。

大家似乎都有这样一个直观的感性认识,人工智能从2015,16年开始似乎又进入了一个快速的发展阶段,各种人工智能的概念性产品纷纷涌现,遍地开花,尤其是创业者,感觉到特别兴奋,纷纷想要打造出革命性的产品,改变世界,这个时候其实我们有一点纳闷,有一点疑惑,为什么一项已经发展了半个多世纪之久的人工智能技术在今天这个时间点能够被大家普遍接纳和采用,大家开始有能力去构建一个人工智能学习系统,呈现一种突破性的发展态势,我们肯定在想这背后发生了什么,是的!

这十几年来,还有一门技术非常火,那就是大数据技术,有人曾经这样形容大数据技术与人工智能技术的关系,说:

人工智能就像潜力无限的婴儿,而大数据是喂养婴儿的奶粉,奶粉的数量和质量决定了婴儿的智力发育水平。

那么这十几年以来,大数据技术取得了哪些突破性的进展,我们分成四个维度来分别看一下,如下图所示:

 

数据采集
数据采集说的是数据源的问题,分以下几点进行说明:
1. 随着全球软件业的蓬勃发展,越来越多的应用系统投入生产运行,系统本身产业的交易,日志等等数据是庞大的,这是第一个来源;
2. 随着各种智能设备以及可穿戴设备的普及,设备中部署的一个个sensor无时无刻不在自发的采集数据,这是其二;
3. 进入web2.0时代,尤其是在社交网络如此发达的今天,用户ugc产生的数据量呈指数级增长。

所以在今天这个时间点看来,数据已经不是多少的问题,而是如何好好利用的问题。

数据存储
数据存储分两点来看:
1. 根据摩尔定律,存储设备每隔18个月存储容量上升,成本下降。越来越多的服务提供商开始铺机器,建设一个个数据中心;
2. 存储设备更新迭代,由磁带过渡到机械硬盘,在发展到现今的固态硬盘,这里体现出来的是存储设备数据存取速度的极大提升。

数据传输
数据传输讨论的是如何把众多的数据源聚合到数据服务器上的问题,随着网络传输技术的发展,各种数据源通过千兆/百兆光纤网络,WiFi,4g网络等等完成数据的传递。

数据处理
这是我个人认为具有深刻意义的突破性进展,出现了并行计算框架,你很难想象Deepmind公司在训练AlphaGo的时候如果只用了一台服务器来跑他们的神经网络算法,那么试想完成一轮神经网络的迭代运算需要多久?一天、一星期、一个月、一年还是直接就趴下了,无论如何,至少我们会达成这样的共识:AlphaGo大胜李世石的局面不会这么早被我们见证,对吗?

所以,总结起来看,围绕大数据技术的这四个维度在各自方向上的突破性进展合力把大数据带到了一个技术拐点,同时再加上更优化的算法模型和更完备的海量数据共同推进了人工智能往前迈出了一大步,取得了突破性进展。

Evaluation Metrics of Spark Machine Learning

众所周知,SparkML组件提供了当前主流的机器学习算法实现,便于开发者在各个应用场景中选择合适的机器学习算法进行快速迭代验证。

当然在每个场景下我们都绕不过尝试多种机器学习算法,这就涉及到算法之间的横向比较,自然的我们会参考各类评测指标。

在有监督的学习下,对于每条输入数据<x1,x2,x3,…,xn>,算法模型都能给我们一个正样本或者负样本[二元分类]的预测输出值,结合测试样本中该条输入数据对应的label[正样本/负样本],我们一共能得到以下四种情况的组合:

  • True Positive (TP) – label is positive and prediction is also positive
  • True Negative (TN) – label is negative and prediction is also negative
  • False Positive (FP) – label is negative but prediction is positive
  • False Negative (FN) – label is positive but prediction is negative

 ps:在本文中我们主要讨论二元分类。

Binary Classification

二元分类旨在尽可能的把样本正确地分成两类,比如我们有一份关于病人是否患有癌症的数据集,在这样的应用场景中,借助二元分类算法模型,尽可能的把样本数据集一份为二,分别是患癌症的样本数据和不患癌症的样本数据。

如前所述,我们可能会选用多种分类算法,什么支持向量机/决策树/朴素贝叶斯/逻辑回归等等,那么如何来衡量这些分类算法模型哪个分类分的更好,这时我们就要借助以下指标进行衡量:


下面分别用文字来解释以上每个评测指标的含义,对于二元分类,我们首先约定用0代表负;1代表正[当然你也可以用-1代表负样本,1代表正样本,或者其他]。

Precision (Positive Predictive Value)

我们经常听到的查准率,即模型预测出正确1的个数在预测出1的个数中的比重。ps:如何来理解什么是正确的1,对于输入的每条测试样本,模型算法预测出1且在测试样本中该条输入对应的label也为1。

Recall (True Positive Rate)

我们经常听到的查全率,很好理解,即模型预测出正确1的个数在测试样本label为1的个数中的比重。正确1的理解同上。

F-measure

Precision和Recall经常会出现矛盾的地方,比如Precision很高,结果Recall很低,或者反之,这个时候我们会陷入评测困境,不知道选择哪个模型,这时我们可以引入另一个评测指标,F-measure也叫F-score,这个指标综合考虑了Precision和Recall,是这两个指标的调和平均值。

Receiver Operating Characteristic (ROC)

根据Wikipedia定义:

In statistics, a receiver operating characteristic curve, or ROC curve, is a graphical plot that illustrates the performance of a binary classifier system as its discrimination threshold is varied. The curve is created by plotting the true positive rate (TPR) against the false positive rate (FPR) at various threshold settings

官方定义中提到ROC曲线是关于TPR[TPR=TP/(TP+FN)]和FPR[FPR=FP/(FP+TN)]随着threshold(阈值)变化而变化形成的曲线图,如下图所示(来自wiki):


现在来认识下上图所示的ROC曲线,首先来了解这幅图中的四个点,分别是(0,1)、(0,0)、(1,0)和(1,1)。
(0,1)表示FPR=0,TPR=1表明这个二元分类模型是一个完美的分类器,能把测试样本中的样本数据完全正确的分类;
(0,0)表示FPR=0,TPR=0表明该模型把所有的测试样本全划分为负样本,即TP=FP=0;
(1,0)表示FPR=1,TPR=0表明该模型在测试样本中进行预测的时候完全预测错了,都预测出了跟样本label完全相反的结果,即TP=TN=0,是一个非常糟糕,完全不能用的模型;
(1,1)表示FPR=1,TPR=1表明该模型在预测时把所有的测试样本全划分为正样本,即TN=FN=0;

对上图中四个点进行分析可知,ROC曲线越往左上角靠近,模型分类的效果越好。

再来看y=x这条直虚线,它表明的含义是在没有分类模型的情况下,我们猜测某个样本属于某个分类的概率有多大,根据经验判断,在随机猜测的前提下,我们认为某个样本属于正样本/负样本的概率分别是0.5。

这样我们在判断模型分类效果好坏的时候有了一个基准线,如果ROC曲线在y=x的右下方,则直接可以认为这个分类模型完全不可用,还不如随机猜测的分类效果好,所以ROC曲线在y=x的左上方才有在实际生产中应用分类模型的意义,即由True Positive Rate轴, False Positive Rate轴和曲线形成的面积越大越好,更一般地,我们对模型分类效果的好坏有以下的一般划分标准。

  • 0.90-1.00 = excellent (A)
  • 0.80-0.90 = good (B)
  • 0.70-0.80 = fair (C)
  • 0.60-0.70 = poor (D)
  • 0.50-0.60 = fail (F)

如果我们考虑的是Precision和Recall随着Threshold变化而变化的情况,则我们得到如下图所示的曲线:


同样对上图中的四个点以及直线x+y=1进行分析可知,P-R曲线越靠近右上角,即Area Under Precision-Recall Curve越大,模型的分类效果越好。

ROC曲线和P-R曲线比较

既然现在我们有这么多的基础评测指标[Precision, Recall和F-Score],那为什么还要使用ROC和P-R曲线,尤其是我们倾向于使用ROC曲线,因为当测试样本中正负样本比例发现变化的时候,ROC曲线能够相对保持稳定,随着时间的推移,正负样本比例发现变化[正样本比负样本多很多,或者相反]更符合实际情况,摘取Fawcett, T. 在2006年发表的一篇文章[An introduction to ROC analysis. Pattern recognition letters]的一张实验比较图:


(a)和(c)表示ROC曲线,(b)和(d)表示P-R曲线,(a)和(b)表示在原始测试数据集[正负样本比较平衡]上的ROC和P-R曲线图;当把测试样本中的负样本扩大10倍之后,得到如图(c)和(d)所示的曲线图,我们能观察到(a)和(c)图中的ROC曲线相对保持不变,而(b)和(d)曲线变化非常大。
所以我们得出的结论是用ROC曲线来评测模型更加稳定,不会因为正负样本比例的变化而剧烈波动,从而导致我们可能考虑选用其他的模型。

下面我们以ROC曲线为例来说明曲线是如何画出的。

ROC曲线如何绘制

假设我们的分类模型在数据集大小为10[当然实际情况远远大于此]的测试样本上做预测,得到了如下图所示的预测结果:


上图中labeledPoint代表测试样本中的每条输入数据,label表示该条输入数据在测试样本中的值[1代表正样本,0代表负样本],prediction代表我们的分类模型根据每条输入数据计算出的评分值,数值越大表示它属于正样本的概率越大。
接下来取prediction中的每个值作为Threshold,假设我们现在选择prediction=0.341作为Threshold,那么prediction>=Threshold=0.341的样本则被认为是正样本,即编号1,2,3,4和5的样本为正样本,这时我们可以计算出一组(FPR, TPR),也即得到平面上的一个点,继续选择prediction=-0.769和-0.982作为Threshold,又得到两组新的(FPR, TPR)坐标点,如下图所示:


当我们完成所有prediction作为Threshold的遍历,就得到如下图所示的ROC曲线,在现实预测情况下,实际的测试样本数据集会多很多,得到的(FPR, TPR)点会相应的多很多,得到的ROC Curve会更平滑。


这样我们就完成了ROC曲线的绘制。

Area Under ROC Curve计算

至于如何计算由False Positive Rate轴,True Positive Rate轴和ROC曲线形成的曲面面积则比较简单,通过以下微积分公式即可求解:

面积越大表明我们分类模型的分类效果越好。

ps:文中除了[ROC曲线如何绘制]这一节的三张图之外,其余图片均出自参考资料,若有侵犯,联系删除!

参考资料:

  1. http://gim.unmc.edu/dxtests/roc3.htm
  2. [ROC和AUC介绍以及如何计算AUC](http://alexkong.net/2013/06/introduction-to-auc-and-roc/#fn:6)
  3. https://en.wikipedia.org/wiki/Receiver_operating_characteristic
  4. https://spark.apache.org/docs/latest/mllib-evaluation-metrics.html
  5. http://www.sciencedirect.com/science/article/pii/S016786550500303X