libsvm文件数据格式:
<label> <index1>:<value1> <index2>:<value2> ...
 
其中,
<label> 是训练数据集的目标值,对于分类,它是标识某类的整数(支持多个类);对于回归,是任意实数。
<index> 是以1开始的整数,可以是不连续的;
<value>为实数,也就是我们常说的自变量。
即:lable 数据集的标签,index为特征,value为特征值。
例如:
+1  1:0.708333  2:1   3:1           4:-0.320755
-1  1:0.583333  2:-1  3:0.333333    4:-0.603774 
+1  1:0.166667  2:1   3:-0.333333   4:-0.433962 
-1  1:0.458333  2:1   3:1           4:-0.358491 
 
需要注意的是,如果特征值value为0,则此特征可以省略,index可以不连续。如:
-15 1:0.708 3:-0.3333
 
表明第2个特征值为0,从编程的角度来说,这样做可以减少内存的使用,并提高做矩阵内积时的运算速度。
需要注意以下几点:
- 标签列label可以重复;
 - 索引index要从1开始;
 - 数据的长度是以最大列数为准的,因为特征值value为0,则此特征index可以省略。因此最好是要保持数据列数一致;
 
Spark 中自带的 data/mllib/sample_libsvm_data.txt 介绍:
总共100个实例,label的取值为:0和1。有692个特征。
scala> val data = spark.read.format("libsvm").load("data/mllib/sample_libsvm_data.txt)
data: org.apache.spark.sql.DataFrame = [label: double, features: vector]scala> data.count
res1: Long = 100scala> data.show()
+-----+--------------------+
|label|            features|
+-----+--------------------+
|  0.0|(692,[127,128,129...|
|  1.0|(692,[158,159,160...|
|  1.0|(692,[124,125,126...|
|  1.0|(692,[152,153,154...|
|  1.0|(692,[151,152,153...|
|  0.0|(692,[129,130,131...|
|  1.0|(692,[158,159,160...|
|  1.0|(692,[99,100,101,...|
|  0.0|(692,[154,155,156...|
|  0.0|(692,[127,128,129...|
|  1.0|(692,[154,155,156...|
|  0.0|(692,[153,154,155...|
|  0.0|(692,[151,152,153...|
|  1.0|(692,[129,130,131...|
|  0.0|(692,[154,155,156...|
|  1.0|(692,[150,151,152...|
|  0.0|(692,[124,125,126...|
|  0.0|(692,[152,153,154...|
|  1.0|(692,[97,98,99,12...|
|  1.0|(692,[124,125,126...|
+-----+--------------------+
only showing top 20 rows
