数据挖掘

什么是数据挖掘

数据挖掘这个词或许我们经常会见到,但是到底什么是数据挖掘?有人觉得数据挖掘就是各种算法,有人觉得数据挖掘就是各种数据的计算。数据挖掘确实是一个涉及面非常广的词语,在我看来,数据挖掘更偏向于一种过程,而不是一种名词或者一个结果,比如说我们要为新闻网站上的新闻标注分类以方便用户查阅,当然可以让编辑或者运营人员人工地进行标注,也可以借助数据挖掘去发现分类与新闻的内在联系,从而为新闻自动标注类别。

所以所谓的数据挖掘就是以数据作为研究的对象,从数据中寻找价值,获取知识的过程,至于说机器学习算法,或者数据的统计分析,这些都是手段。

具体到一个公司的业务中,除了上面说的为新闻标注类别,以下这些都可以借助数据挖掘过程来分析和解决:

  • 借助历史天气数据预测未来天气变化;
  • 在异常交易行为中发现羊毛党;
  • 为自媒体内容评判好坏;
  • 预测一个商品在未来的流行趋势;

等等

既然数据挖掘是一种过程,那么我们接下来就来看一下在实际的数据挖掘流程中,都分成哪些步骤。

数据挖掘的流程

在我刚开始工作的时候,虽然说也是处于数据挖掘的一环,但实际上我对数据挖掘的整体工作并没有什么概念。只是领导告诉我,某个指标需要计算一下,某些数据需要统计一下,我们要训练一个什么模型,我们需要做到多少的准确率等等。

随着工作经验的增长,我渐渐熟悉了这些环节,同时明白了数据挖掘的步骤,开始能够独立处理一个问题。实际上,在数据挖掘领域早已有比较成型的方法论,其中所列出的步骤与我的实际工作不谋而合。在这里,我们就介绍一个被称为 CRISP-DM 的数据挖掘流程方案,并通过一个小例子来实际感受一下,数据挖掘的流程是如何开展的。

CRISP-DM(cross-industry standard process for data mining),翻译过来的意思是跨行业数据挖掘标准流程,正如下图所示,在这个数据挖掘标准流程中包含了六个主要步骤,不过这六个步骤在整体上循环往复,但并不是按照单纯的顺序执行,其中还包含了很多关系,接下来我们就分别来介绍一下。

1.理解业务

以我们在拉勾教育做数据挖掘为例。为了保持内容的独创性,以吸引更多的用户购买,总编希望作者写的东西能够与一些主流网站上的内容存在一些差异,如果说每写一篇稿子,就让运营挨家挨户地去对比,那一定是费时费力,并且对比的效果很差,因为运营也没办法把那么多内容都看一遍,于是总编向我们发起了一个需求:比对作者写的文章与主流网站的文章是否存在一定的独创性。

我们收到了需求,接下来就要摩拳擦掌准备开始工作了。但是不要心急,这里说的工作可不是立马上手分析数据、写代码。作为一个合格的数据挖掘工程师,第一步我们需要理解业务,把业务逻辑搞明白。

需求有了,但是这个需求貌似并不明确。首先怎么定义文章具有独创性,这并不是通过技术手段可以量化的指标,我们就需要与总编沟通,确定如果两篇文章的相似度低于 5% 就认为是有独创性的。

之后我们可以把这个问题定义为一种文本抄袭检测,但是这个文本抄袭检测与一般的文本抄袭检测是否又有一些区别呢?比如说我们需要检测的是独创性,那么我们对比的粒度是否需要比较细;某些重点的文本是否需要一定不相同;一些引用和概念性介绍是否需要刨除;对于同一个作者的内容该如何处理等等。这些业务独特的需求我们也需要了解清楚,才能方便我们后面的处理。

理解业务看起来很虚,但是却是非常重要的环节,不要觉得理解业务是浪费时间的事情,认识清楚我们要完成的业务目标,能够为我们后面的提升效率、优化效果带来非常大的帮助。反之,如果你还没搞清楚业务的细节就上手开发,很可能所做的结果与业务的需求存在偏差,这时候就浪费了更多的时间,严重的还会给公司带来很大损失。

2.理解数据

在我们搞清楚业务需求之后,下一步就是要理解我们的数据。针对业务需求,我们需要什么样的数据,而我们公司中又有什么数据?哪些数据是一定要有的,哪些数据可以提升效果,但不是必需的?又有哪些数据是可有可无的?这些问题你需要在这个环节搞清楚。

比如说我们上面的“独创性”需求,至少需要拿到的是拉勾作者写的文本和需要对比的网站上的文本,除此以外,是否可以获得诸如作者名称、发布日期、文章分类等数据,针对细节需求,是否有充足的术语库供我们使用呢?这些数据是否存在一些错误,或者缺失?这些也都是需要考虑的问题。

如果说数据是完美的,那么工作起来自然简单,然而数据挖掘所需要解决的不仅仅是一个算法问题,而是在当前的条件下,在不完善的,甚至有错误的数据条件下,如何更好地输出结果。因此,理解数据也同样重要。如果对于某些需求,现有的数据无法支撑,那么还需要返回到理解业务的步骤,重新讨论业务需求。

3.准备数据

弄明白了我们的业务需求,搞清楚了我们手头的数据,接下来我们就要开始准备数据了。

在这个环节,我们需要针对具体的情况,也就是拿我们业务和数据本身的问题去做针对性的准备,把原始的数据经过清洗加工,转变成我们在后面的建模环节所需要的状态。对于我们“独创性”的需求,文本数据自然是不能够直接进行运算的,我们可能需要对文本做一些分词、关键词提取、过滤停用词的工作。如果要使用词向量,还需要训练一个词向量表。对于非文本数据,也需要检查异常值或者缺失值,看是否需要进行丢弃或者补全的操作。

4.构建模型

如果说,我们前面的步骤都已经有条不紊地完成了,那么在构建模型这一步将非常顺畅。构建模型所解决的基本上都属于技术问题了。面对我们的问题,如何选取对应的技术方案、使用哪种算法来解决我们的问题、如何优化以提升效果是构建模型阶段需要解决的问题。

我们常见的问题通常可以转化成分类、聚类、回归和关联分析四种问题,进而选择对应的算法构建模型。比如说我们的文本抄袭检测:

可以转化成分类问题,把相似和不相似看作是二分类,把文本数据转化成数值数据,使用分类算法构建分类模型;

可以把它转化为一个聚类问题,把文本进行聚类分析,根据聚类的距离来判定是否抄袭;

可以把多种方法组合起来使用。

很多时候,我们需要根据经验来选择使用何种方案,如果你还不能很好的判断,那么就有必要多做一些试验来对比效果。

5.模型评估

模型训练好了,我们还需要对模型进行评估,来确认我们的模型是否确实符合我们的预期、能够满足我们的业务需求、解决我们的业务问题。

从数学原理方面,我们有诸如准确率、召回率、F1 Score 等指标来评判一个模型的效果。同时,在公司中,很多时候我们还需要与业务人员共同进行人工抽样来确认效果。比如说我们构建好了检测文本相似性的模型,只有一个准确率 90% 的概率往往还不能直接使用,我们的效果还需要得到业务方,也就是总编的确认。不仅如此,由于我们训练使用的数据跟线上的数据肯定存在一些区别,在模型上线之后,仍然需要定期花时间来评估线上的效果。如果发现问题,可能需要对问题进行分析,看是否是个例还是大面积的问题。

6.部署上线

如果总编检查完了结果,并对我们工作的效果非常满意,那么我们就可以对模型进行部署上线了。

在部署的时候,我们更多地需要考虑一些工程问题。因为有时候我们的模型效果虽然没问题,但是运算速度可能太慢,或者需要太多的资源,而我们的服务器可能无法支持,或者我们的数据量太大处理不过来,又或者我们需要把服务集成到 App 上面,让用户在无网络时也可以使用等等。

上一篇:《程序员》推荐.NET专题好书榜(转)


下一篇:django获取上传文件