Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 如何在mllib中准备训练数据_Apache Spark_Apache Spark Mllib_Apache Spark Ml - Fatal编程技术网

Apache spark 如何在mllib中准备训练数据

Apache spark 如何在mllib中准备训练数据,apache-spark,apache-spark-mllib,apache-spark-ml,Apache Spark,Apache Spark Mllib,Apache Spark Ml,TL;博士 如何使用mllib来训练我的wiki数据(文本和类别),以便根据tweet进行预测 我很难理解如何转换标记化的wiki数据,以便通过NaiveBayes或LogisticRegression对其进行训练。我的目标是使用经过训练的模型与tweet*进行比较。我曾尝试使用LR管道和IDF管道,但我总是得到错误的预测。以下是我尝试过的: *请注意,我想使用wiki数据中的许多类别作为我的标签…我只看到了二进制分类(这是一个类别或另一个类别)…有可能实现我想要的吗 带LR的管道 import

TL;博士 如何使用
mllib
来训练我的wiki数据(文本和类别),以便根据tweet进行预测

我很难理解如何转换标记化的wiki数据,以便通过
NaiveBayes
LogisticRegression
对其进行训练。我的目标是使用经过训练的模型与tweet*进行比较。我曾尝试使用LR管道和IDF管道,但我总是得到错误的预测。以下是我尝试过的:

*请注意,我想使用wiki数据中的许多类别作为我的标签…我只看到了二进制分类(这是一个类别或另一个类别)…有可能实现我想要的吗

带LR的管道
import org.apache.spark.rdd.rdd
导入org.apache.spark.SparkContext
导入org.apache.spark.ml.feature.HashingTF
导入org.apache.spark.mllib.linalg.Vector
导入org.apache.spark.ml.feature.regeXenizer
案例类WikiData(类别:字符串,文本:字符串)
案例类LabeledData(类别:String,文本:String,标签:Double)
val wikiData=sc.parallelize(列表(wikiData(“Spark”,“这是关于Spark”)、wikiData(“Hadoop”,“然后就是Hadoop”))
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
val标记器=新的RegexTokenizer()
.setInputCol(“文本”)
.setOutputCol(“文字”)
.setPattern(“/W+”)
val hashingTF=新hashingTF()
.setNumFeatures(1000)
.setInputCol(标记器.getOutputCol)
.setOutputCol(“特性”)
val lr=新逻辑回归()
.setMaxIter(10)
.setRegParam(0.01)
val管道=新管道()
.setStages(数组(标记器、哈希函数、lr))
val模型=pipeline.fit(标签数据)
model.transform(labeledData).show
朴素贝叶斯
val hashingTF=new hashingTF()
val tf:RDD[Vector]=哈希变换(DocumentsWordSequenceReady)
导入org.apache.spark.mllib.feature.IDF
tf.cache()
val idf=新的idf().fit(tf)
val-tfidf:RDD[Vector]=idf.transform(tf)
tf.cache()
val idf=新idf(minDocFreq=2).配合(tf)
val-tfidf:RDD[Vector]=idf.transform(tf)
//要创建TFIDFTlabel(如下),我运行了一个映射设置标签…但它似乎必须是1.0或0.0?
NaiveBayes.列车(TFIDF)
.predict(hashingTF.transform(tweet))
.收集

ML
LogisticRegression
还不支持多项式分类,但它同时受到MLLib
NaiveBayes
LogisticRegressionWithLBFGS
的支持。在第一种情况下,默认情况下它应该工作:

import org.apache.spark.mllib.classification.bayes
val nbModel=new NaiveBayes()
.setModelType(“多项式”)//这是默认值
.跑(火车)
但是对于逻辑回归,您应该提供一些类:

import org.apache.spark.mllib.classification.LogisticRegressionWithLBFGS
val模型=使用LBFGS()的新逻辑回归
.setNumClasses(n)//设置类的数量
.运行(培训数据)
关于预处理步骤,这是一个相当广泛的主题,如果不访问您的数据,很难给您提供有意义的建议,因此您在下面找到的一切都只是一个猜测:

  • 据我所知,您使用wiki数据进行培训,使用tweet进行测试。如果这是真的,一般来说这是个坏主意。您可以预期,这两个集合使用了显著不同的词汇、语法和拼写
  • 简单的正则表达式标记器可以在标准文本上运行得很好,但根据我的经验,它在非正式文本(如tweet)上运行得不好
  • HashingTF
    是获得基线模型的一种好方法,但它是一种极其简化的方法,尤其是在不应用任何过滤步骤的情况下。如果您决定使用它,您至少应该增加功能的数量或使用默认值(2^20)
编辑(使用IDF为朴素贝叶斯准备数据)

  • 使用ML管道:
import org.apache.spark.mllib.regression.LabeledPoint
导入org.apache.spark.mllib.linalg.Vector
导入org.apache.spark.ml.feature.IDF
导入org.apache.spark.sql.Row
val标记器=???
val hashingTF=新hashingTF()
.setNumFeatures(1000)
.setInputCol(标记器.getOutputCol)
.setOutputCol(“原始特征”)
val idf=新的idf()
.setInputCol(hashingTF.getOutputCol)
.setOutputCol(“特性”)
val pipeline=new pipeline()
val模型=pipeline.fit(标签数据)
模型
.transform(labeledData)
。选择($“标签”,$“要素”)
.map{案例行(标签:双精度,特征:向量)=>LabeledPoint(标签,特征)}
  • 使用MLlib转换器:
import org.apache.spark.mllib.feature.HashingTF
导入org.apache.spark.mllib.linalg.Vector
导入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(u,text,label)=>(label,p.split(text))}
val hashingTF:org.apache.spark.mllib.feature.hashingTF=新的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(u._2))
tf.map{
大小写(label,rawFeatures)=>LabeledPoint(label,idf.transform(rawFeatures))}
注意:由于转换器需要JVM访问,所以MLlib版本在PySpark中不起作用。如果你喜欢Python,你必须这样做

编辑(为ML算法准备数据):

而下面的代码乍一看是有效的

val categoryMap=wikiData
.map(x=>x.category)
不同的
zipWithIndex先生
.mapValues(x=>x.toDouble/1000)
.收集地图
val labeledData=wikiData.map(x=>labeledData(
x、 类别,x。
.mapValues(x=>x.toDouble)