mllib java怎么调用_如何准备mllib中的训练数据
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中的训练数据相关推荐
- java 摄像头 win7_Win7系统下JAVA摄像头调用_实例代码介绍
Win7系统下JAVA摄像头调用_实例代码介绍.由于要搞个人脸识别登录(JAVACV),百度谷歌了一下午,找了网上简单的样例代码来试,可是老是调试不过,出现CaptureDeviceManager.g ...
- java 内存跟踪_详解JVM中的本机内存跟踪
1.概述 有没有想过为什么Java应用程序通过众所周知的-Xms和-Xmx调优标志消耗的内存比指定数量多得多?出于各种原因和可能的优化,JVM可以分配额外的本机内存.这些额外的分配最终会使消耗的内存超 ...
- java reduce 分组_使用JAVA8 stream中三个参数的reduce方法对List进行分组统计
背景 平时在编写前端代码时,习惯使用lodash来编写'野生'的JavaScript; lodash提供来一套完整的API对JS对象(Array,Object,Collection等)进行操作,这其中 ...
- 神经网络模型中class的forward函数何时调用_用Keras从零开始6步骤训练神经网络
本文将简要介绍Keras的功能特点,使用Keras构建模型一般流程的6个步骤,以及使用Keras处理mnist分类问题的一个简单范例. 一,Keras简介 Keras 是一个用 Python 编写的高 ...
- java readline 实现_基于自定义BufferedReader中的read和readLine方法
实例如下所示: package day0208; import java.io.FileReader; import java.io.IOException; /* * 自定义读取缓冲区,实现Buff ...
- mysql查询集合中的特定数据_快速查询List中指定的数据
时间:2017/5/15 作者:李国君 题目:快速查询List中指定的数据 背景:当List中保存了大量的数据时,用传统的方法去遍历指定的数据肯定会效率低下,有一个方法就是类似于数据库查询那样,根据索 ...
- java删除jtable一行的值_JTable中删除一行数据
Jtable中删除一行数据: import java.awt.BorderLayout; import java.awt.Component; import java.awt.Container; i ...
- php后台数据显示到前端,php,前端_怎么在javascript中得到后台数据?,php,前端,javascript,highcharts - phpStudy...
怎么在javascript中得到后台数据? 最近在研究在网页中嵌入hightchart的表格 在嵌入时发现需要在javascript中得到后台的一组数据 代码如下 require_once('incl ...
- 未越狱设备提取数据_从三星设备中提取健康数据
未越狱设备提取数据 Health data is collected every time you have your phone in your pocket. Apple or Android, ...
最新文章
- linux mysql udf渗透测试
- Linux内核之浅谈内存寻址
- Zookeeper集群的搭建及遇到的问题
- python中pyecharts模块全局配置_python中pyecharts模块的使用示例
- [SCOI2008]着色方案(DP)
- 20条.net编码习惯 【转】
- k8s调度 原理_开源爆款,阿里P7技术笔记《k8s+docker》,图文并茂,理论与实战齐飞!...
- 电子类公司笔试题精选
- 100以内偶数的个数_【数学杂谈】如何记住1000以内的所有质数?
- c语言喂狗的作用,兽医忠告:用这几样食物喂狗,简直就是喂“砒霜”!
- java图片颜色取反色,照片底片模式
- spring 配置属性细节
- Codeforces 596D Wilbur and Trees
- 解开神经科学中的交叉频率耦合
- inux常用命令-持续更新中(转载:小牛导航,super-nb)
- CAIDA AS Rank项目介绍
- 去中心化应用:区块链技术概述
- 爬虫B站任意视频 弹幕文字+时间
- 既生瑜何生亮,成发布会新宠的网红会干掉自媒体?!
- 练习- Java顺序结构综合练习二之温度换算