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 并执行逻辑回归的主要内容,如果未能解决你的问题,请参考以下文章
如何更改 Pandas Dataframe 的形状(带有“L”的行号)?
如何从 PySpark Dataframe 中删除重复项并将剩余列值更改为 null
如何将 DDMMMYYYY HH:mm:ss:ssssss 格式的时间戳更改为 spark sql 中的 yyyy-MM-dd 格式 [重复]