標注點LabeledPoint
是一種帶有標簽(Label/Response)的本地向量,它可以是稠密或者是稀疏的。在MLlib中,標注點在監督學習算法中被使用。由於標簽是用雙精度浮點型來存儲的,故標注點類型在回歸(Regression)和分類(Classification)問題上均可使用。例如,對於二分類問題,則正樣本的標簽為1
,負樣本的標簽為0
,而對於多類別的分類問題來說,標簽則應是一個以0開始的索引序列:0, 1, 2 ...
標注點的實現類是org.apache.spark.mllib.regression.LabeledPoint
,請注意它與前面介紹的本地向量不同,並不位於linalg
包下,標注點的創建如下所示:
scala> import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.linalg.Vectors scala> import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.mllib.regression.LabeledPoint //創建一個標簽為1.0(分類中可視為正樣本)的稠密向量標注點 scala> val pos = LabeledPoint(1.0, Vectors.dense(2.0, 0.0, 8.0)) pos: org.apache.spark.mllib.regression.LabeledPoint = (1.0,[2.0,0.0,8.0]) //創建一個標簽為0.0(分類中可視為負樣本)的稀疏向量標注點 scala> val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(2.0, 8.0))) neg: org.apache.spark.mllib.regression.LabeledPoint = (0.0,(3,[0,2],[2.0,8.0]))
在實際的機器學習問題中,稀疏向量數據是非常常見的,MLlib提供了讀取LIBSVM格式數據的支持,該格式被廣泛用於LIBSVM、LIBLINEAR等機器學習庫。在該格式下,每一個帶標注的樣本點由以下格式表示:
label index1:value1 index2:value2 index3:value3 ...
其中label
是該樣本點的標簽值,一系列index:value
對則代表了該樣本向量中所有非零元素的索引和元素值。這里需要特別注意的是,index是以1開始並遞增的。
MLlib在org.apache.spark.mllib.util.MLUtils
工具類中提供了讀取LIBSVM格式的方法loadLibSVMFile
,其使用非常方便。
1 scala> import org.apache.spark.mllib.util.MLUtils 2 import org.apache.spark.mllib.util.MLUtils 3 4 // 用loadLibSVMFile方法讀入LIBSVM格式數據 5 // sample_libsvm_data.txt為spark自帶的一個示例,在以下地址可以找到: 6 // $SPARK_HOME$/data/mllib/sample_libsvm_data.txt 7 scala> val examples = MLUtils.loadLibSVMFile(sc, "/data/mllib/sample_libsvm_data.txt") 8 //返回的是組織成RDD的一系列LabeledPoint 9 examples: org.apache.spark.rdd.RDD[org.apache.spark.mllib.regression.LabeledPoint] = MapPartitionsRDD[6] at map at MLUtils.scala:108 10
這里,sc是Spark-shell自動建立的SparkContext
。我們可以查看下加載進來的標注點的值:
1 scala> examples.collect().head 2 res7: org.apache.spark.mllib.regression.LabeledPoint = (0.0,(692,[127,128,129,130,131,154,155,156,157,158,159,181,182,183,184,185,186,187,188,189,207,208,209,210,211,212,213,214,215,216,217,235,236,237,238,239,240,241,242,243,244,245,262,263,264,265,266,267,268,269,270,271,272,273,289,290,291,292,293,294,295,296,297,300,301,302,316,317,318,319,320,321,328,329,330,343,344,345,346,347,348,349,356,357,358,371,372,373,374,384,385,386,399,400,401,412,413,414,426,427,428,429,440,441,442,454,455,456,457,466,467,468,469,470,482,483,484,493,494,495,496,497,510,511,512,520,521,522,523,538,539,540,547,548,549,550,566,567,568,569,570,571,572,573,574,575,576,577,578,594,595,596,597,598,599,600,601,602,603,604,622,623,624,625,626,627,628,629,630,651,652,653,654,655,656,657],[51.0,159.0,253.0,159.0,50...
這里,examples.collect()把rdd轉換為了向量,並取第一個元素的值。每個標注點共有692個維,其中第127列對應的值是51.0,第128列對應的值是159.0,依此類推。