|
10 | 10 | MajorityLearner |
11 | 11 | from Orange.evaluation import AUC, CA, Results, Recall, \ |
12 | 12 | Precision, TestOnTrainingData, scoring, LogLoss, F1, CrossValidation |
| 13 | +from Orange.evaluation.scoring import Specificity |
13 | 14 | from Orange.preprocess import discretize, Discretize |
14 | 15 | from Orange.tests import test_filename |
15 | 16 |
|
@@ -367,6 +368,62 @@ def test_log_loss_calc(self): |
367 | 368 | self.assertAlmostEqual(ll_calc, ll_orange[0]) |
368 | 369 |
|
369 | 370 |
|
| 371 | +class TestSpecificity(unittest.TestCase): |
| 372 | + @classmethod |
| 373 | + def setUpClass(cls): |
| 374 | + cls.iris = Table('iris') |
| 375 | + cls.score = Specificity() |
| 376 | + |
| 377 | + def test_specificity_iris(self): |
| 378 | + learner = LogisticRegressionLearner(preprocessors=[]) |
| 379 | + res = TestOnTrainingData()(self.iris, [learner]) |
| 380 | + self.assertAlmostEqual(self.score(res, average='weighted')[0], |
| 381 | + (1 + 0.99 + 0.95) / 3, 5) |
| 382 | + self.assertAlmostEqual(self.score(res, target=1)[0], 99 / (99 + 1), 5) |
| 383 | + self.assertAlmostEqual(self.score(res, target=1, average=None)[0], |
| 384 | + 99 / (99 + 1), 5) |
| 385 | + self.assertAlmostEqual(self.score(res, target=1, average='weighted')[0], |
| 386 | + 99 / (99 + 1), 5) |
| 387 | + self.assertAlmostEqual(self.score(res, target=0, average=None)[0], 1, 5) |
| 388 | + self.assertAlmostEqual(self.score(res, target=2, average=None)[0], |
| 389 | + 95 / (95 + 5), 5) |
| 390 | + |
| 391 | + def test_precision_multiclass(self): |
| 392 | + results = Results( |
| 393 | + domain=Domain([], DiscreteVariable(name="y", values="01234")), |
| 394 | + actual=[0, 4, 4, 1, 2, 0, 1, 2, 3, 2]) |
| 395 | + results.predicted = np.array([[0, 4, 4, 1, 2, 0, 1, 2, 3, 2], |
| 396 | + [0, 1, 4, 1, 1, 0, 0, 2, 3, 1]]) |
| 397 | + res = self.score(results, average='weighted') |
| 398 | + self.assertEqual(res[0], 1.) |
| 399 | + self.assertAlmostEqual(res[1], 0.9, 5) |
| 400 | + |
| 401 | + for target, prob in ((0, 7 / 8), |
| 402 | + (1, 5 / 8), |
| 403 | + (2, 1), |
| 404 | + (3, 1), |
| 405 | + (4, 1)): |
| 406 | + res = self.score(results, target=target, average=None) |
| 407 | + self.assertEqual(res[0], 1.) |
| 408 | + self.assertEqual(res[1], prob) |
| 409 | + |
| 410 | + def test_precision_binary(self): |
| 411 | + results = Results( |
| 412 | + domain=Domain([], DiscreteVariable(name="y", values="01")), |
| 413 | + actual=[0, 1, 1, 1, 0, 0, 1, 0, 0, 1]) |
| 414 | + results.predicted = np.array([[0, 1, 1, 1, 0, 0, 1, 0, 0, 1], |
| 415 | + [0, 1, 1, 1, 0, 0, 1, 1, 1, 0]]) |
| 416 | + res = self.score(results) |
| 417 | + self.assertEqual(res[0], 1.) |
| 418 | + self.assertAlmostEqual(res[1], 3 / 5) |
| 419 | + res_target = self.score(results, target=1) |
| 420 | + self.assertEqual(res[0], res_target[0]) |
| 421 | + self.assertEqual(res[1], res_target[1]) |
| 422 | + res_target = self.score(results, target=0) |
| 423 | + self.assertEqual(res_target[0], 1.) |
| 424 | + self.assertAlmostEqual(res_target[1], 4 / 5) |
| 425 | + |
| 426 | + |
370 | 427 | if __name__ == '__main__': |
371 | 428 | unittest.main() |
372 | 429 | del TestScoreMetaType |
0 commit comments