2017-12-14 22 views
0

SVM을 사용하여 질문을 분류하려고합니다.Ques 분류 지원 벡터 기계 사용

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

그러나 그들은 SCIKIT-배우고 팬더 적응을 사용했다 - 나는 참조 할 수 있도록이 링크를 따라하고있다. 나는 Spark Mllib을 사용하여 같은 일을하고 싶다. 가 나는 Dataframe 만들려면이 코드를 사용하고 -

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") 

을 내가 점점 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]| 

내 샘플 CSV 파일을 인쇄하여 그 결과를 다음입니다 것은 -

#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 다음 점점 오류를 사용하여 dataframe를 훈련 할 때 .. .i 내가 만든 데이터 프레임이 올바르지 않다고 생각합니다. SVM을 사용하여 훈련 할 수있는 적합한 데이터 프레임을 만드는 방법을 알고 있습니다. 그리고 내가 잘못한 일을하고 있는지 알려주세요.

답변

0
당신은 불꽃의 기계 학습 방법 중 하나를 시도하고

위대한, 그러나 당신의 방식으로 여러 문제가있다, 귀하의 데이터가에 따라서 SVM 이진 분류 모델이 아닌, 여러 클래스가

1) Spark은이 데이터 세트에서 작동하지 않습니다 (소스 코드 here을 볼 수 있습니다). 하나의 클래스와 다른 모든 클래스의 접근 방식을 시도해 볼 수 있으며 데이터에 클래스가있는 모델을 교육 할 수 있습니다. 그러나 Spil의 MultilayerPerceptronClassifier 나 다중 클래스 로지스틱 모델과 같은 것을 사용하는 것이 좋습니다.

2) 둘째, Mllib는 사용하는 클래스 레이블의 측면에서 매우 용인하지 않으며 0,1,2 또는 0.0,1.0,2.0 등만 지정할 수 있습니다. 즉, 자동으로 클래스 수를 유추하지 않습니다. 출력 열. 1.0 & 2.0 두 클래스를 지정하더라도 작동하지 않습니다 0.0 & 1.0이어야합니다.

3) 스파크 데이터 프레임 대신 레이블이있는 점 RDD를 사용해야합니다. spark.mllib는 RDD와 함께 사용되지만 spark.ml은 데이터 프레임과 함께 사용해야합니다. Labeledpoint rdd를 작성하는 방법에 대한 도움을 받으려면 여러 사례가있는 here 스파크 문서를 참조하십시오.

4) 기능 엔지니어링 노트에서 word2vec 모델에 vectorSize를 2로 사용하고 싶지는 않습니다 (10 점이 출발점으로 더 적합 할 것입니다). 합리적인 예측을 제공합니다.