feat: add class_names support to Precision and Recall metrics - #3732
feat: add class_names support to Precision and Recall metrics#3732aniketpandey05 wants to merge 14 commits into
Conversation
|
ok so like wont this code break There can be more metrics that can benefit from this change. I am not sure though. |
|
@aaishwarymishra would raising errors for those condition a better option or should we add full class_name support to fbeta |
|
I am not sure, adding support for the class names in |
|
Could we please clarify |
If we can compute F1 score per class than we should propagate the dict structure until the output of the F1 otherwise, take |
|
Hey @vfdev-5 , would adding a helper in metric.py to handle dict arithmetic in all operator overloads so the dict propagates through to the Fbeta output be a good approach? Also when average=True and class_names is set, should Fbeta return a scalar float or propagate the dict as is? |
I do not know, what would you suggest? Let's try to make it the most simple possible and intuitively clear. |
|
hey @vfdev-5 I think Fbeta should return a per-class dict if class_names is set, regardless of average. |
|
@rogueslasher ok, let's implement that this way and see if this works as expected |
|
Hey @vfdev-5, would adding a _dict_aware_op helper in metric.py and updating all operator overloads to use it for element-wise dict arithmetic, and skipping average in fbeta.py when class_names is set be a good idea? It touches all operator overloads in metric.py which affects all metrics. i am worried since it touches all operators overloads |
|
@aaishwarymishra ,would love your help in this can you look into it more please |
|
@rogueslasher well , I am not sure to be honest i wont touch the metric operators as it kind of affect every metric, for a case which can be only relevant for very few metrics, I think we should modify |
61e7680 to
7ea2eb5
Compare
|
@aaishwarymishra the header rules and other three preview checks are taking insane amount of time . is there any issue |
|
Documentation issue :) |
| <<<<<<< HEAD | ||
| or ``average=None``. If provided, ``compute()`` returns a ``dict`` mapping each class | ||
| ======= | ||
| or ``average=None``. If provided, :meth:`compute` returns a ``dict`` mapping each class | ||
| >>>>>>> 7ea2eb50590597780ffae1ab3dc4c7ede3c80be7 |
There was a problem hiding this comment.
I think its from the conflict you forgot to resolve
There was a problem hiding this comment.
I think you should try to pre-commit we recently moved from the black formatter to ruff, that may be the reason for docstring problem but not sure.
There was a problem hiding this comment.
There should be tests for recall too
9c71695 to
817f33b
Compare
| target_class_names = ( | ||
| class_names or getattr(precision, "_class_names", None) or getattr(recall, "_class_names", None) | ||
| ) | ||
|
|
There was a problem hiding this comment.
we never checked if fbeta got class names and precision and recall also returns class names , does fbeta class names matches the ones returned by precision and recall?
| elif target_class_names is not None: | ||
| precision._class_names = target_class_names |
There was a problem hiding this comment.
I don't like this, we should be explicit, if precision and recall is given and fbeta uses class names the provided metrics should also have it , we should not silently modify the metric.
There was a problem hiding this comment.
Also there is no early check for if average is True and also the class name has been given
| elif target_class_names is not None: | ||
| precision._class_names = target_class_names |
There was a problem hiding this comment.
I dont like this we should not silently modify metrics, user should provide metrics with class names if class names are set on fbeta
3a93092 to
7e12121
Compare
|
Hi @aaishwarymishra, thanks for the review! I've updated the implementation: |
|
Also try to reslove previous comments it gets hard to read the code :) |
aebabb1 to
7b8ce31
Compare
Fixes #1466
Description:
Adds an optional
class_namesparameter to_BasePrecisionRecall, allowingcompute()to return a labeleddictinstead of an unnamed tensor whenaverage=Falseoraverage=None. Useful for per-class metric tracking where knowing which score belongs to which class matters for logging and visualization.Check list: