我正在做一个
multi-class
我已经使用sklearn实现了我的模型的文本分类问题
LinearSVC
python中的库
loss = 'hinge'
和其他参数作为默认值,目前正在给出令人满意的结果。
传递数据之前执行的步骤:
-
特殊字符删除。
-
停止字删除。
-
堵塞。
代码部分:
vectorizerPipe = Pipeline([('tfidf', TfidfVectorizer(lowercase=True,
stop_words='english')),
('classification', OneVsRestClassifier(LinearSVC(penalty='l2', loss='hinge'))),])
现在,我想在scala中使用MLlib在Spark中实现同样的功能。我已经完成了培训和测试部分。但是,结果却大相径庭。
val classifier = new LinearSVC()
.setMaxIter(1000)
.setRegParam(0.01)
.setThreshold(0.5)
.setTol(1E-4)
val ovr = new OneVsRest().setClassifier(classifier)
val pipeline = new Pipeline()
.setStages(Array(tokenizer, stopword_removal, stemming, hashingTF, idf, indexer, ovr))
相比之下,python给出了更正确的结果。
我使用下面的文章来理解这两个库之间的基本区别,并应用了相同的方法。但结果没有太大差别。
should-mllib-linearsvc-behave-the-same-way-as-scik
注意:我使用的是spark 2.2.0和
Linear SVC
在下面
OneVsRest Classifier
数据结构:
----------------------------------------------------------------------------------------
| product_title | Key_value_pairs | taxonomy_id (Output) |
----------------------------------------------------------------------------------------
Samsung S7 Edge | Color:black,Display Size:5.5 inch,Internal | 211
Storage:128 GB, RAM:4 GB,Primary Camera:12 MP
Case cover Honor 8 | Color:transparent,Height:15 mm,width:22 mm | 212
Ruggers Men's T-Shirt | Size:L,ideal for:men,fit:regular, | 111
sleeve:half sleeve
Optimum Nutrition Gold | Flavor:chocolate,form:powder,size:34 gm | 311
Standard Whey Protein
我想了解这两个库之间的基本区别,以及需要在MlLib的LinearSVC中更改哪些参数才能获得类似的结果。
非常感谢您的帮助。谢谢