spark mllib和ml類裡面的區別
阿新 • • 發佈:2018-11-30
mllib是老的api,裡面的模型都是基於RDD的,模型使用的時候api也是有變化的(model這裡是naiveBayes),
(1:在模型訓練的時候是naiveBayes.run(data: RDD[LabeledPoint])來訓練的,run之後的返回值是一個NaiveBayesModel物件,就可以使用NaiveBayesModel.predict(testData: RDD[Vector]): RDD[Double] 裡面不僅可以傳入一個RDD[Vector] ,裡面還可以傳入單個Vector,得到單個預測值,然後就可以呼叫save來進行儲存了,具體的可以看官方文件API
(2:模型使用可以參考(1,模型的讀取是使用load方法去讀的
ml是新的API,ml包裡面的模型是基於dataframe操作的
(1:在模型訓練的時候是使用naiveBayes.fit(dataset: Dataset[]): NaiveBayesModel來訓練模型的,返回值是一個naiveBayesModel,可以使用naiveBayesModel.transform(dataset: Dataset[]): DataFrame,進行模型的檢驗,然後再通過其他的方法來評估這個模型,
(2:模型的使用可以參考(1: 是使用transform來進行預測的,取預測值可以使用select來取值,使用select的時候可以使用“$”label””的形式來取值
訓練的時候是使用的NaiveBayes,使用的時候使用naiveBayesModel
ml包裡的模型訓練程式碼請參考ml包裡面的模型訓練程式碼 ml包裡面的模型的使用
mllib程式碼的使用會在稍後貼上:
mllib的建模使用程式碼:
import org.apache.spark.SparkConf import org.apache.spark.SparkContext import org.apache.spark.mllib.feature.HashingTF import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.mllib.classification.LogisticRegressionWithSGD class EmailClassification { } object EmailClassification{ def main(args: Array[String]): Unit = { val sc = getSparkCont() //每一行都以一封郵件 val spam = sc.textFile("spam.txt"); val nomal = sc.textFile("normal.txt") //建立一個hashingTF例項來吧郵件文字對映為包含10000個特徵的向量 val tf = new HashingTF(10000) //把郵件都被分割為單詞,每個單詞都被對映成一個向量 val spamFeatures = spam.map { email => tf.transform(email.split(" ")) } val nomalFeatures = nomal.map { email => tf.transform(email.split(" ")) } //建立LabelPoint 的資料集 val positiveExamples = spamFeatures.map { feature => LabeledPoint(1,feature) } val negativeExamples = nomalFeatures.map { feature => LabeledPoint(1,feature) } val trainingData = positiveExamples.union(negativeExamples) //使用SGD演算法執行邏輯迴歸 返回的型別是LogisticRegression 但是這個模型是有save,但是沒有load方法,我還在思考,讀者如果有什麼意見或者看法可以下面評論的 val model = new LogisticRegressionWithSGD().run(trainingData) //建立一個郵件向量進行測試 val posTest = tf.transform("cheap stuff by sending money to ....".split(" ")) val prediction = model.predict(posTest) println(prediction) } def getSparkCont():SparkContext={ val conf = new SparkConf().setAppName("email").setMaster("local[4]") val sc = new SparkContext(conf) return sc } }