ML LogisticRegression 尚不支持多项分类,但MLLib NaiveBayes 和 LogisticRegressionWithLBFGS 都支持它 . 在第一种情况下,它应该默认工作:

import org.apache.spark.mllib.classification.NaiveBayes

val nbModel = new NaiveBayes()

.setModelType("multinomial") // This is default value

.run(train)

但是对于逻辑回归,你应该提供一些类:

import org.apache.spark.mllib.classification.LogisticRegressionWithLBFGS

val model = new LogisticRegressionWithLBFGS()

.setNumClasses(n) // Set number of classes

.run(trainingData)

关于预处理步骤,这是一个相当广泛的主题,如果没有访问您的数据,很难给您一个有意义的建议,所以您在下面找到的所有内容只是一个疯狂的猜测:

据我所知,您使用维基数据进行培训和推文进行测试 . 如果这是真的,一般来说这是一个坏主意 . 您可以预期两组使用显着不同的词汇,语法和拼写

简单的正则表达式标记符可以在标准化文本上很好地执行,但根据我的经验,它不会像推文那样在非正式文本上运行良好

HashingTF 可以是获得基线模型的好方法,但它是极其简化的方法,特别是如果您不应用任何过滤步骤 . 如果您决定使用它,至少应增加功能数量或使用默认值(2 ^ 20)

EDIT (用IDF为朴素贝叶斯准备数据)

使用ML管道:

import org.apache.spark.mllib.regression.LabeledPoint

import org.apache.spark.mllib.linalg.Vector

import org.apache.spark.ml.feature.IDF

import org.apache.spark.sql.Row

val tokenizer = ???

val hashingTF = new HashingTF()

.setNumFeatures(1000)

.setInputCol(tokenizer.getOutputCol)

.setOutputCol("rawFeatures")

val idf = new IDF()

.setInputCol(hashingTF.getOutputCol)

.setOutputCol("features")

val pipeline = new Pipeline().setStages(Array(tokenizer, hashingTF, idf))

val model = pipeline.fit(labeledData)

model

.transform(labeledData)

.select($"label", $"features")

.map{case Row(label: Double, features: Vector) => LabeledPoint(label, features)}

使用MLlib变换器:

import org.apache.spark.mllib.feature.HashingTF

import org.apache.spark.mllib.linalg.Vector

import org.apache.spark.mllib.feature.{IDF, IDFModel}

val labeledData = wikiData.map(x =>

LabeledData(x.category, x.text, categoryMap.get(x.category).getOrElse(0.0)))

val p = "\\W+".r

val raw = labeledData.map{

case LabeledData(_, text, label) => (label, p.split(text))}

val hashingTF: org.apache.spark.mllib.feature.HashingTF = new HashingTF(1000)

val tf = raw.map{case (label, text) => (label, hashingTF.transform(text))}

val idf: org.apache.spark.mllib.feature.IDFModel = new IDF().fit(tf.map(_._2))

tf.map{

case (label, rawFeatures) => LabeledPoint(label, idf.transform(rawFeatures))}

注意:由于变换器需要JVM访问,因此MLlib版本在PySpark中不起作用 . 如果你更喜欢Python,你必须split data transform and zip .

EDIT (为ML算法准备数据):

虽然下面的代码看起来有点乍一看

val categoryMap = wikiData

.map(x=>x.category)

.distinct

.zipWithIndex

.mapValues(x=>x.toDouble/1000)

.collectAsMap

val labeledData = wikiData.map(x=>LabeledData(

x.category, x.text, categoryMap.get(x.category).getOrElse(0.0))).toDF

它不会为 ML 算法生成有效标签 .

首先 ML 期望标签在(0.0,1.0,...,n.0)中,其中n是类的数量 . 如果你的示例管道中有一个类得到标签0.001,你将得到如下错误:

ERROR LogisticRegression:分类标签应在{0到0中找到1个无效标签 .

显而易见的解决方案是在生成映射时避免除法

.mapValues(x=>x.toDouble)

虽然它适用于 LogisticRegression 其他 ML 算法仍然会失败 . 例如 RandomForestClassifier 你会得到

给RandomForestClassifier输入了无效的标签列标签,没有指定的类数 . 请参见StringIndexer .

有趣的是, RandomForestClassifier 的ML版本与 MLlib 版本不同,它没有提供设置多个类的方法 . 事实证明,它希望在 DataFrame 列上设置特殊属性 . 最简单的方法是使用错误消息中提到的 StringIndexer :

import org.apache.spark.ml.feature.StringIndexer

val indexer = new StringIndexer()

.setInputCol("category")

.setOutputCol("label")

val pipeline = new Pipeline()

.setStages(Array(indexer, tokenizer, hashingTF, idf, lr))

val model = pipeline.fit(wikiData.toDF)

mllib java怎么调用_如何准备mllib中的训练数据相关推荐

  1. java 摄像头 win7_Win7系统下JAVA摄像头调用_实例代码介绍

    Win7系统下JAVA摄像头调用_实例代码介绍.由于要搞个人脸识别登录(JAVACV),百度谷歌了一下午,找了网上简单的样例代码来试,可是老是调试不过,出现CaptureDeviceManager.g ...

  2. java 内存跟踪_详解JVM中的本机内存跟踪

    1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...

  3. java reduce 分组_使用JAVA8 stream中三个参数的reduce方法对List进行分组统计

    背景 平时在编写前端代码时,习惯使用lodash来编写'野生'的JavaScript; lodash提供来一套完整的API对JS对象(Array,Object,Collection等)进行操作,这其中 ...

  4. 神经网络模型中class的forward函数何时调用_用Keras从零开始6步骤训练神经网络

    本文将简要介绍Keras的功能特点,使用Keras构建模型一般流程的6个步骤,以及使用Keras处理mnist分类问题的一个简单范例. 一,Keras简介 Keras 是一个用 Python 编写的高 ...

  5. java readline 实现_基于自定义BufferedReader中的read和readLine方法

    实例如下所示: package day0208; import java.io.FileReader; import java.io.IOException; /* * 自定义读取缓冲区,实现Buff ...

  6. mysql查询集合中的特定数据_快速查询List中指定的数据

    时间:2017/5/15 作者:李国君 题目:快速查询List中指定的数据 背景:当List中保存了大量的数据时,用传统的方法去遍历指定的数据肯定会效率低下,有一个方法就是类似于数据库查询那样,根据索 ...

  7. java删除jtable一行的值_JTable中删除一行数据

    Jtable中删除一行数据: import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; i ...

  8. php后台数据显示到前端,php,前端_怎么在javascript中得到后台数据?,php,前端,javascript,highcharts - phpStudy...

    怎么在javascript中得到后台数据? 最近在研究在网页中嵌入hightchart的表格 在嵌入时发现需要在javascript中得到后台的一组数据 代码如下 require_once('incl ...

  9. 未越狱设备提取数据_从三星设备中提取健康数据

    未越狱设备提取数据 Health data is collected every time you have your phone in your pocket. Apple or Android, ...

最新文章

  1. linux mysql udf渗透测试
  2. Linux内核之浅谈内存寻址
  3. Zookeeper集群的搭建及遇到的问题
  4. python中pyecharts模块全局配置_python中pyecharts模块的使用示例
  5. [SCOI2008]着色方案(DP)
  6. 20条.net编码习惯 【转】
  7. k8s调度 原理_开源爆款,阿里P7技术笔记《k8s+docker》,图文并茂,理论与实战齐飞!...
  8. 电子类公司笔试题精选
  9. 100以内偶数的个数_【数学杂谈】如何记住1000以内的所有质数?
  10. c语言喂狗的作用,兽医忠告:用这几样食物喂狗,简直就是喂“砒霜”!
  11. java图片颜色取反色,照片底片模式
  12. spring 配置属性细节
  13. Codeforces 596D Wilbur and Trees
  14. 解开神经科学中的交叉频率耦合
  15. inux常用命令-持续更新中(转载:小牛导航,super-nb)
  16. CAIDA AS Rank项目介绍
  17. 去中心化应用:区块链技术概述
  18. 爬虫B站任意视频 弹幕文字+时间
  19. 既生瑜何生亮,成发布会新宠的网红会干掉自媒体?!
  20. 练习- Java顺序结构综合练习二之温度换算

热门文章

  1. python 统计文件夹各类格式文件数量, 具通用性
  2. HDU 5727 Necklace
  3. oracle 表分区[三]
  4. 定义系统消息 Specify system messages
  5. 吴恩达专访 Yann LeCun:是的我们曾经历黑暗时刻,但我始终抱有信念
  6. MIT发布“全球最快AutoML”,刷新DARPA比赛成绩
  7. 担心被机器人抢饭碗?亚马逊教 10 万员工这样保住工作
  8. 机器学习入门案例简单理解——Tensorflow之MNIST解析
  9. softmax函数理解
  10. 给嵌入式工程师的一封信