《Spark机器学习进阶实战》——3.4.2 准备数据

举报
华章计算机 发表于 2019/06/01 22:32:58 2019/06/01
【摘要】 本书摘自《Spark机器学习进阶实战》——书中的第3章,第3.4.2节,作者是马海平、于俊、吕昕、向海。


3.4.2 准备数据

我们提供的数据格式是:应用包名~应用名~类别~标签词~应用介绍。

其中,标签词以“|”分割,应用介绍已经使用哈工大分词工具进行了分词操作,数据样例如下:

com.boshsaddi.cgrsnhn~掌上沪江英语每日一说~教育学习~英语|考试|雅思|课程~掌/n 上/nd 沪江/ns 英语/nz 每日/r 一/d 说/v ,/wp 最/d 专业/a 的/u 英语/nz 在线/b 直播/n 学习/v 品牌/n ,/wp 专注/v 四六级/j 、/wp 考研/j 英语/nz 和/c 雅思/n 考试/v ,/wp 提供/v 完整/a 的/u 四六级/j 、/wp 考研/v 英语/nz 、/wp 雅思/n 直播/v 课程/n 、/wp 配套/v 资料/n 、/wp 在线/v 模拟/v 考试/v 随堂/d 测试/v 和/c 能力/n 评估/v 报告/n 等/u 考试/v 学习/v 解决/v 方案/n 。/wp 沪江英语/Ns

可以看到分词后的应用介绍包含一些标点符号和停用词等,根据文本特征提取的处理方法,需要过滤停用词等。

朴素贝叶斯接收的输入是libsvm格式的数据,具体格式如下:

[label] [index1]:[value1] [index2]:[value2]…

label:目标值,所属类别,通常是一些整数;

index:是有顺序的索引,通常是连续的整数,是指特征编号,必须按照升序排列;

value:特征值,用来训练的数据,通常是一堆实数。

因此,需要转化上述数据,数据转化代码参考ch03/AppTrainingData.scala,输入原始数据,生成libsvm格式的训练数据,本地测试参数和值如表3-2所示。

image.png

下面根据具体代码详细介绍词过滤及转换过程:

val minDF = rdd.flatMap(_._2.distinct).distinct()

val indexes = minDF.collect().zipWithIndex.toMap

    val training = rdd.repartition(4).map{

      case (label, terms) =>

        val svm = terms.map(v => (v, 1)).groupBy(_._1).map {

          case (v, vs) => (v, vs.length)

        }.map{

          case (v, cnt) => (indexes.get(v).getOrElse(-1) + 1, cnt)

        }.filter(_._1 > 0)

          .toSeq

          .sortBy(_._1)

          .map(x => "" + x._1 + ":" + x._2)

          .mkString(" ")

        (AppConst.APP_CLASSES.indexOf(label), svm)

    }.filter(!_._2.isEmpty)

      .map(x => "" + x._1 + " " + x._2)

将数据libsvm格式化,得到如下格式的数据(目标值 第一维特征编号:第一维特征值 第二维特征编号:第二维特征值…):

1 70454:1 70506:1 70916:1 129922:1 136081:1

简单分析数据,5个类别的分布如图3-7所示。

image.png

图3-7 数据分类分布图

完成数据分析之后,接下来使用分类算法训练模型。


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。