Les ressources énumérées par d'autres sont certainement toutes utiles, mais je vais ajouter et ajouter ce qui suit: le "meilleur" classificateur est susceptible d'être spécifique au contexte et aux données. Lors d'une récente incursion dans l'évaluation de différents classificateurs binaires, j'ai trouvé qu'un arbre de régression boosté fonctionnait toujours mieux que les autres méthodes auxquelles j'avais accès. L'essentiel pour moi a été d'apprendre à utiliser les outils d'exploration de données d' Orange . Ils ont une excellente documentation pour commencer à explorer ces méthodes avec vos données. Par exemple, voici un court script Python que j'ai écrit pour évaluer la qualité de plusieurs classificateurs à travers plusieurs mesures de précision à l'aide de la validation croisée k-fold.
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)
Lorsque j'exécute ce code sur mes données, j'obtiens une sortie comme
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
Vous pouvez faire beaucoup plus avec les objets Orange pour introspecter les performances et faire des comparaisons. J'ai trouvé que ce package était extrêmement utile pour écrire une petite quantité de code pour appliquer réellement des méthodes à mes données avec une API cohérente et une abstraction des problèmes (c'est-à-dire que je n'avais pas besoin d'utiliser six packages différents de six auteurs différents, chacun avec leur propre approche de la conception et de la documentation des API, etc.).