基于文本内容的垃圾短信识别算法外文翻译资料

 2022-09-06 10:09

英语原文共 26 页,剩余内容已隐藏,支付完成后下载完整资料


14.训练分类器

本章内容

  • 提取文本中的特征
  • 转换特征为Mahout所用
  • 训练两个Mahout分类器
  • 选择Mahout学习算法

本章探讨分类的第一阶段:模型训练。开发分类器是个动态的过程,要求你创造性地思考出描述数据特征的最佳方式,并考虑在训练模型中所选用的学习算法中如何使用这些数据特征。某些数据很容易就可以为分类所用,而有些则会给分类工作带来很大挑战,让你同时感受到沮丧、有趣和物有所值。

在本章中,你将学会挑选并有效地提取各种特征以构建Mahout分类器。特征提取所涉及的工作比第13章介绍的简化步骤多得多。我们将详细探讨特征提取,包括如何对原始数据进行预处理,将其变成可分类数据,以及如何将可分类数据变成适用于Mahout分类算法的向量。我们将以一个计算营销问题为例,演示如何从数据库中提取训练数据。

一旦理解如何为分类准备数据之后,我们将在14.4节给出一个示例,该示例利用Mahout中的随机梯度下降(SGD)算法在一个标准数据集20 Newsgroup上构建分类器。

在14.5节,我们将介绍Mahout分类中各种学习算法的特点,这将有助于了解如何根据具体项目的特点选择合适的算法。在设计和训练分类器时,提取特征和选择算法这两项各种密切相关。为了培养对选择中不同做法的直观认识,我们给出第二个逐步介绍的例子,该例子使用另一种学习算法-朴素贝叶斯算法-对相同的数据进行处理。

下面我们先解释一下如何处理训练样本中的数据。

14.1提取特征以构建分类器

把数据变成分类器可用的形式是一个复杂的过程,通常也很耗时。我们在这一节会大致介绍一下其中所涉及的工作。第13章中的图13-2展示了如何训练和使用分类模型,而图14-1是图13-2的一个简化视图。这里只需要一步,就可以从训练样本达到分类模型的训练算法。当然,现实情况会更加复杂。图14-1中还展示了第13章没提到的重要细节。

在图13-2中,训练数据到训练算法只用了一步。实际上,原始数据必须经过搜集和预处理,然后才能变成可分类的训练数据。图14-1的训练样本是可分类数据,我们会在本章讨论从原始数据到可分类数据的处理过程,并在第15章和第16章给出进一步细节。

原始数据经过预处理变成可分类形式之后,我们需要进行几步操作来选择预测变量和目标变量,并将他们编码为向量,即Mahout分类器所要求的输入形式。回想下第13章的内容,特征中可以用作预测变量的值有4种:

  • 连续型
  • 类别型
  • 单词型
  • 文本型

      预处理            提取预测变量

                     和目标变量

          

第13章中省略的细节

图14-1 图13-2的拓展部分。原始数据必须经过这些处理,然后才可以交付给训练算法

总体来说,这里对预测变量的描述是正确的,但它忽略了一个重要的事实,即无论是在训练算法可以读取的内存还是文件格式中,将这些值交付给训练分类器的任何算法时,都必须以数字向量的形式表示。

与图14-1中经过简化的序列相比,图14-2中多了很多细节。为了将原始数据变成训练算法所要求的输入向量,要对其进行一些列的变换。这些变换可以分为两个阶段:预处理,产生用作训练样本的可分类数据;将可分类数据转换成向量。

         连接,合并,转换

                         

                       

解析

                  

编码

                  

图14-2 向量是分类算法要求的输入格式。为了将数据编码为向量,搜索原始数据时必须   要以可分类的单条记录形式来表示数据,以为解析和向量化过程做好准备 

如图14-2所示,为训练算法准备数据主要包括两步。

(1)原始数据的预处理 经过重新组织,原始数据变成带有相同字段的记录。为了能够用于分类,这些字段可以是4种类型:连续型,类别型,单词型和文本型。

(2)将数据转化为向量 用自己定义或Lucence分词器,Mahout向量编码器之类的工具对可分类数据进行解析和向量化。有些Mahout分类器自己也包含向量化代码。

上述的第二步又可以分为两个阶段--词条化和向量化。对于连续变量而言,解析工作可能微不足道,但对其他类型变量,比如类别型,单词型或文本型变量,可能要涉及向量化操作。

本章的后续章节会详细讨论这两步处理。

14.2原始数据的预处理

在特征提取的第一阶段,我们要重新认识一下数据,找出可以用作预测变量的特征值。首先,根据分类目标选择目标变量,然后挑选或剔除特征,以得到值得一试的组合。这一步没有既定法则,全凭经验进行猜测,学习本章示例之后,你应该能慢慢积累出自己的经验。

本节简要概述了数据的预处理过程,包括搜集数据或重新将数据组织成单条记录,并从原始数据中提炼出第二层含义(比如将邮政编码转换为三数字编码或用生日来确定年龄)。在本章的示例当中,预处理并不是主要部分,这是因为这里用的数据集基本上已经做好数据提取了。而在第16章和第17章中的示例中,预处理扮演着更重要的角色。

14.2.1原始数据的转换

在找出要尝试的特征之后,必须先把他们转换成可分类的形式。这个转换涉及将数据重新安排单一位置上并将其转换成合适的具有一致性的形式。

注意 可分类数据由具有相同字段的记录组成,字段得数据类型为下面4种之 一:连续型,类别型,单词型和文本型。每条记录都包含一个训练样本的完全非规范化的描述。                               

乍一看,这一步好像不需要做就已经完成。如果数据看起来像单词,那特征肯定就是单词型,对不对?如果数据看起来像数字,那特征肯定是连续型,对吧?但我们在第13章已经讲过,第一印象可能会误导你。比如邮政编码,乍看像数字,但实际上是一个类别,是一个预先定义的类别的标签。包含单词的东西可能是单词型,或者最好看成类别型或文本型。用户ID或产品ID看起来可能像数值、类别或单词型数据,但更常见的做法为了支持他们所指向的用户或产品的特性对他们进行非规范化处理。
  下面的示例来自计算营销,我们可以将其作为分类准备原始数据的练习。

14.2.2一个计算营销的例子

假设你要构建一个分类模型,以确定用户是否会购买你想他们提供的某种产品。这算不上推荐系统,因为他是根据用户和产品的特性进行分类。

这个例子中的数据库有几个数据库表,如图14-3所示。这些表是高度简化的零售系统的经典数据表。这里有用来表示用户和产品的表,有一个表记录展示或提供产品给用户的时间,还有一个表记录展示产品给用户导致的购买行为。这些数据目前还不能作为分类器的训练或测试数据,因为他们分散在几个表中。

图14-3 包含不同数据类型的产品销售示例中的表结构。因为任何表中都

    没有分类器的训练样本记录,所以原始数据的这种组织形式不能直

    接用作训练数据

图14-3中展示的营销项目有很多数据类型。用户有人口统计,比如生日和性别;产品有型号和颜色。向用户展示的产品数据记录在offer表中,跟offer相关联的产品购买记录放在purchase表中。

图14-4中是将这些数据变成分类器训练数据的一种可能方式。对于offer表中的每条记录,应该都有一条记录与之对应,但要注意是如何用产品和用户的ID来联结product和user表的。在这个过程中,用户的生日表示为年龄。我们用了一个外联结来推导产品展示到产品购买之间的时间延迟,并用一个标志来表明是否有购买行为发生。

为了将表中数据表示为图14-4中所示的可用形式,我们需要把他们集中到一起重新组织。为了完成这个任务,可以像下面这样使用SQL查询:

select

now() - birthDate as age, gender,

typeId, colorId, price, discount, offerTime,

ifnull (purchase.time, 0, purchase.time - offer.time) as purchaseDelay,

ifnull (purchase.time, 0, 1) as purchased

from

offer

join user using (userId)

join product using (productId)

left outer join purchase using (offerId);

图14-4 为获得可分类数据,构建训练样本的数据来自不同的数据源,通过非规范化 形成单条记录,来描述实际发生的情况。这里还对一些变量做了转换,比如用年龄表示生日,用延迟表示购买时间

该查询对存储在不同数据表中的数据进行了非规范化处理,将所有必要数据整合到一起形成记录。在这个例子中,offer表是主表,并且userId、productId以及offerId上的外键本质使得上述查询对offer表中的每条记录都恰好产生一条对应记录。需要注意的是跟purchase表的联结是外联结,这样就可以允许包含purchase.time的ifnull表达式在没有任何购买行为时产生0值。

注意 有时年龄更适合分类,而有时生日却更合适。比如说,在汽车事故的保险数据中,用年龄做变量会更好,因为与客户所属的时代相比,汽车事故跟客户年龄段的关系更大。而在购买音乐的数据中,生日可能更有意义,因为人们通常会保持自己早起对音乐的偏好,其对音乐的品味通常能折射出他们的时代特征。

                                     

上述查询语句产生的记录是可分类数据,可以用于训练算法的解析和向量化处理过程。向量化处理可以由你编码完成,或者把这些数据变成MAhout分类器可以接收的格式,因为这些分类器通常有自己的解析和向量化代码,可以帮助你完成数据的解析和向量化处理,后续内容和示例将重点讨论如何对解析后的可分类数据做向量化处理。

14.3将可分类数据转换为向量

在Mahout中,Vector(向量)是一种保存浮点数字的数据类型,并且这些浮点值用整型做索引。本节会告诉你如何将数据编码为Vector,解释什么是特征散列(feature hashing),并演示Mahout API如何进行特征散列。我们还会看一下如何对不同类型的变量值进行编码。

前面有关聚类的各章中已经介绍过了Vector。很多分类器,特别是Mahout中用的分类器,基本上都是以线性代数为基础,因此我们要求训练数据以Vector形式输入。

14.3.1用向量表示数据

怎么用Vector表示可分类数据呢?表14-1总结了几种办法。

表14-1 将可分类数据编码为向量的办法

方法

优点

代价

用途

每个单词、类别或连续值用一个Vector分量

没有冲突,易于实现逆处理

需要扫描两次[一次设置分量,一次设置值],并且向量的长度可能不同

将Lucence索引导出为Vector用于聚类

将Vector隐式表示为词袋(bags of words)

扫描一次,没冲突

难以使用线性代数基元,难以表示连续值,并且必须将数据格式化为特殊的非向量形式

用在朴素贝叶斯中

用特征散列

扫描一次,向量大小提前固定,并适用于线性代数基元

有特征冲突,结果模型解释起来可能需要一点技巧

在OnlineLogisticRegression和其他SGD学习算法中

Mahout中不同分类器使用了表14-1中的各种办法。我们来看一下如何将单词型、文本型和类别型值编码为向量。

  1. 每个词一个分量

将可分类数据编码为Vector的一种办法遍历两次训练数据:一次确定必须的Vector大

剩余内容已隐藏,支付完成后下载完整资料


资料编号:[147031],资料为PDF文档或Word文档,PDF文档可免费转换为Word

原文和译文剩余内容已隐藏,您需要先支付 30元 才能查看原文和译文全部内容!立即支付

以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。