Spark:如何将 DataFrame 更改为 LibSVM 并执行逻辑回归

Posted

技术标签:

【中文标题】Spark:如何将 DataFrame 更改为 LibSVM 并执行逻辑回归【英文标题】:Spark: How change DataFrame to LibSVM and perform logistic regression 【发布时间】:2016-02-06 07:51:06 【问题描述】:

我正在使用此代码将数据从 Hive 获取到 Spark:

val hc = new org.apache.spark.sql.hive.HiveContext(sc)
val MyTab = hc.sql("select * from svm_file")

我得到了 DataFrame:

scala> MyTab.show()
+--------------------+
|                line|
+--------------------+
|0 2072:1 8594:1 7...|
|0 8609:3 101617:1...|
|            0 7745:2|
|0 6696:2 9568:21 ...|
|0 200076:1 200065...|
|0 400026:20 6936:...|
|0 7793:2 9221:7 1...|
|0 4831:1 400026:1...|
|0 400011:1 400026...|
|0 200072:1 6936:1...|
|0 200065:29 4831:...|
|1 400026:20 3632:...|
|0 400026:19 6936:...|
|0 190004:1 9041:2...|
|0 190005:1 100120...|
|0 400026:21 6936:...|
|0 190004:1 3116:3...|
|0 1590:12 8594:56...|
|0 3632:2 9240:1 4...|
|1 400011:1 400026...|
+--------------------+
only showing top 20 rows

如何将此 DataFrame 转换为 libSVM 以执行逻辑回归,如下例所示:https://altiscale.zendesk.com/hc/en-us/articles/202627136-Spark-Shell-Examples?

【问题讨论】:

【参考方案1】:

我会说首先不要将其加载到DataFrame,而只需使用MLUtils.loadLibSVMFile,但如果由于某种原因这不是一个选项,您可以转换为RDD[String]并使用相同的映射逻辑被loadLibSVMFile使用

import org.apache.spark.sql.Row
import org.apache.spark.mllib.regression.LabeledPoint

MyTab
  .map case Row(line: String) => line 
  .map(_.trim)
  .filter(line => !(line.isEmpty || line.startsWith("#")))
  .map  line => ??? 

代替???,只需复制并粘贴a relevant part of the loadLibSVMFile method

【讨论】:

完美运行,但您能告诉我如何将其转换为 LabeledPoint 吗?我正在尝试使用此代码:MyTabSVM.map(x => LabeledPoint( x._1, Vectors.sparse( ?, x._2, x._3))),但我不确定我应该为? 参数输入什么。 MyTabSVM.map(_._2.max).max + 1 当我尝试运行模型时,出现以下错误:org.apache.spark.SparkException: Job aborted due to stage failure: Task 0 in stage 6.0 failed 4 times, most recent failure: Lost task 0.3 in stage 6.0 (TID 31, hdfs-58.hadoop.srv): java.lang.IllegalArgumentException: requirement failed: indices should be one-based and in ascending order。当我想打印数据时它会出现。有什么想法吗? 这表明你有一些格式错误的条目,但没有额外的我只能猜测。 如果您收到requirement failed: indices should be one-based and in ascending order 错误,那么(1)您的向量维度未按升序排序或(2)您的维度索引从0 开始而不是1 【参考方案2】:

sklearn.datasets.dump_svmlight_file 函数有一个名为zero_based 的参数。默认为True。这意味着索引将从 0 开始。Spark 希望它们从 1 开始。所以:设为False

【讨论】:

以上是关于Spark:如何将 DataFrame 更改为 LibSVM 并执行逻辑回归的主要内容,如果未能解决你的问题,请参考以下文章

如何使用Java在Spark中将数据库的列名更改为大写

将 Spark DataFrame 数据分成单独的文件

如何更改 Pandas Dataframe 的形状(带有“L”的行号)?

spark dataframe 将null 改为 nan

如何从 PySpark Dataframe 中删除重复项并将剩余列值更改为 null

如何将 DDMMMYYYY HH:mm:ss:ssssss 格式的时间戳更改为 spark sql 中的 yyyy-MM-dd 格式 [重复]