向量标签是一个本地向量,就是在密集向量,或者稀疏向量的基础上,添加一个标签。
<br/>
<mark>标签向量用于监督学习中</mark>,使用 double 存储一个标签,所以标签数据可以用于回归,或者分类。对于二分类,一个标签应该要么是 0 要么是 1。对于多分类,标签应该是从零开始的索引:`0,1,2,3,4`。
<br/>
**1. 通过Scala数据类型创建向量标签**
```scala
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.linalg.Vectors
object LabelVector {
def main(args: Array[String]): Unit = {
// 创建一个密集向量,向量标签为1.0
// case class LabeledPoint(val label : scala.Double, val features : org.apache.spark.mllib.linalg.Vector)
val pos: LabeledPoint = LabeledPoint(1.0, Vectors.dense(1.0, 0.0, 3.0))
println(pos) // (1.0,[1.0,0.0,3.0])
// 创建一个稀疏向量,向量标签为0.0
val neg = LabeledPoint(0.0, Vectors.sparse(3, Array(0, 2), Array(1.0, 3.0)))
println(neg) // (0.0,(3,[0,2],[1.0,3.0]))
println(neg.label) // 0.0
println(neg.features) // (3,[0,2],[1.0,3.0])
}
}
```
<br/>
**2. 通过libsvm格式数据创建向量标签**
在实际生产中训练数据是稀疏数据很常见。Mllib 支持以 libsvm 格式存储的稀疏矩阵,这是一个 `.txt` 格式文件,其中<mark>每一行代表一个打标签的稀疏特征向量</mark>,格式如下:
```txt
label index1:value1 index2:value2 ...
```
其中,索引是从 1 开始的,递增的顺序。加载之后,特征索引就转化为了从0 开始的。
<br/>
(1)数据`sample_libsvm_data.txt`
```scala
0 128:51 129:159 130:253 131:159 ...
1 159:124 160:253 161:255 162:63 ...
...
```
(2)读取`.txt`文件创建向量标签
```scala
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.util.MLUtils
import org.apache.spark.rdd.RDD
object LabelVectorLibSvm {
def main(args: Array[String]): Unit = {
val conf: SparkConf = new SparkConf().setMaster("local[*]")
.setAppName(this.getClass.getName)
val sc = SparkContext.getOrCreate(conf)
// def loadLibSVMFile(sc : org.apache.spark.SparkContext, path : scala.Predef.String
// , numFeatures : scala.Int, minPartitions : scala.Int)
val examples: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "F:/mlib/sample_libsvm_data.txt")
examples.foreach(println)
// (0.0,(692,[127,128,129,130,...], [51.0,159.0,253.0,159.0,...]))
// (1.0,(692,[158,159,160,161,...], [124.0,253.0,255.0,63.0,...]))
}
}
```