《Spark机器学习进阶实战》——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所示。
下面根据具体代码详细介绍词过滤及转换过程:
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所示。
图3-7 数据分类分布图
完成数据分析之后,接下来使用分类算法训练模型。
- 点赞
- 收藏
- 关注作者
评论(0)