MLlib的設計原理:把數據以RDD的形式表示,然后在分布式數據集上調用各種算法。MLlib就是RDD上一系列可供調用的函數的集合。
操作步驟:
1、用字符串RDD來表示信息。
2、運行MLlib中的一個特征提取算法來吧文本數據轉換為數值的特征。給操作會返回一個向量RDD。
3、對向量RDD調用分類算法,返回一個模型對象,可以使用該對象對新的數據點進行分類。
4、使用MLlib的評估函數在測試數據集上評估模型。
機器學習基礎:
機器學習算法嘗試根據 訓練數據 使得表示算法行為的數學目標最大化,並以此來進行預測或作出決定。包括分類、回歸、聚類,每種都有不一樣的目標。 所有的學習算法都需要定義每個數據點的特征集,也就是傳給學習函數的值。
更重要的在於如何去正確的定義特征。 例如: 在產品推薦的任務中,僅僅機上一個額外的特征(推薦給用戶的書籍也可能取決於用戶看過的電影),就有可能極大地改進結果。 當數據已成為特征向量的形式后,大多數機器學習算法會根據這些向量優化一個定義好的數學模型。 然后算法會再運行結束時返回一個代表學習決定的模型。
MLlib數據類型
1、Vector
一個數學向量。MLlib既支持稠密向量也支持稀疏向量。前者表示向量的每一位都存儲下來,后者則存儲非零位以節省空間。
稠密向量:把所有唯獨的值存放在一個浮點整數組中。
稀疏向量只把各維度中的非零值存儲下來。當最多只有10%的元素為非零元素時,通常更傾向於使用稀疏向量。
spark中創建向量的方式有
import org.apache.spark.mllib.linalg.Vectors //創建稠密向量<1.0,2.0,3.0>;Vectors.dense接收一串值或一個數組 val denseVec1 = Vectors.dense(1.0,2.0,3.0)) val denseVec2 = Vectors.dense(Array(1.0,2.0,3.0)) //創建稀疏向量<1.0,0.0,2.0,0.0> 向量的維度(4) 以及非零位的位置和對應的值 val sparseVec1 = Vectors.sparse(4,Array(0,2),Array(1.0,2.0))
2、LabeledPoint
諸如分類和回歸的算法這樣的監督學習算法中,LabeledPoint用來表示帶標簽的數據點。它包含一個特征向量與一個標簽(由一個浮點數表示),位置在mllib.regression包中。
3、Rating
用戶對一個產品的評分,在mllib.recomendation包中,用於產品推薦。
4、各種Model類
每個Model都是訓練算法的結果,一般有一個predict()方法可以用來對新的數據點或數據點組成的RDD應用該模型進行預測。
特征轉化:
TF-IDF:詞頻,逆文檔頻率是一種用來從文本文檔中生成特征向量的簡單方法。它為文檔中的每個詞計算兩個統計值:一個是詞頻(TF),也就是每個詞在文檔中出現的次數,另一個是逆文檔頻率(IDF),用來衡量一個詞語特定文檔的相關度。
MLlib有兩個算法可以用來計算TF-IDF:HashTF和TF
HashTF從一個文檔中計算出給定大小的詞頻向量。為了將詞和向量順序對應起來,所以使用了哈希。HashingTF使用每個單詞對所需向量的長度S取模得出的哈希值,把所有單詞映射到一個0到S-1之間的數字上。由此可以保證生成一個S維的向量。隨后當構建好詞頻向量后,使用IDF來計算逆文檔頻率,然后將它們與詞頻相乘計算TF-IDF。
MLlib統計
1、Statistics.colStats(rdd)
計算由向量組成的RDD的統計性綜述,保存着向量集合中每列的最大值、最小值、平均值和方差。
2、statistics.corr(rdd,method_
計算由向量組成的RDD中的列間的相關矩陣,使用皮卡森相關或斯皮爾曼相關中的一種。
3、statistics.corr(rdd1,rdd2,method)
計算兩個由浮點值組成的RDD的相關矩陣。
4、Statistics.chiSqTest(rdd)
計算由LabeledPoint對象組成的RDD中每個特征與標簽的皮卡森獨立性測試結果。返回一個ChiSqTestResult對象,其中有p值、測試統計及每個特征的自由度。
分類與回歸
監督試學習指算法嘗試使用有標簽的訓練數據(已知結果的數據點)根據對象的特征預測的結果。在分類中,預測出的變量是離散的(就是一個在有限集中的值,叫做類別) 。比如,分類可能是將郵件文衛垃圾郵件和非垃圾郵件,也有可能是文本所使用的語言。在回歸中,預測出的是變量是連續的(根據年齡和體重預測一個人的身高)
線性回歸:
1、numIteratrions
要運行的迭代次數(默認值:100)
2、stepSize
梯度下降的步長(默認值:1.0)
3、intercept
是否給數據加上一個干擾特征或者偏差特征--也就是一個值始終未1的特征(默認值:false)
4、regParam
Lasso和ridge的正規化參數(默認值:1.0)
import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.mllib.regression.LinearRegressionWithSGD val points: RDD[LabeledPoint] = //.. val lr = new LinearRegressiionWithSGD().setNumIterations(200).setIntercept(true) val model = lr.run(points) println("weight: %s, intercept: %s".format(model.weights, model.intercept))
邏輯回歸
用來尋找一個分割陰性和陽性示例的線性分割平面。在MLlib中,接收一組標簽為0或1的LabeledPoint,返回可以預測新點的分類的LogisticRegressionModel對象。
決策樹與隨機深林
決策樹是一個靈活的模型,可以用來進行分類,也可以用來進行回歸。決策樹以節點樹的形式表示,每個節點基於數據的特征作出一個二元決定(比如這個人的年齡是否大於20?),而樹的每個葉節點則包含一種預測結果(例如,這個人是不是會買一個產品?)決策樹的吸引力在於模型本身容易檢查,而且決策樹既支持分類的特征,也支持連續的特征。
參考於:《Spark快速大數據分析》
