大数据揭秘:数据科学家到底是干什么的?

在外界看来,大数据领域和数据科学常被认为是高深复杂甚至神秘的。商业领域中,很多人现在可能已经了解了大数据分析所包含的基本概念:对我们生成的不断增长的海量数据加以收集,发掘其中具有重要意义的信息。但从事具体研究的专业人士每天究竟都在做些什么呢?

有人将数据科学家称为“21 世纪最性感的工作”,为了揭开其神秘面纱,我与权威的数据科学家 Steve Hanks 博士进行了交谈,大体了解了数据科学家的工作包括哪些方面,以及哪种人更加适合这个领域。

Hanks 在耶鲁大学获得计算机科学博士学位,在 15 年时间内作为计算机科学专家先后供职于亚马逊、雅虎和微软等多家公司。目前他是 Whitepages.com 的首席数据科学家,负责 Contact Graph 的监管工作。Contact Graph 是一个数据库,存储了超过 2 亿人的联系信息。这个数据库每月被搜索约 20 亿次,是该公司主要的业务资产。

自 1997 年推出以来,这个数据库一直是 Whitepages 的业务驱动力。最近这家公司又开发出一款手机应用 Caller ID,它可替代手机用户界面,通过查询 Whitepages 的主数据库,提供更加完善的来电显示信息,还可以屏蔽骚扰电话和广告电话。此外,这一数据库还扩展出一条新的盈利途径,即为其他公司提供数据以用于预防诈骗。

数据科学家的关键能力

“数据科学家”这一术语可以代表学术、金融、政府等多种领域和组织中的多种角色。Hanks 所带领的团队有 12 至 15 名成员,他们共同负责 Whitepages 的所有数据分析工作,而各成员的技能和职责则各不相同。不过他告诉我,有三种能力是每个数据科学家必须具备的。

1.你必须清楚数据是有意义的

Hanks 认为,我们经常忽视一个事实,即任何数据都是有意义的,关键在于理解这些意义。如果想要从数据中提炼出任何有效的信息,我们必须将目光超越数据本身,探寻其所表示的东西。Hanks 指出,这与算法、工程学或类似的技术无关,理解数据实际上是一种艺术,并且非常重要。

2.你必须清楚自己需要解决的问题以及数据与这些问题的关系

这表示你需要从所掌握的技能中找出合适的分析方法和算法来搞定你的数据。Hanks 谈到了当前非常流行的机器学习,他指出使用数据解决问题的方法有几百种之多,如运筹学、决策论、博弈论、控制论等,且这些方法均已出现了很长时间。Hanks 认为,一旦你理解了数据,理解了试图去解决的问题,便能够找到最合适的算法并提供理想的解决方案。

3.你必须了解工程学

第三种能力即能够对数据分析工作所需的基础知识有足够了解并运用自如。用 Hanks 的话来说,如果不具有相应的基础知识,以便能够适时适地提供准确有效的解决方案,对解决问题是毫无帮助的。

对于想成为一名优秀数据科学家的人,以上三种能力是必不可少的。你需要关注数据及其意义,理解问题并知晓解决问题的理想算法,还需要了解工程学,这将更有助于你解决问题。

然而这并不表示没有专攻某一种能力的可能。Hanks 认为,实际上不可能存在精通全部三个领域的专家,更何况这些领域各自又具有若干分支。而在已对这些领域建立了解的基础之上,完全可以专门研究其中一个领域。但 Hanks 告诉我,即使你以算法研究为主或以工程师作为第一角色,如果没有理解所解决的问题或是没搞清楚数据的意义,同样没办法胜任数据科学家。

数据科学家的关键品质

就个人品质而言,对数据的好奇心是必不可少的,沟通技巧也同样重要。Hanks 说“我的团队成员会花很长时间与客户进行沟通,指出他们亟待解决的问题,还会与数据供应商进行交流,以便确定他们能够提供哪些帮助。因此,你成了一个中间人,可见沟通是非常重要的。”

许许多多不同类型的人从事着数据科学行业,Hanks 对我解释说他可能并不是个很典型的例子。而以我的经验来看,可不是这么回事儿。Hanks 提及的关键能力包含了范围广博的专业技术,而这个行业也不断吸引着具有不同个性和想法的人们。

“我真的非常喜欢这种互动,”Hanks 说,“一开始我完全被迷住了。我第一次接触数据科学时,好像是关于运筹学的案例,你可以使用大数据集习得并改进事物,这种概念让我深深着迷,并且我还发现,你真的可以利用数据带来一些不同,直到现在我已经沉迷于此超过 30 年了。”

虽然在这一领域有着漫长而丰富的经历,还是可能遇到让他抓狂的问题。当谈到数据科学家的挑战时,这些问题就是极好的例子,就是他们每日钻研的目标。

就在今天早上,我正忙于工作,发现某个算法没有达到预期效果,基本上这表示某人与某个电话号码之间的已知链接是不正确的。这些问题可能会断断续续地出现,并且非常难以确定。

“我们有非常具体的算法来处理非常具体的事情,当算法不奏效的时候,我们只能对它们进行仔细检查并找出原因,问题是这些天用到的算法非常复杂,并且有大量参与计算的代码段!我困惑极了,就像我现在这样……但我们总是会搞定的,我们一直如此!这就是我们每天面对的挑战——没有按照既定构思运行的各种系统。”

在 Hanks 从事数据科学的这些年中,他感受到了这个领域的巨大变化,从运行于主机上的结构数据库,到分布式 Hadoop 网络,再到今天基于云的实时数据处理,技术发展日新月异。那么随着数据分析和大数据技术的发展,他对行业的未来又是如何看待的呢?

数据科学的未来

Hanks 认为增量式数据流和实时数据处理技术将大有未来,但并不看好海量数据批处理技术的前景。他相信,在这个崭新的时代,Hadoop MapReduce 将不再那么适用,他在工作中已开始使用 Scala 和 Akka 等其他系统。

Hanks 眼中最大的挑战之一是要紧跟新技术和新算法快速发展的步伐。他认为,要成为一名出众的数据科学家,必须要具有全局观。他相信,成为 MapReduce 或某一机器学习算法领域的专家相对容易,更大的挑战在于紧跟数据科学的发展速度。“这是个非常庞大而复杂的领域,其范围有着无法想象的广度和深度,”Hanks 告诉我,“你必须要了解每个细节,但这个领域还在不停地飞速发展,这将是数据科学家未来所面临的挑战。”

原文链接:Big Data Uncovered: What Does A Data Scientist Really Do?

译文出处:https://www.jianshu.com/p/b7f3a03bb93d

如何利用机器学习进行异常检测和状态监测

最近,在浏览towardsdatascience上面的机器学习相关文章的时候,无意间看到一篇关于异常检测的文章,刚好与自己的工作内容有点契合,文章讲解的是两种分析思路:第一种、PCA + Mahalanobis;第二种、AutoEncoder训练模型进行检测。兴奋之下,决定将这篇文章分享出来,如果内容有理解不当的地方,还请读者指出,深表感谢。

原文链接: ‘How to use machine learning for anomaly detection and condition monitoring’

本文,将介绍机器学习和统计分析几种不同的技术和应用,然后展示如何应用这些方法来解决特定场景:异常检测(anomaly detection)和状态监控(condition monitoring)。

Anomaly detection

异常检测(或异常值检测)是对稀有物品、事件或观察结果的识别,这些物品、事件或观察结果与大多数数据存在显著差异,从而引起疑虑。通常,异常数据可以关联到某种问题或罕见事件,例如银行欺诈、医疗问题、结构缺陷、故障设备等。这种连接能够有趣地找出哪些数据点可以被视为异常,因为从业务角度来看,识别这些事件通常非常有趣。

关键目标:如何识别数据点是正常或是异常?简单的情况下,如下图所示,数据可视化可以比较直观的展示出来。

Figure 1 : Anomaly detection for two variables

在二维空间(x和y)中,通过位于特定分布之外的数据点很直观地被我们识别为异常点。然而从右图来看,不可能直接根据一个变量就识别出异常值:正是X和Y变量的组合使得我们能够容易地识别异常值。当我们从两个变量放大到10-100个变量时,问题就变得非常复杂了,而这种场景经常出现在异常检测的实际应用当中。

Connection to condition monitoring

任何机器,无论是旋转机器(泵、压缩机、燃气轮机或蒸汽轮机等)还是非旋转机器(换热器、蒸馏塔、阀门等),最终都会达到不良的健康状态。这一点可能不是实际的故障或停机,而是设备不再以最佳状态运行。这表明可能需要一些维护行为来恢复最佳操作状态。简单地说,识别设备的“健康状态”是状态监控领域。

执行状态监控的最常见方法是查看机器上的每个传感器测量值,并对其施加最小和最大值进行限制。如果当前值在界限内,则机器正常。如果当前值超出界限,则机器不正常并发出警报。

设定硬编码告警阈值会产生大量的误报,即针对机器实际处于健康状态的情况发出报警。还可能漏报告警,也就是有问题但没有警报的情况。第一个问题不仅浪费时间和精力,而且浪费设备的可用性。第二个问题更为关键,因为它会导致相关维修成本的实际损失和生产损失。

这两个问题都是由同一个原因造成的:一个复杂设备的健康状况不能通过对每一个测量本身的分析来可靠地判断(如上图异常检测部分的图1所示)。我们更应该考虑多种测量方法的合并,以获得真实的情况。

Technical section

在不涉及更多技术方面的情况下,很难涵盖机器学习和异常检测统计分析的主题。我会避免太深入讲解理论背景(但会提供一些链接)。如果您对机器学习和统计分析的实际应用更感兴趣,例如状态监控,可跳到“状态监控用例”部分。

Approach 1: Multivariate statistical analysis

Dimensionality reduction using principal component analysis: PCA

处理高维数据通常具有挑战性,因此有几种方法可以减少变量的数量(降维)。其中一种技术就是主要成分分析(PCA),它将数据线性映射到低维空间,使数据在低维空间中的方差最大化。在实际应用中,需要构造了数据的协方差矩阵,并计算该矩阵的特征向量。对应于最大特征值(主分量)的特征向量可以用来重建原始数据方差较大的一部分。原来的特征空间已经减少(有一些数据丢失,但会保留最重要的方差)到几个特征向量所跨越的空间。

Multivariate anomaly detection

如上所述,为了在处理一个或两个变量时识别异常,数据可视化通常是一个好的起点。然而,当将此扩展到高维数据(在实际应用中经常是这样)时,这种方法变得越来越困难。幸运的是,多元统计数据起到了作用。

当处理一组数据点时,它们通常具有一定的分布(例如高斯分布)。为了更定量地检测异常,我们首先从数据点计算概率分布p(x)。然后,当一个新的例子x出现时,我们将p(x)与阈值r进行比较。如果p(x)<r,则将其视为异常。这是因为正常的例子倾向于有一个大的p(x),而异常的例子倾向于有一个小的p(x)。

在状态监测的背景下,这很有趣,因为异常可以告诉我们被监测设备的“健康状态”:当设备接近故障时生成的数据,或次优操作,通常与“健康”设备的数据分布不同。

The Mahalanobis distance

如上所述,讨论数据点属于哪种分布的问题。第一步是找到采样点的质心或质心。直观地说,所讨论的点离这个质心越近,它就越有可能属于这个集合。然而,我们还需要知道集合是分布在大范围还是小范围,这样我们就可以决定距中心的给定距离是否值得注意。简单的方法是估计样本点到质心距离的标准偏差。通过将其插入正态分布,我们可以得出数据点属于同一分布的概率。

上述方法的缺点是,我们假设采样点以球形方式分布在质量中心周围。如果分布确定为非球形,例如椭球形,那么我们期望测试点属于集合的概率不仅取决于与质心的距离,而且取决于方向。在椭球体具有短轴的方向上,试验点必须更近,而在轴较长的方向上,试验点可以远离中心。在数学基础上,通过计算样本的协方差矩阵,可以估计出最能代表集合概率分布的椭球。Mahalanobis距离(md)是测试点到质量中心的距离除以试验点方向上的椭球宽度。

为了使用MD将测试点分类为属于n个类中的一个类,首先要估计每个类的协方差矩阵,通常基于已知属于每个类的样本。在我们的例子中,由于我们只对“正常”与“异常”进行分类感兴趣,因此我们使用只包含正常操作条件的训练数据来计算协方差矩阵。然后,给出一个测试样本,将MD计算为“正常”类,如果距离超过某个阈值,则将测试点分类为“异常”。

注意:使用MD意味着可以通过均值和协方差矩阵-进行推断,这只是正态分布的一个性质。在我们的例子中,不一定满足这个标准,因为输入变量可能不是正态分布的。不过我们还是可以试试,看看效果如何!

Approach 2: Artificial Neural Network

Autoencoder networks

第二种方法是使用自编码器神经网络。这是基于与上述统计分析相似的原则,但有一些细微的差异。

自编码器是一种人工神经网络,用于无监督地学习有效的数据编码。自动编码器的目的是学习一组数据的表示(编码),通常用于降维。与原边一起,学习重构边,其中自动编码器尝试从简约编码生成尽可能接近其原始输入的表示。

从结构上讲,AutoEncoder最简单的形式是一个前馈的、非重复性的神经网络,与许多单层感知器非常相似,多层感知器(MLP)具有一个输入层、一个输出层和一个或多个连接多层感知器的隐藏层-,但输出层具有相同数量的节点。作为输入层,目的是重建自己的输入。

Figure 2: Autoencoder network

在异常检测和状态监测的背景下,基本思想是使用自动编码器网络将传感器读数“压缩”到较低的尺寸表示,从而捕获各种变量之间的相关性和相互作用。(基本上与PCA模型的原理相同,但这里我们也考虑了变量之间的非线性相互作用)。

然后,自动编码器网络接受表示“正常”操作状态的数据的训练,其目标是首先压缩然后重建输入变量。在降维过程中,网络学习各种变量之间的相互作用,并能在输出端将它们重新构造回原来的变量。主要想法是,随着被监测设备的退化,这将影响变量之间的相互作用(例如温度、压力、振动等的变化)。当这种情况发生时,人们将开始看到网络重新构造输入变量的错误增加。通过监测重建误差,人们可以得到被监测设备的“健康”指示,因为这种误差会随着设备的退化而增加。与第一种使用Mahalanobis距离的方法类似,我们这里使用重建误差的概率分布来确定数据点是正常的还是异常的。

Condition monitoring use-case: Gear bearing failure

在这一节中,我将使用上面描述的两种不同的方法,介绍一个用于状态监控的实际用例。由于我们与客户合作的大多数数据都不是公开的,我选择了展示NASA提供的两种数据方法,可以在这里下载。

在此用例中,目标是检测发动机上的齿轮轴承退化,并发出警告,允许采取预测措施以避免齿轮故障(例如,设备的计划维护/维修)。

三组数据分别由四个轴承组成,在恒负荷和运行条件下运行至失效。振动测量信号在轴承使用寿命期间提供给数据集,直至出现故障。在外座圈出现裂纹的1亿个循环后发生故障(有关实验的更多信息,请参阅下载页中的自述文件)。由设备一直运行直到出现故障,将前两天的运行数据当作训练数据,以代表正常和“健康”的设备。然后将导致轴承故障的时间的数据集的剩余部分用作测试数据,以评估不同的方法是否可以在故障之前检测轴承退化。

Approach 1 : PCA + Mahalanobis distance

正如本文“技术部分”中提及的那样,第一种方法是:首先进行主成分分析,然后计算马哈拉诺比距离(MD),以确定数据点是正常的或异常的(设备退化的迹象)。代表“健康”设备的训练数据的MD分布如下图所示。

Figure 3: Distribution of Mahalanobis distance for “healthy” equipment

利用“健康”设备的MD分布,我们可以定义一个考虑异常的阈值。根据上述分布,我们可以将MD>3定义为异常。现在,这种检测设备退化的方法的评估包括计算测试集中所有数据点的MD,并将其与标记为异常的定义阈值进行比较。

Model evaluation on test data:

利用上述方法,我们计算了轴承失效前一段时间内试验数据的MD,如下图所示。

Figure 4: Predicting bearing failure using approach 1

在上图中,绿点对应于计算得出的MD,而红线代表用于标记异常的定义阈值。轴承故障发生在数据集的末尾,用黑色虚线表示。这说明,第一种建模方法能够在实际故障发生前3天(MD超过阈值)检测到即将发生的设备故障。

我们现在可以使用第二种建模方法进行类似的练习,以评估哪些方法的性能优于其他方法。

Approach 2: Artificial Neural Network

如本文“技术部分”中更详细地解释的,第二种方法包括使用自动编码器神经网络来检测异常(通过增加网络的重建损失来识别)。与第一种方法类似,在这里我们使用代表“健康”设备的训练数据的模型输出分布来检测异常。训练数据重建损失(平均绝对误差)分布如下图所示:

Figure 5 : Distribution of reconstruction loss for “healthy” equipment.

利用“健康”设备重建损失的分布,我们现在可以定义一个考虑异常的阈值。根据上述分布,我们可以将大于0.25的损失定义为异常。设备退化检测方法的评估现在包括计算测试集中所有数据点的重建损失,并将损失与将其标记为异常的定义阈值进行比较。

Model evaluation on test data:

利用上述方法,我们计算了轴承失效前一段时间内试验数据的重建损失,如下图所示。

Figure 6: Predicting bearing failure using approach 2

在上图中,蓝色点对应重建损失,而红色线代表标记异常的定义阈值。轴承故障发生在数据集的末尾,用黑色虚线表示。这也说明,这种建模方法能够在实际故障发生前3天(重建损失超过阈值)检测到即将发生的设备故障。

Results summary

从以上两个不同的异常检测方法部分可以看出,这两种方法都能在实际故障发生前几天成功检测到即将发生的设备故障。在实际场景中,这将允许在故障发生之前采取预测措施(维护/维修),这意味着既节省了成本,又对设备故障的HSE方面具有潜在的重要性。

随着通过传感器捕获数据的成本降低,以及设备之间的连接增加,能够从数据中提取有价值的信息变得越来越重要。在大量数据中发现模式是机器学习和统计的领域,在我看来,利用这些数据中隐藏的信息来提高几个不同领域的性能有着很大的潜力。正如本文所述,异常检测和状态监测只是众多可能性之一。

参考文献:http://www.csuldw.com/2019/01/09/2019-01-08-how-to-use-machine-learning-for-anomaly-detection-and-condition-monitoring/

经典SQL语句

有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value替换为A中对应的value

1
2
update B b set b.value=(select max(a.value) from A a where b.key=a.key)
where exists(select 1 from A c where b.key=c.key)
1
2
UPDATE A a,(select a.`key`,b.`value` from A INNER JOIN B on a.`key`=b.`key`) b 
SET a.`value` = b.`value` WHERE a.`key` = b.`key`

查询表A中存在ID重复三次以上的记录

1
Select * From A Where id in(select ID from A group by id having count(id)>3)

用一条SQL语句显示所有可能的比赛组合

一个叫team的表,里面只有一个字段name,一共有4 条纪录,分别是a、b、c、d,对应四个球队,现在四个球队进行比赛,用一条SQL语句显示所有可能的比赛组合。

1
select * from team a,team b where a.name>b.name;

用SQL语句实现:当A列大于B列时选择A列否则选择B列,当B列大于C列时选择B列否则选择C列。

1
select (case when a>b then a else b end ),(case when b>c then b esle c end)  from 表名
1
select if(a>b,a,b),if(b>c,b,c) from 表名

统计NumPy数组中最频繁出现的值

1
arr = np.array([[1,2,100,4,5,6],[1,1,100,3,5,5],[2,2,4,4,6,6]])

方法一:

1
2
count = np.bincount(arr[:,2])  # 找出第3列最频繁出现的值
value = np.argmax(count)

方法二:

1
2
3
from collections import Counter

value = Counter(arr[:,2]).most_common()

距离和相似度

sklearn.metrics.pairwise.cosine_similarity
http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise.cosine_similarity.html#sklearn.metrics.pairwise.cosine_similarity

sklearn.metrics.pairwise.pairwise_distances
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise_distances.html#sklearn.metrics.pairwise_distances

sklearn.metrics.pairwise_distances_argmin
http://scikit-learn.org/stable/modules/generated/sklearn.metrics.pairwise_distances_argmin.html#sklearn.metrics.pairwise_distances_argmin

scipy.spatial.distance.cdist
https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.cdist.html#scipy.spatial.distance.cdist

scipy.spatial.distance.pdist
https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.pdist.html#scipy.spatial.distance.pdist

scipy.stats.pearsonr
https://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.pearsonr.html

NumPy中的集合运算

怎样快速找出两个数组中相同的元素?

1
2
numpy.isin(element,test_elements,assume_unique = False,invert = False )
计算test_elements中的元素,仅在元素上广播。返回与元素相同形状的布尔数组,该元素为True,其中元素元素位于test_elements中,否则返回 False。

NumPy数组的集合运算

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import numpy as np
# 创建一维 ndarray x
x = np.array([1,2,3,4,5])
# 创建一维 ndarray y
y = np.array([6,5,4,8,7])
# 输出 x
print('x = ', x)
# 输出 y
print('y = ', y)
# 比较x和y
print('使用intersect1d输出x和y的交集:', np.intersect1d(x,y))
print('使用setdiff1d输出在x中不在y中的元素:', np.setdiff1d(x,y))
print('使用union1d输出x和y的并集:',np.union1d(x,y))
print('使用setxor1d输出x和y的异或集:',np.setxor1d(x,y))

输出:

1
2
3
4
5
6
x =  [1 2 3 4 5]
y = [6 5 4 8 7]
使用intersect1d输出x和y的交集: [4 5]
使用setdiff1d输出在x中不在y中的元素: [1 2 3]
使用union1d输出x和y的并集: [1 2 3 4 5 6 7 8]
使用setxor1d输出x和y的异或集: [1 2 3 6 7 8]

python曲线拟合

1.多项式拟合范例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import matplotlib.pyplot as plt
import numpy as np

x = np.arange(1, 17, 1)
y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60])
z1 = np.polyfit(x, y, 3) # 用3次多项式拟合
p1 = np.poly1d(z1)
print(p1) # 在屏幕上打印拟合多项式
yvals=p1(x) # 也可以使用yvals=np.polyval(z1,x)
plot1=plt.plot(x, y, '*',label='original values')
plot2=plt.plot(x, yvals, 'r',label='polyfit values')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend(loc=4) # 指定legend的位置,读者可以自己help它的用法
plt.title('polyfitting')
plt.show()

2.指定函数拟合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 使用非线性最小二乘法拟合
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
import numpy as np
# 用指数形式来拟合
x = np.arange(1, 17, 1)
y = np.array([4.00, 6.40, 8.00, 8.80, 9.22, 9.50, 9.70, 9.86, 10.00, 10.20, 10.32, 10.42, 10.50, 10.55, 10.58, 10.60])
def func(x,a,b):
return a*np.exp(b/x)
popt, pcov = curve_fit(func, x, y)
a=popt[0] # popt里面是拟合系数,读者可以自己help其用法
b=popt[1]
yvals=func(x,a,b)
plot1=plt.plot(x, y, '*',label='original values')
plot2=plt.plot(x, yvals, 'r',label='curve_fit values')
plt.xlabel('x axis')
plt.ylabel('y axis')
plt.legend(loc=4) # 指定legend的位置,读者可以自己help它的用法
plt.title('curve_fit')
plt.show()