Machine learning 在PySpark中是否可以将LinearSVC模型与OneVsRest一起使用?

Machine learning 在PySpark中是否可以将LinearSVC模型与OneVsRest一起使用?,machine-learning,pyspark,Machine Learning,Pyspark,我试图在PySpark的OneVsRest中使用LinearSVC模型,但它似乎还不受支持 我的错误消息 LinearSVC only supports binary classification. 1 classes detected in LinearSVC_43a50b0b70d60a8cbdb1__labelCol 我需要什么样的更改才能在PySpark中实现它 有人知道Pyspark中的OneVsRest何时会支持LinearSVC吗?错误消息告诉您,您的数据集当前只包含一个类,但L

我试图在PySpark的OneVsRest中使用LinearSVC模型,但它似乎还不受支持

我的错误消息

LinearSVC only supports binary classification. 1 classes detected in LinearSVC_43a50b0b70d60a8cbdb1__labelCol
我需要什么样的更改才能在PySpark中实现它


有人知道Pyspark中的OneVsRest何时会支持LinearSVC吗?

错误消息告诉您,您的数据集当前只包含一个类,但LinearSVM是一种二进制分类算法,它只需要两个类。 我不确定你的代码是否会引起任何问题,因为你还没有发布任何东西。万一你或其他人需要它,看看下面

正如alrady所说,LinearSVM是一种二元分类算法,它从定义上永远不支持多类分类,但您始终可以将多类分类问题简化为二元分类问题。这是一种降低成本的方法。它为每个类训练一个分类器,从工程的角度来看,将其分离为专用类(如spark)是有意义的。OneVsRest为每个类训练一个分类器,并根据该分类器列表对给定样本进行评分。最高分的分类器确定样本的预测标签

请查看以下代码,了解OneVsRest与LinearSVC的用法:

来自pyspark.ml.feature导入向量汇编程序
从pyspark.ml.feature导入StringIndexer
从pyspark.ml.classification导入OneVsRest,LinearSVC
从pyspark.ml.evaluation导入MultiClassificationEvaluator
df=spark.read.csv('/tmp/iris.data',schema='separalength-DOUBLE,separalwidth-DOUBLE,petalalength-DOUBLE,petalWidth-DOUBLE,class-STRING')
vecAssembler=VectorAssembler(inputCols=[“separalength”、“separalWidth”、“petalLength”、“petalWidth]”,outputCol=“features”)
df=向量汇编程序。转换(df)
stringIndexer=stringIndexer(inputCol=“class”,outputCol=“label”)
si_模型=stringIndexer.fit(df)
df=si_模型转换(df)
svm=LinearSVC()
ovr=OneVsRest(分类器=svm)
ovr模型=ovr.配合(df)
evaluator=MultiClassificationEvaluator(metricName=“准确度”)
预测=ovrModel.transform(df)
打印(“精度:{}”。格式(evaluator.evaluate(预测)))
输出:

Accuracy: 0.9533333333333334

这是PySpark中的一个有趣的bug。如果有多个类,则必须从零开始标识它们

我刚刚经历了这个错误。我有一个数据框架,它的构建方式与他们在

最初,它是一个普通的RDD,然后我转换了
行中的每个RDD记录。我有一个三类问题,其中类被命名为
1
2
3
。我实例化了一个
OneVsRest
对象(就像@cronoik建议的那样),遇到了与您相同的错误

因此,我将
df
数据帧与他们的用户指南(见上文)中的初始化完全一样,并决定通过添加和删除类来开始使用它。因此,我简单地用
label=2.0
替换了第二个模式
label=0.0
,出现了错误。即使有他们的数据帧,即使只有两个类

因此,我将类的命名从
1
2
3
更改为
0
1
2
,错误消失了


希望这有帮助

您的数据集当前只有一个类。这是有意的吗?
df = sc.parallelize([
    Row(label=1.0, features=Vectors.dense(1.0, 1.0, 1.0)),
    Row(label=0.0, features=Vectors.dense(1.0, 2.0, 3.0))]).toDF()