@@ -5458,8 +5458,10 @@ <h2 id="spotpython.utils.metrics.calculate_xai_consistency" class="doc doc-headi
54585458
54595459 < div class ="doc doc-contents ">
54605460
5461- < p > Calculates the consistency of XAI methods by computing the mean of the upper triangle
5462- of the correlation matrix of the provided attributions.</ p >
5461+ < p > Calculate the consistency between different XAI methods.
5462+ Computes the pairwise correlation between different XAI methods’ attributions
5463+ and returns their mean correlation as a measure of consistency. A higher value
5464+ indicates greater agreement between different XAI methods.</ p >
54635465
54645466
54655467< p > < span class ="doc-section-title "> Parameters:</ span > </ p >
@@ -5480,8 +5482,9 @@ <h2 id="spotpython.utils.metrics.calculate_xai_consistency" class="doc doc-headi
54805482 </ td >
54815483 < td >
54825484 < div class ="doc-md-description ">
5483- < p > Array of shape (n_methods, n_features) containing
5484- the attributions from different XAI methods.</ p >
5485+ < p > Array of shape (n_methods, n_features) containing
5486+ feature importance scores from different XAI methods. Each row represents
5487+ a different XAI method’s attributions, and each column represents a feature.</ p >
54855488 </ div >
54865489 </ td >
54875490 < td >
@@ -5503,19 +5506,49 @@ <h2 id="spotpython.utils.metrics.calculate_xai_consistency" class="doc doc-headi
55035506 < tbody >
55045507 < tr class ="doc-section-item ">
55055508< td > < code > float</ code > </ td > < td >
5509+ < code > float</ code >
55065510 </ td >
55075511 < td >
55085512 < div class ="doc-md-description ">
5509- < p > Mean value of the upper triangle of the correlation matrix.</ p >
5513+ < p > Mean correlation between XAI methods, ranging from -1 to 1.
5514+ - 1: Perfect consistency between methods
5515+ - 0: No consistency between methods
5516+ - -1: Perfect negative consistency between methods</ p >
55105517 </ div >
55115518 </ td >
55125519 </ tr >
55135520 </ tbody >
55145521 </ table >
55155522
5523+
5524+ < p > < span class ="doc-section-title "> Examples:</ span > </ p >
5525+ < div class ="highlight "> < pre > < span > </ span > < code > < span class ="gp "> >>> </ span > < span class ="kn "> import</ span > < span class ="nn "> numpy</ span > < span class ="k "> as</ span > < span class ="nn "> np</ span >
5526+ < span class ="gp "> >>> </ span > < span class ="c1 "> # Three XAI methods' attributions for four features</ span >
5527+ < span class ="gp "> >>> </ span > < span class ="n "> attributions</ span > < span class ="o "> =</ span > < span class ="n "> np</ span > < span class ="o "> .</ span > < span class ="n "> array</ span > < span class ="p "> ([</ span >
5528+ < span class ="gp "> ... </ span > < span class ="p "> [</ span > < span class ="mf "> 0.1</ span > < span class ="p "> ,</ span > < span class ="mf "> 0.2</ span > < span class ="p "> ,</ span > < span class ="mf "> 0.3</ span > < span class ="p "> ,</ span > < span class ="mf "> 0.4</ span > < span class ="p "> ],</ span > < span class ="c1 "> # Method 1</ span >
5529+ < span class ="gp "> ... </ span > < span class ="p "> [</ span > < span class ="mf "> 0.2</ span > < span class ="p "> ,</ span > < span class ="mf "> 0.3</ span > < span class ="p "> ,</ span > < span class ="mf "> 0.4</ span > < span class ="p "> ,</ span > < span class ="mf "> 0.5</ span > < span class ="p "> ],</ span > < span class ="c1 "> # Method 2</ span >
5530+ < span class ="gp "> ... </ span > < span class ="p "> [</ span > < span class ="mf "> 0.0</ span > < span class ="p "> ,</ span > < span class ="mf "> 0.1</ span > < span class ="p "> ,</ span > < span class ="mf "> 0.2</ span > < span class ="p "> ,</ span > < span class ="mf "> 0.3</ span > < span class ="p "> ]</ span > < span class ="c1 "> # Method 3</ span >
5531+ < span class ="gp "> ... </ span > < span class ="p "> ])</ span >
5532+ < span class ="gp "> >>> </ span > < span class ="n "> consistency</ span > < span class ="o "> =</ span > < span class ="n "> calculate_xai_consistency</ span > < span class ="p "> (</ span > < span class ="n "> attributions</ span > < span class ="p "> )</ span >
5533+ < span class ="gp "> >>> </ span > < span class ="nb "> print</ span > < span class ="p "> (</ span > < span class ="sa "> f</ span > < span class ="s2 "> "XAI Consistency: </ span > < span class ="si "> {</ span > < span class ="n "> consistency</ span > < span class ="si "> :</ span > < span class ="s2 "> .2f</ span > < span class ="si "> }</ span > < span class ="s2 "> "</ span > < span class ="p "> )</ span >
5534+ < span class ="go "> Attribution Correlation Matrix:</ span >
5535+ < span class ="go "> [[ 1. 0.97 0.98]</ span >
5536+ < span class ="go "> [ 0.97 1. 0.99]</ span >
5537+ < span class ="go "> [ 0.98 0.99 1. ]]</ span >
5538+ < span class ="go "> XAI Consistency: 0.98</ span >
5539+ </ code > </ pre > </ div >
5540+
5541+
5542+ < details class ="note " open >
5543+ < summary > Note</ summary >
5544+ < p > The correlation matrix is computed using numpy’s corrcoef function, which
5545+ calculates Pearson correlation coefficients. Only the upper triangle of
5546+ the correlation matrix is used to avoid counting correlations twice.</ p >
5547+ </ details >
55165548 < details class ="quote ">
55175549 < summary > Source code in < code > spotpython/utils/metrics.py</ code > </ summary >
5518- < div class ="highlight "> < table class ="highlighttable "> < tr > < td class ="linenos "> < div class ="linenodiv "> < pre > < span > </ span > < span class ="normal "> 202</ span >
5550+ < div class ="highlight "> < table class ="highlighttable "> < tr > < td class ="linenos "> < div class ="linenodiv "> < pre > < span > </ span > < span class ="normal "> 201</ span >
5551+ < span class ="normal "> 202</ span >
55195552< span class ="normal "> 203</ span >
55205553< span class ="normal "> 204</ span >
55215554< span class ="normal "> 205</ span >
@@ -5538,30 +5571,81 @@ <h2 id="spotpython.utils.metrics.calculate_xai_consistency" class="doc doc-headi
55385571< span class ="normal "> 222</ span >
55395572< span class ="normal "> 223</ span >
55405573< span class ="normal "> 224</ span >
5541- < span class ="normal "> 225</ span > </ pre > </ div > </ td > < td class ="code "> < div > < pre > < span > </ span > < code > < span class ="k "> def</ span > < span class ="nf "> calculate_xai_consistency</ span > < span class ="p "> (</ span > < span class ="n "> attributions</ span > < span class ="p "> ):</ span >
5542- < span class ="w "> </ span > < span class ="sd "> """</ span >
5543- < span class ="sd "> Calculates the consistency of XAI methods by computing the mean of the upper triangle</ span >
5544- < span class ="sd "> of the correlation matrix of the provided attributions.</ span >
5545-
5546- < span class ="sd "> Args:</ span >
5547- < span class ="sd "> attributions (np.ndarray): Array of shape (n_methods, n_features) containing </ span >
5548- < span class ="sd "> the attributions from different XAI methods.</ span >
5549-
5550- < span class ="sd "> Returns:</ span >
5551- < span class ="sd "> float: Mean value of the upper triangle of the correlation matrix.</ span >
5552- < span class ="sd "> """</ span >
5553- < span class ="n "> global_attr_np</ span > < span class ="o "> =</ span > < span class ="n "> np</ span > < span class ="o "> .</ span > < span class ="n "> array</ span > < span class ="p "> (</ span > < span class ="n "> attributions</ span > < span class ="p "> )</ span >
5554- < span class ="n "> corr_matrix</ span > < span class ="o "> =</ span > < span class ="n "> np</ span > < span class ="o "> .</ span > < span class ="n "> corrcoef</ span > < span class ="p "> (</ span > < span class ="n "> global_attr_np</ span > < span class ="p "> )</ span >
5555- < span class ="nb "> print</ span > < span class ="p "> (</ span > < span class ="s2 "> "Attribution Correlation Matrix:"</ span > < span class ="p "> )</ span >
5556- < span class ="nb "> print</ span > < span class ="p "> (</ span > < span class ="n "> corr_matrix</ span > < span class ="p "> )</ span >
5557-
5558- < span class ="c1 "> # Calculate the mean of the upper triangle of the correlation matrix</ span >
5559- < span class ="n "> upper_triangle_indices</ span > < span class ="o "> =</ span > < span class ="n "> np</ span > < span class ="o "> .</ span > < span class ="n "> triu_indices_from</ span > < span class ="p "> (</ span > < span class ="n "> corr_matrix</ span > < span class ="p "> ,</ span > < span class ="n "> k</ span > < span class ="o "> =</ span > < span class ="mi "> 1</ span > < span class ="p "> )</ span >
5560- < span class ="n "> upper_triangle_values</ span > < span class ="o "> =</ span > < span class ="n "> corr_matrix</ span > < span class ="p "> [</ span > < span class ="n "> upper_triangle_indices</ span > < span class ="p "> ]</ span >
5561- < span class ="n "> result_xai</ span > < span class ="o "> =</ span > < span class ="n "> upper_triangle_values</ span > < span class ="o "> .</ span > < span class ="n "> mean</ span > < span class ="p "> ()</ span >
5562- < span class ="nb "> print</ span > < span class ="p "> (</ span > < span class ="s2 "> "XAI Consistency (mean of upper triangle of correlation matrix):"</ span > < span class ="p "> )</ span >
5563- < span class ="nb "> print</ span > < span class ="p "> (</ span > < span class ="n "> result_xai</ span > < span class ="p "> )</ span >
5564- < span class ="k "> return</ span > < span class ="n "> result_xai</ span >
5574+ < span class ="normal "> 225</ span >
5575+ < span class ="normal "> 226</ span >
5576+ < span class ="normal "> 227</ span >
5577+ < span class ="normal "> 228</ span >
5578+ < span class ="normal "> 229</ span >
5579+ < span class ="normal "> 230</ span >
5580+ < span class ="normal "> 231</ span >
5581+ < span class ="normal "> 232</ span >
5582+ < span class ="normal "> 233</ span >
5583+ < span class ="normal "> 234</ span >
5584+ < span class ="normal "> 235</ span >
5585+ < span class ="normal "> 236</ span >
5586+ < span class ="normal "> 237</ span >
5587+ < span class ="normal "> 238</ span >
5588+ < span class ="normal "> 239</ span >
5589+ < span class ="normal "> 240</ span >
5590+ < span class ="normal "> 241</ span >
5591+ < span class ="normal "> 242</ span >
5592+ < span class ="normal "> 243</ span >
5593+ < span class ="normal "> 244</ span >
5594+ < span class ="normal "> 245</ span >
5595+ < span class ="normal "> 246</ span >
5596+ < span class ="normal "> 247</ span >
5597+ < span class ="normal "> 248</ span >
5598+ < span class ="normal "> 249</ span >
5599+ < span class ="normal "> 250</ span > </ pre > </ div > </ td > < td class ="code "> < div > < pre > < span > </ span > < code > < span class ="k "> def</ span > < span class ="nf "> calculate_xai_consistency</ span > < span class ="p "> (</ span > < span class ="n "> attributions</ span > < span class ="p "> )</ span > < span class ="o "> -></ span > < span class ="nb "> float</ span > < span class ="p "> :</ span >
5600+ < span class ="w "> </ span > < span class ="sd "> """Calculate the consistency between different XAI methods.</ span >
5601+ < span class ="sd "> Computes the pairwise correlation between different XAI methods' attributions</ span >
5602+ < span class ="sd "> and returns their mean correlation as a measure of consistency. A higher value</ span >
5603+ < span class ="sd "> indicates greater agreement between different XAI methods.</ span >
5604+
5605+ < span class ="sd "> Args:</ span >
5606+ < span class ="sd "> attributions (np.ndarray): Array of shape (n_methods, n_features) containing</ span >
5607+ < span class ="sd "> feature importance scores from different XAI methods. Each row represents</ span >
5608+ < span class ="sd "> a different XAI method's attributions, and each column represents a feature.</ span >
5609+
5610+ < span class ="sd "> Returns:</ span >
5611+ < span class ="sd "> float: Mean correlation between XAI methods, ranging from -1 to 1.</ span >
5612+ < span class ="sd "> - 1: Perfect consistency between methods</ span >
5613+ < span class ="sd "> - 0: No consistency between methods</ span >
5614+ < span class ="sd "> - -1: Perfect negative consistency between methods</ span >
5615+
5616+ < span class ="sd "> Examples:</ span >
5617+ < span class ="sd "> >>> import numpy as np</ span >
5618+ < span class ="sd "> >>> # Three XAI methods' attributions for four features</ span >
5619+ < span class ="sd "> >>> attributions = np.array([</ span >
5620+ < span class ="sd "> ... [0.1, 0.2, 0.3, 0.4], # Method 1</ span >
5621+ < span class ="sd "> ... [0.2, 0.3, 0.4, 0.5], # Method 2</ span >
5622+ < span class ="sd "> ... [0.0, 0.1, 0.2, 0.3] # Method 3</ span >
5623+ < span class ="sd "> ... ])</ span >
5624+ < span class ="sd "> >>> consistency = calculate_xai_consistency(attributions)</ span >
5625+ < span class ="sd "> >>> print(f"XAI Consistency: {consistency:.2f}")</ span >
5626+ < span class ="sd "> Attribution Correlation Matrix:</ span >
5627+ < span class ="sd "> [[ 1. 0.97 0.98]</ span >
5628+ < span class ="sd "> [ 0.97 1. 0.99]</ span >
5629+ < span class ="sd "> [ 0.98 0.99 1. ]]</ span >
5630+ < span class ="sd "> XAI Consistency: 0.98</ span >
5631+
5632+ < span class ="sd "> Note:</ span >
5633+ < span class ="sd "> The correlation matrix is computed using numpy's corrcoef function, which</ span >
5634+ < span class ="sd "> calculates Pearson correlation coefficients. Only the upper triangle of</ span >
5635+ < span class ="sd "> the correlation matrix is used to avoid counting correlations twice.</ span >
5636+ < span class ="sd "> """</ span >
5637+ < span class ="n "> global_attr_np</ span > < span class ="o "> =</ span > < span class ="n "> np</ span > < span class ="o "> .</ span > < span class ="n "> array</ span > < span class ="p "> (</ span > < span class ="n "> attributions</ span > < span class ="p "> )</ span >
5638+ < span class ="n "> corr_matrix</ span > < span class ="o "> =</ span > < span class ="n "> np</ span > < span class ="o "> .</ span > < span class ="n "> corrcoef</ span > < span class ="p "> (</ span > < span class ="n "> global_attr_np</ span > < span class ="p "> )</ span >
5639+ < span class ="nb "> print</ span > < span class ="p "> (</ span > < span class ="s2 "> "Attribution Correlation Matrix:"</ span > < span class ="p "> )</ span >
5640+ < span class ="nb "> print</ span > < span class ="p "> (</ span > < span class ="n "> corr_matrix</ span > < span class ="p "> )</ span >
5641+
5642+ < span class ="c1 "> # Calculate the mean of the upper triangle of the correlation matrix</ span >
5643+ < span class ="n "> upper_triangle_indices</ span > < span class ="o "> =</ span > < span class ="n "> np</ span > < span class ="o "> .</ span > < span class ="n "> triu_indices_from</ span > < span class ="p "> (</ span > < span class ="n "> corr_matrix</ span > < span class ="p "> ,</ span > < span class ="n "> k</ span > < span class ="o "> =</ span > < span class ="mi "> 1</ span > < span class ="p "> )</ span >
5644+ < span class ="n "> upper_triangle_values</ span > < span class ="o "> =</ span > < span class ="n "> corr_matrix</ span > < span class ="p "> [</ span > < span class ="n "> upper_triangle_indices</ span > < span class ="p "> ]</ span >
5645+ < span class ="n "> result_xai</ span > < span class ="o "> =</ span > < span class ="n "> upper_triangle_values</ span > < span class ="o "> .</ span > < span class ="n "> mean</ span > < span class ="p "> ()</ span >
5646+ < span class ="nb "> print</ span > < span class ="p "> (</ span > < span class ="s2 "> "XAI Consistency (mean of upper triangle of correlation matrix):"</ span > < span class ="p "> )</ span >
5647+ < span class ="nb "> print</ span > < span class ="p "> (</ span > < span class ="n "> result_xai</ span > < span class ="p "> )</ span >
5648+ < span class ="k "> return</ span > < span class ="n "> result_xai</ span >
55655649</ code > </ pre > </ div > </ td > </ tr > </ table > </ div >
55665650 </ details >
55675651 </ div >
0 commit comments