2017-12-14 17 views
0

SVMを使用して質問を分類しようとしています。サポートベクターマシンを使用したQues分類

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

しかし、彼らは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") 

をそして、私は私のサンプルcsvファイルdataframe- 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]| 

を印刷することにより、以下の結果を得ていますが -

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

私はword2vecを使ってSVMのトレーニングデータを作成し、SVMを使って訓練しようとしています。私のデータはこの形式で変換されword2vec使用した後

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

-

[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]))] 

しかし、私は、私がここで立ち往生していますTypeError: data should be an RDD of LabeledPoint, but got <class 'pyspark.sql.types.Row'>

というエラーになってSVMを使用してデータフレームを養成しようとします.. .i私が作成したデータフレームは正しくないと思います。 SVMでトレーニングするために適切なデータフレームを作成する方法を身体が知っていますか。そして、私が何か間違っているかどうか知らせてください。

答えて

0
あなたはスパークでの機械学習方法のいずれかを実行しようとしている

素晴らしいが、あなたのアプローチには複数の問題がありますが、あなたのデータは、それが中したがって、SVMバイナリ分類モデルではなく、複数のクラスを持っている

1) Sparkはこのデータセットでは機能しません(ソースコードhereをご覧ください)。 1つのクラスと他のすべてのアプローチを試してみて、データにクラスがあるように多くのモデルを訓練することができます。しかし、SpilのMultilayerPerceptronClassifierやマルチクラスロジスティックモデルのようなものを使う方が良いでしょう。

2)第2に、Mllibはあなたが使用するクラスラベルに関して非常に寛容ではなく、0,1,2または0.0,1.0,2.0などしか指定できません。つまり、自動的にクラスの数を推論するわけではありませんあなたの出力列。 1.0 & 2.0という2つのクラスを指定しても動作しませんが、0.0 & 1.0でなければなりません。

3)sparkデータフレームではなくラベル付きポイントRDDを使用する必要があります。spark.mllibはRDDで使用するのに対し、spark.mlはデータフレームで使用することを覚えておいてください。 Labeledpoint rddを作成する方法についてのヘルプは、複数の例がある火花のドキュメントhereを参照してください。

4)フィーチャエンジニアリングノートでは、word2vecモデルのvectorSizeを2としたいとは思わない(10などが出発点として適切だろう)。合理的な予測を与える。

関連する問題