1. 程式人生 > >spark mllib和ml類裡面的區別

spark mllib和ml類裡面的區別

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
  }

}