什么是开箱即用的最佳 2 类分类器?是的,我想这是百万美元的问题,是的,我知道没有免费的午餐定理,而且我还阅读了之前的问题:
不过,我有兴趣阅读更多关于这个主题的内容。
什么是一个好的信息来源,包括对不同分类器的特征、优势和特征的一般比较?
什么是开箱即用的最佳 2 类分类器?是的,我想这是百万美元的问题,是的,我知道没有免费的午餐定理,而且我还阅读了之前的问题:
不过,我有兴趣阅读更多关于这个主题的内容。
什么是一个好的信息来源,包括对不同分类器的特征、优势和特征的一般比较?
正如 Peter Flom 已经提到的, ESL是一个很好的建议(请注意,我的链接是作者的主页,可以免费获得这本书的 pdf 文件)。让我在书中添加一些更具体的内容:
将 R 的机器学习任务视图添加到本书中,它给出了许多机器学习包实际上可以做什么的一些印象,尽管没有真正的比较。对于 Python 用户,我认为scikit.learn是一个不错的选择。一种方法有多少“开箱即用”或“现成”,很大程度上取决于实现处理自动适应数据情况的能力,而不是把详细的调整留给用户。在我看来,R 的 mgcv 是一个很好的例子,它使相当好的广义加法模型的拟合变得非常容易,并且基本上不需要用户“手动调整”任何东西。
其他人列出的资源当然都是有用的,但我会插话并添加以下内容:“最佳”分类器可能是特定于上下文和数据的。在最近一次评估不同二元分类器的尝试中,我发现 Boosted Regression Tree 始终比我可以使用的其他方法更好地工作。对我来说,关键是学习如何使用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 设计和文档的方法等)。
The Elements of Statistical Learning一书有很多关于这方面的信息。
我发现的其他资源(提供免费 PDF):