Spark ML 错误:编号不正确。使用线性 SVC 时检测到的类

Posted

技术标签:

【中文标题】Spark ML 错误:编号不正确。使用线性 SVC 时检测到的类【英文标题】:Spark ML Error: Incorrect no. of classes detected while using Linear SVC 【发布时间】:2019-02-09 17:27:19 【问题描述】:

我正在研究一个二元分类问题并使用 SparkML,我使用随机森林和逻辑回归模型训练和评估了我的数据,现在我想检查 SVM 对我的数据的分类效果如何。

我的训练数据片段:-

+----------+------+
|  spam    | count|
+----------+------+
|        No|197378|
|       Yes|  7652|
+----------+------+

Note:- My dependent variable: 'spam': string (nullable = true)

+-----+------+
|label| count|
+-----+------+
|  0.0|197488|
|  1.0|  7650|
+-----+------+

Note:- label: double (nullable = false)

更新我的问题:-

trainingData.select('label').distinct().show()
+-----+
|label|
+-----+
|  0.0|
|  1.0|
+-----+

所以,我使用下面的代码来使用 Linear SVC 来拟合我的训练数据:-

 pyspark.ml.classification import LinearSVC
 lsvc = LinearSVC()
 # Fit the model
 lsvcModel = lsvc.fit(trainingData)

在我的数据框中,标签和因变量只有 2 个类,但我收到一条错误消息,提示检测到更多类。不太确定是什么导致了这个异常。 非常感谢任何帮助!

错误:-

IllegalArgumentException: u'requirement failed: LinearSVC only supports 
binary classification. 3 classes detected in 
LinearSVC_4240bb949b9fad486ec0__labelCol'

【问题讨论】:

您能运行trainingData.select('label').distinct().show() 并发布结果吗? 好的,你的 Spark 版本是多少? sc.version 2.3.0.2.6.5.0-292 【参考方案1】:

我也有同样的问题。

scala> TEST_DF_37849c70_7cd3_4fd6_a9a0_df4de727df25.select("si_37849c70_7cd3_4fd6_a9a0_df4de727df25_logicProp1_lable_left").distinct.show
+-------------------------------------------------------------+
|si_37849c70_7cd3_4fd6_a9a0_df4de727df25_logicProp1_lable_left|
+-------------------------------------------------------------+
|                                                          0.0|
|                                                          1.0|
+-------------------------------------------------------------+

错误:要求失败:LinearSVC 仅支持二进制分类。在 linearsvc_d18a38204551__labelCol 中检测到 3 个类

但在我的情况下,使用带有 setHandleInvalid("skip") 选项的 StringIndexer,它可以工作。 在 StringIndexer “keep”选项的情况下,LeanerSVM 可能存在一些错误。

【讨论】:

【参考方案2】:

您可以尝试使用OnehotEncoder 将标签值转换为分类数据,并将handleInvalid 参数设置为“keep”

【讨论】:

labelIndexer = StringIndexer(inputCol="spam", outputCol="label").setHandleInvalid("keep")。我认为这里与转换无关,因为在将数据拆分为训练和测试之前已经完成了转换!

以上是关于Spark ML 错误:编号不正确。使用线性 SVC 时检测到的类的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Spark ML 中为分类创建正确的数据框

均方根误差与精度线性回归

PySpark ML:LinearSVC 的 OnevsRest 策略

我通过使用它的 pyspark.ml.regression.LinearRegression 在 spark 中创建一个模型

Spark DecisionTreeClassifier

使用 Pyspark 从结构化流数据帧构建 Spark ML 管道模型