spark:将数据帧转换为svm标记的点

时间:2017-03-10 09:38:19

标签: scala apache-spark apache-spark-mllib

当提到spark ml / mllib文档时,它们都是从一个svm存储的例子开始的。这真让我感到沮丧,因为似乎没有一种简单的方法可以从标准的RDD [Row]或Dataframe(取自“table”选择)转到这种表示法而不先存储它。

在处理3个功能时,这只是一个不方便,但是当你扩展到很多很多功能时,这意味着你将进行大量的打字和搜索。

我最终得到了这样的结果:(其中“train”是数据集的随机分割,具有存储在表格中的特征)

val trainLp = train.map(row => LabeledPoint(row.getInt(0).toDouble, Vectors.dense(row(8).asInstanceOf[Int].toDouble,row(9).asInstanceOf[Int].toDouble,row(10).asInstanceOf[Int].toDouble,row(11).asInstanceOf[Int].toDouble,row(12).asInstanceOf[Int].toDouble,row(13).asInstanceOf[Int].toDouble,row(14).asInstanceOf[Int].toDouble,row(15).asInstanceOf[Int].toDouble,row(18).asInstanceOf[Int].toDouble,row(21).asInstanceOf[Int].toDouble,row(27).asInstanceOf[Int].toDouble,row(28).asInstanceOf[Int].toDouble,row(29).asInstanceOf[Int].toDouble,row(30).asInstanceOf[Int].toDouble,row(31).asInstanceOf[Double],row(32).asInstanceOf[Double],row(33).asInstanceOf[Double],row(34).asInstanceOf[Double],row(35).asInstanceOf[Double],row(36).asInstanceOf[Double],row(37).asInstanceOf[Double],row(38).asInstanceOf[Double],row(39).asInstanceOf[Double],row(40).asInstanceOf[Double],row(41).asInstanceOf[Double],row(42).asInstanceOf[Double],row(43).asInstanceOf[Double])))

这是一个需要维护的噩梦,因为这些行往往会经常发生变化。

在这里,我只是处于获得标记点的阶段,我甚至不在这个数据的svm存储版本。

我在这里想念的是什么可能为我节省多少痛苦?

编辑:

我使用名为vectorassembler的东西向解决方案迈进了一步,以构建我的向量

1 个答案:

答案 0 :(得分:0)

通常,CSV文件是未经过滤的未经过滤的信息来源。它们通常提供原始信息来源。

为了构建模型,您通常希望在构建模型之前进行数据清理,数据准备,数据争论(以及可能更多的“数据x”措辞)阶段。这个阶段通常需要模型构建的一大部分,并且通常需要探索数据。通常,在原始数据和构建模型的数据之间发生转换和特征选择(和创建)的过程。

如果您的CSV文件不需要任何这些初步阶段 - 对您有好处! 您始终可以创建可以跟踪构建模型的某些列或列索引的配置文件。

如果你的DataFrame来自“选择”,我想你可以做些什么来提高易读性和可维护性是使用列名而不是索引号。

df.select($"my_col_1", $"my_col_2", .. )

然后通过

进行操作
row.getAs[String]("my_col_1")