日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發(fā)布時間:2025/4/16 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 mllib java怎么调用_如何准备mllib中的训练数据 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

ML LogisticRegression 尚不支持多項分類,但MLLib NaiveBayes 和 LogisticRegressionWithLBFGS 都支持它 . 在第一種情況下,它應(yīng)該默認工作:

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

val nbModel = new NaiveBayes()

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

.run(train)

但是對于邏輯回歸,你應(yīng)該提供一些類:

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

val model = new LogisticRegressionWithLBFGS()

.setNumClasses(n) // Set number of classes

.run(trainingData)

關(guān)于預(yù)處理步驟,這是一個相當廣泛的主題,如果沒有訪問您的數(shù)據(jù),很難給您一個有意義的建議,所以您在下面找到的所有內(nèi)容只是一個瘋狂的猜測:

據(jù)我所知,您使用維基數(shù)據(jù)進行培訓(xùn)和推文進行測試 . 如果這是真的,一般來說這是一個壞主意 . 您可以預(yù)期兩組使用顯著不同的詞匯,語法和拼寫

簡單的正則表達式標記符可以在標準化文本上很好地執(zhí)行,但根據(jù)我的經(jīng)驗,它不會像推文那樣在非正式文本上運行良好

HashingTF 可以是獲得基線模型的好方法,但它是極其簡化的方法,特別是如果您不應(yīng)用任何過濾步驟 . 如果您決定使用它,至少應(yīng)增加功能數(shù)量或使用默認值(2 ^ 20)

EDIT (用IDF為樸素貝葉斯準備數(shù)據(jù))

使用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算法準備數(shù)據(jù)):

雖然下面的代碼看起來有點乍一看

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是類的數(shù)量 . 如果你的示例管道中有一個類得到標簽0.001,你將得到如下錯誤:

ERROR LogisticRegression:分類標簽應(yīng)在{0到0中找到1個無效標簽 .

顯而易見的解決方案是在生成映射時避免除法

.mapValues(x=>x.toDouble)

雖然它適用于 LogisticRegression 其他 ML 算法仍然會失敗 . 例如 RandomForestClassifier 你會得到

給RandomForestClassifier輸入了無效的標簽列標簽,沒有指定的類數(shù) . 請參見StringIndexer .

有趣的是, RandomForestClassifier 的ML版本與 MLlib 版本不同,它沒有提供設(shè)置多個類的方法 . 事實證明,它希望在 DataFrame 列上設(shè)置特殊屬性 . 最簡單的方法是使用錯誤消息中提到的 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)

總結(jié)

以上是生活随笔為你收集整理的mllib java怎么调用_如何准备mllib中的训练数据的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。