libsvm文件数据格式:
xml
<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
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 = 100
scala> 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