def test_multiclass_classifier(self, clf): # Force non-dataspecific C value. # Otherwise multiclass libsvm builtin and our MultiClass would differ # in results svm = clf.clone() # operate on clone to avoid side-effects if 'C' in svm.params and svm.params.C<0: svm.params.C = 1.0 # reset C to be 1 svm2 = svm.clone() svm2.ca.enable(['training_stats']) mclf = MulticlassClassifier(clf=svm, enable_ca=['training_stats']) # with explicit MaximalVote with the conditional attributes # enabled mclf_mv = MulticlassClassifier(clf=svm, combiner=MaximalVote(enable_ca=['estimates', 'predictions']), enable_ca=['training_stats']) ds_train = datasets['uni2small'] for clf_ in svm2, mclf, mclf_mv: clf_.train(ds_train) s1 = str(mclf.ca.training_stats) s2 = str(svm2.ca.training_stats) s3 = str(mclf_mv.ca.training_stats) self.assertEqual(s1, s2, msg="Multiclass clf should provide same results as built-in " "libsvm's %s. Got %s and %s" % (svm2, s1, s2)) self.assertEqual(s1, s3, msg="%s should have used maxvote resolver by default" "so results should have been identical. Got %s and %s" % (mclf, s1, s3)) assert_equal(len(mclf_mv.combiner.ca.estimates), len(mclf_mv.combiner.ca.predictions)) # They should have came from assessing training_stats ca being # enabled # recompute accuracy on predictions for training_stats training_acc = np.sum(mclf_mv.combiner.ca.predictions == ds_train.targets) / float(len(ds_train)) # should match assert_equal(mclf_mv.ca.training_stats.stats['ACC'], training_acc) svm2.untrain() self.assertTrue(svm2.trained == False, msg="Un-Trained SVM should be untrained") self.assertTrue(np.array([x.trained for x in mclf.clfs]).all(), msg="Trained Boosted classifier should have all primary classifiers trained") self.assertTrue(mclf.trained, msg="Trained Boosted classifier should be marked as trained") mclf.untrain() self.assertTrue(not mclf.trained, msg="UnTrained Boosted classifier should not be trained") self.assertTrue(not np.array([x.trained for x in mclf.clfs]).any(), msg="UnTrained Boosted classifier should have no primary classifiers trained")
def test_multiclass_classifier(self, clf): # Force non-dataspecific C value. # Otherwise multiclass libsvm builtin and our MultiClass would differ # in results svm = clf.clone() # operate on clone to avoid side-effects if svm.params.has_key('C') and svm.params.C<0: svm.params.C = 1.0 # reset C to be 1 svm2 = svm.clone() svm2.ca.enable(['training_stats']) mclf = MulticlassClassifier(clf=svm, enable_ca=['training_stats']) # with explicit MaximalVote with the conditional attributes # enabled mclf_mv = MulticlassClassifier(clf=svm, combiner=MaximalVote(enable_ca=['estimates', 'predictions']), enable_ca=['training_stats']) ds_train = datasets['uni2small'] for clf_ in svm2, mclf, mclf_mv: clf_.train(ds_train) s1 = str(mclf.ca.training_stats) s2 = str(svm2.ca.training_stats) s3 = str(mclf_mv.ca.training_stats) self.assertEqual(s1, s2, msg="Multiclass clf should provide same results as built-in " "libsvm's %s. Got %s and %s" % (svm2, s1, s2)) self.assertEqual(s1, s3, msg="%s should have used maxvote resolver by default" "so results should have been identical. Got %s and %s" % (mclf, s1, s3)) assert_equal(len(mclf_mv.combiner.ca.estimates), len(mclf_mv.combiner.ca.predictions)) # They should have came from assessing training_stats ca being # enabled # recompute accuracy on predictions for training_stats training_acc = np.sum(mclf_mv.combiner.ca.predictions == ds_train.targets) / float(len(ds_train)) # should match assert_equal(mclf_mv.ca.training_stats.stats['ACC'], training_acc) svm2.untrain() self.assertTrue(svm2.trained == False, msg="Un-Trained SVM should be untrained") self.assertTrue(np.array([x.trained for x in mclf.clfs]).all(), msg="Trained Boosted classifier should have all primary classifiers trained") self.assertTrue(mclf.trained, msg="Trained Boosted classifier should be marked as trained") mclf.untrain() self.assertTrue(not mclf.trained, msg="UnTrained Boosted classifier should not be trained") self.assertTrue(not np.array([x.trained for x in mclf.clfs]).any(), msg="UnTrained Boosted classifier should have no primary classifiers trained")