最好的现成2类分类器是什么?是的,我想这是一百万美元的问题,是的,我知道没有免费的午餐定理,而且我还阅读了前面的问题:
不过,我仍然有兴趣阅读有关该主题的更多信息。
什么是良好的信息来源,包括对不同分类器的特征,优势和特征的一般比较?
最好的现成2类分类器是什么?是的,我想这是一百万美元的问题,是的,我知道没有免费的午餐定理,而且我还阅读了前面的问题:
不过,我仍然有兴趣阅读有关该主题的更多信息。
什么是良好的信息来源,包括对不同分类器的特征,优势和特征的一般比较?
Answers:
彼得·弗洛姆(Peter Flom)已经提到过,ESL是一个很好的建议(请注意,我的链接是作者的主页,在该页上可以免费获取pdf文件)。让我在书中添加一些更具体的内容:
将这本书添加到R 的机器学习任务视图中,尽管没有真正的比较,但它给人的印象是许多机器学习包实际上可以做什么。对于Python用户,我认为scikit.learn是一个不错的地方。一个方法有多少“开箱即用”或“现成的”,很大程度上取决于实现对数据情况的自动适应而不是将详细的调整留给用户的实现程度。在我看来,R的mgcv是一个很好的例子,它使真正合理的通用加性模型的拟合变得非常容易,并且基本上不需要用户“手动调整”任何东西。
其他人列出的资源当然都是有用的,但是我会加入其中并添加以下内容:“最佳”分类器可能是特定于上下文和数据的。在最近一次评估不同的二元分类器的尝试中,我发现Boosted回归树比我可以使用的其他方法始终表现更好。对我来说,关键是学习如何使用Orange数据挖掘工具。他们有一些很好的文档得到开拓这些方法启动您的数据。例如,这是我写的一个简短的Python脚本,用于使用k倍交叉验证来评估多个准确性度量中多个分类器的质量。
import orange, orngTest, orngStat, orngTree , orngEnsemble, orngSVM, orngLR
import numpy as np
data = orange.ExampleTable("performance_orange_2.tab")
bayes = orange.BayesLearner(name="Naive Bayes")
svm = orngSVM.SVMLearner(name="SVM")
tree = orngTree.TreeLearner(mForPruning=2, name="Regression Tree")
bs = orngEnsemble.BoostedLearner(tree, name="Boosted Tree")
bg = orngEnsemble.BaggedLearner(tree, name="Bagged Tree")
forest = orngEnsemble.RandomForestLearner(trees=100, name="Random Forest")
learners = [bayes, svm, tree, bs, bg, forest]
results = orngTest.crossValidation(learners, data, folds=10)
cm = orngStat.computeConfusionMatrices(results,
classIndex=data.domain.classVar.values.index('1'))
stat = (('ClsAcc', 'CA(results)'),
('Sens', 'sens(cm)'),
('Spec', 'spec(cm)'),
('AUC', 'AUC(results)'),
('Info', 'IS(results)'),
('Brier', 'BrierScore(results)'))
scores = [eval("orngStat." + s[1]) for s in stat]
print "Learner " + "".join(["%-9s" % s[0] for s in stat])
print "-----------------------------------------------------------------"
for (i, L) in enumerate(learners):
print "%-15s " % L.name + "".join(["%5.3f " % s[i] for s in scores])
print "\n\n"
measure = orngEnsemble.MeasureAttribute_randomForests(trees=100)
print "Random Forest Variable Importance"
print "---------------------------------"
imps = measure.importances(data)
for i,imp in enumerate(imps):
print "%-20s %6.2f" % (data.domain.attributes[i].name, imp)
print '\n\n'
print 'Predictions on new data...'
bs_classifier = bs(data)
new_data = orange.ExampleTable('performance_orange_new.tab')
for obs in new_data:
print bs_classifier(obs, orange.GetBoth)
当我对数据运行此代码时,我得到如下输出
In [1]: %run binary_predict.py
Learner ClsAcc Sens Spec AUC Info Brier
-----------------------------------------------------------------
Naive Bayes 0.556 0.444 0.643 0.756 0.516 0.613
SVM 0.611 0.667 0.714 0.851 0.264 0.582
Regression Tree 0.736 0.778 0.786 0.836 0.945 0.527
Boosted Tree 0.778 0.778 0.857 0.911 1.074 0.444
Bagged Tree 0.653 0.667 0.786 0.816 0.564 0.547
Random Forest 0.736 0.667 0.929 0.940 0.455 0.512
Random Forest Variable Importance
---------------------------------
Mileage 2.34
Trade_Area_QI 2.82
Site_Score 8.76
您可以使用Orange对象做更多事情来反思性能并进行比较。我发现此程序包在编写少量代码以使用一致的API和问题抽象将方法实际应用到我的数据时非常有帮助(即,我不需要使用来自六个不同作者的六个不同程序包,每个程序包都有自己的API设计和文档编制方法等)。
我找到的与此有关的其他资源(提供免费的PDF):
根据这项详尽的最新研究(在121个数据集上评估179个分类器),最好的分类器是随机森林,其次是支持向量机。