这里又想吐槽一下了。我们知道SKLearn中可以用GridSearch进行调参,例如下面的语句可以对Random Forest调参:
rf = RandomForestClassifier(random_state=10)
parameters = {'n_estimators':range(10,71,10), 'max_depth':range(3,14,2), 'min_samples_split':range(50,201,20), 'min_samples_split':range(80,150,20), 'min_samples_leaf':range(10,60,10),'max_features':range(3,11,2)}
gsearch = GridSearchCV(rf, parameters, scoring='roc_auc', cv=5)
是不是很简单方便(当然如果对所有超参都调参的话,运行效率可能会很慢。)
相比之下,Weka的调参就要麻烦很多(还有很多我没搞清的事情。),按照网友的介绍:https://www.cnblogs.com/lutaitou/p/5818027.html,调参主要有三种方法:CVParameterSelection、GridSearch、MultiSearch,但是仔细看看,只有CVParameterSelection是在Weka API中有的:
http://weka.sourceforge.net/doc.dev/index.html?weka/classifiers/meta/CVParameterSelection.html
而GridSearch在之前的Weka版本中有:
http://weka.sourceforge.net/doc.stable/index.html?weka/classifiers/meta/GridSearch.html
但是在新的版本中并不存在了,可以看到weka.classifiers.meta这个包并没有GridSearch这个类(仔细看前后两个链接的doc.stable和doc.dev之间的区别):
http://weka.sourceforge.net/doc.dev/index.html?weka/classifiers/meta/package-summary.html
不知道Weka开发人员的逻辑是什么??
还想吐槽的是,对于第三种方法MultiSearch,虽然很多人推荐使用(例如上面网友介绍的网页中。),但是都没说清楚怎么用。具体的方法是,可以在GitHub上其项目页面上下载:
https://github.com/fracpete/multisearch-weka-package
另外再吐槽一下,这么项目没有多少star啊,看来这年头用Weka的人真心不多了。更让人郁闷的是,这个页面里也没有一个详细的文档啊,只有这里给出了一些例子:
https://github.com/fracpete/multisearch-weka-package-examples
看了例子还是不明就里,例如下面这个链接中给出了J48自动调参的例子:
https://github.com/fracpete/multisearch-weka-package-examples/blob/master/src/main/java/com/github/fracpete/multisearch/optimize/J48ConfidenceFactor.java
但是我从头到尾没看到
conf.setBase(10);conf.setMin(0.05);conf.setMax(0.75);conf.setStep(0.05);conf.setExpression("I");MultiSearch multi = new MultiSearch();multi.setClassifier(j48);
这些的具体含义,只能靠自己瞎猜。试了几次还是有各种莫名其妙的问题。决定还是使用CVParameterSelection了,给一些最简单的代码段:
CVParameterSelection ps = new CVParameterSelection();
ps.setClassifier(new RandomForest());
ps.setNumFolds(5); // using 5-fold CV
ps.addCVParameter("I 20 200 10");
ps.addCVParameter("M 1 5 5");
ps.buildClassifier(trainingData);
把这些事情做完,简单来说说Weka存在的问题:
1.文档严重不全、滞后、stable版本的文档和实际上stable的版本不一致。
2.功能分割莫名其妙,为什么要把MultiSearch单独拿出来做一个package,这样会误导很多人的好不好。
3.Java代码还是要比Python啰嗦很多,也难怪最近用的人越来越少。
就简单吐槽这么多。