【问题标题】:Ques Classification Using Support Vector Machines使用支持向量机进行查询分类
【发布时间】:2018-05-28 05:30:07
【问题描述】:

我正在尝试使用 SVM 对问题进行分类。我正在关注此链接以供参考 -

https://shirishkadam.com/2017/07/03/nlp-question-classification-using-support-vector-machines-spacyscikit-learnpandas/

但他们使用了 SPACY、SCIKIT-LEARN 和 PANDAS。我想使用 Spark Mllib 做同样的事情。 我正在使用此代码创建一个数据框 -

sc = SparkContext(conf=sconf)  # SparkContext
sqlContext = SQLContext(sc)
data = sc.textFile("<path_to_csv_file>")
header = data.first()
trainingDF = sqlContext.createDataFrame(data
    .filter(lambda line: line != header)
    .map(lambda line: line.split("|"))
    .map(lambda line: ([line[0]], [line[2]], [line[6]]))).toDF("Question", "WH-Bigram", "Class")

我通过打印数据框得到以下结果-trainingDF.show(3)

+--------------------+-------------------+------+
|            Question|          WH-Bigram| Class|
+--------------------+-------------------+------+
|[How did serfdom ...|          [How did]|[DESC]|
|[What films featu...|       [What films]|[ENTY]|
|[How can I find a...|          [How can]|[DESC]|

我的示例 csv 文件是 -

#Question|WH|WH-Bigram|Class
How did serfdom develop in and then leave Russia ?|How|How did|DESC

我正在使用 word2vec 为 SVM 创建训练数据并尝试使用 SVM 进行训练。

word2Vec1 = Word2Vec(vectorSize=2, minCount=0, inputCol="Question", outputCol="result1")
training = word2Vec1.fit(trainingDF).transform(trainingDF)
model = SVMWithSGD.train(training, iterations=100)

使用 word2vec 后,我的数据转换为这种格式 -

[Row(Question=[u'How did serfdom develop in and then leave Russia ?'], WH-Bigram=[u'How did'], Class=[u'DESC'], result1=DenseVector([0.0237, -0.186])), Row(Question=[u'What films featured the character Popeye Doyle ?'], WH-Bigram=[u'What films'], Class=[u'ENTY'], result1=DenseVector([-0.2429, 0.0935]))]

但是当我尝试使用 SVM 训练数据帧时,出现TypeError: data should be an RDD of LabeledPoint, but got &lt;class 'pyspark.sql.types.Row'&gt; 的错误

我被困在这里...我认为我创建的数据框不正确。 是否有人知道如何创建合适的数据框来使用 SVM 对其进行训练。如果我做错了什么,请告诉我。

【问题讨论】:

    标签: pyspark svm apache-spark-mllib


    【解决方案1】:

    很高兴您在 Spark 中尝试其中一种机器学习方法,但您的方法存在多个问题,

    1) 您的数据有多个类别,它不是二元分类模型,因此 Spark 中的 SVM 无法在此数据集上工作(您可以查看源代码 here)。您可以尝试一个类与所有其他方法,并训练与数据中的类一样多的模型。但是,您最好在 Spark 中使用 MultilayerPerceptronClassifier 或多类逻辑模型。

    2) 其次,Mllib 在您使用的类别标签方面非常不宽容,您只能指定 0,1,2 或 0.0,1.0,2.0 等,即它不会根据您的类别自动推断类别的数量输出列。即使您将两个类指定为 1.0 和 2.0,它也不起作用,它必须是 0.0 和 1.0。

    3) 您需要使用标记点 RDD 而不是 spark 数据帧,请记住 spark.mllib 用于 RDD,而 spark.ml 用于数据帧。关于如何创建 Labeledpoint rdd 的帮助,您可以参考 spark 文档 here,其中有多个示例。

    4) 在特征工程说明中,我认为您不会希望将 vectorSize 设为 2 用于您的 word2vec 模型(例如 10 更适合作为起点),这些实在是太少了一个合理的预测。

    【讨论】:

      猜你喜欢
      • 2010-12-29
      • 2011-07-01
      • 2013-08-31
      • 2018-06-15
      • 2015-02-16
      • 2018-10-12
      • 1970-01-01
      • 1970-01-01
      • 2020-07-12
      相关资源
      最近更新 更多