aiops/ContraLSP/mortalty/deal_results.py (214 lines of code) (raw):

import numpy as np import matplotlib.pyplot as plt from matplotlib import cm, colors import seaborn as sns from sklearn import metrics import pickle as pkl import torch import pandas as pd from sklearn.metrics import auc, precision_recall_curve, roc_auc_score import warnings warnings.simplefilter(action='ignore', category=FutureWarning) plt.rcParams.update({'font.size': 16}) from utils.metrics import get_entropy_array, get_information_array pd.set_option('display.max_columns', None) pd.set_option('display.max_rows', None) pd.set_option('display.width', 5000) pd.set_option('max_colwidth', 500) explainer_list = [ "occlusion", "augmented_occlusion", "integrated_gradients", "gradient_shap", "deep_lift", "lime", "fit", "retain", "dyna_mask", "extremal_mask", # tensor(13723.2715, grad_fn=<SumBackward0>) tensor(0.2366, grad_fn=<MeanBackward0>) "gate_mask",# tensor(14289.1562) tensor(0.4865, grad_fn=<MeanBackward0>) tensor(0.0310, gra>) 1.1 1 tensor(0.1030, grad_fn=<MseLossBackward0>) ] baseline = "Average" # Zeros, Average Topk = 0.2 CV = 5 pd.options.display.float_format = '{:.3f}'.format mymetrics = np.zeros((4, len(explainer_list), CV)) results_df = pd.DataFrame(columns=["Acc", "Astd", "CE", "CEstd", "Suff", "Sstd", "Comp", "Cstd"]) # Seed, Fold, Baseline, Topk, Explainer, Lambda_1, Lambda_2, Accuracy, Comprehensiveness, Cross # Entropy, Log # Odds, Sufficiency data = pd.read_csv("./results.csv") for cv in range(CV): for e, explainer in enumerate(explainer_list): mymetrics[0, e, cv] = data[data.Fold==cv][data.Topk==Topk][data.Explainer==explainer][data.Baseline==baseline].Accuracy.values[0] mymetrics[1, e, cv] = data[data.Fold==cv][data.Topk==Topk][data.Explainer==explainer][data.Baseline==baseline]['Cross Entropy'].values[0] mymetrics[2, e, cv] = data[data.Fold==cv][data.Topk==Topk][data.Explainer==explainer][data.Baseline==baseline]['Sufficiency'].values[0] mymetrics[3, e, cv] = data[data.Fold==cv][data.Topk==Topk][data.Explainer==explainer][data.Baseline==baseline].Comprehensiveness.values[0] for e, explainer in enumerate(explainer_list): aup_avg, aup_std = np.mean(mymetrics[0, e, :]), np.std(mymetrics[0, e, :]) aur_avg, aur_std = np.mean(mymetrics[1, e, :]), np.std(mymetrics[1, e, :]) im_avg, im_std = np.mean(mymetrics[2, e, :])*100, np.std(mymetrics[2, e, :])*100 sm_avg, sm_std = np.mean(mymetrics[3, e, :])*100, np.std(mymetrics[3, e, :])*100 results_df.loc[explainer] = [aup_avg, aup_std, aur_avg, aur_std, im_avg, im_std, sm_avg, sm_std] baseline = "Zeros" # Zeros, Average results_df2 = pd.DataFrame(columns=["Acc", "Astd", "CE", "CEstd", "Suff", "Sstd", "Comp", "Cstd"]) for cv in range(CV): for e, explainer in enumerate(explainer_list): mymetrics[0, e, cv] = data[data.Fold==cv][data.Topk==Topk][data.Explainer==explainer][data.Baseline==baseline].Accuracy.values[0] mymetrics[1, e, cv] = data[data.Fold==cv][data.Topk==Topk][data.Explainer==explainer][data.Baseline==baseline]['Cross Entropy'].values[0] mymetrics[2, e, cv] = data[data.Fold==cv][data.Topk==Topk][data.Explainer==explainer][data.Baseline==baseline]['Sufficiency'].values[0] mymetrics[3, e, cv] = data[data.Fold==cv][data.Topk==Topk][data.Explainer==explainer][data.Baseline==baseline].Comprehensiveness.values[0] for e, explainer in enumerate(explainer_list): aup_avg, aup_std = np.mean(mymetrics[0, e, :]), np.std(mymetrics[0, e, :]) aur_avg, aur_std = np.mean(mymetrics[1, e, :]), np.std(mymetrics[1, e, :]) im_avg, im_std = np.mean(mymetrics[2, e, :])*100, np.std(mymetrics[2, e, :])*100 sm_avg, sm_std = np.mean(mymetrics[3, e, :])*100, np.std(mymetrics[3, e, :])*100 results_df2.loc[explainer] = [aup_avg, aup_std, aur_avg, aur_std, im_avg, im_std, sm_avg, sm_std] resuldasdasdt = pd.concat([results_df, results_df2], axis=1) print(resuldasdasdt) ############################################################################################ ############################################################################################ ############################################################################################ lab_name = { "occlusion":"FO", "fit":"FIT", "dynamask":"Dynamask", "gatemask":"ContraLSP", "extrmask":"Extrmask", "retain":"RETAIN", } explainer_list = [ "occlusion", # "lime", "fit", "dyna_mask", "gate_mask", "extremal_mask", "retain", ] baseline = "Average" areas = [float(area) for area in [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]] metrics_array = np.zeros((len(explainer_list), len(areas), 4, CV)) for cv in range(CV): for e, explainer in enumerate(explainer_list): for a, area in enumerate(areas): metrics_array[e, a, 0, cv] = data[data.Fold==cv][data.Topk==area][data.Explainer==explainer][data.Baseline==baseline].Accuracy.values[0] metrics_array[e, a, 1, cv] = data[data.Fold==cv][data.Topk==area][data.Explainer==explainer][data.Baseline==baseline]['Cross Entropy'].values[0] metrics_array[e, a, 2, cv] = data[data.Fold==cv][data.Topk==area][data.Explainer==explainer][data.Baseline==baseline]['Sufficiency'].values[0] metrics_array[e, a, 3, cv] = data[data.Fold==cv][data.Topk==area][data.Explainer==explainer][data.Baseline==baseline].Comprehensiveness.values[0] fig, axes = plt.subplots(1, 4, figsize=(19, 4)) # Plot the CE and the ACC for each attribution method and each mask area for k, name in enumerate(explainer_list): # plt.figure(1) axes[0].plot(areas, metrics_array[k, :, 0, :].mean(axis=-1), label=name) axes[0].fill_between( areas, metrics_array[k, :, 0, :].mean(axis=-1) - metrics_array[k, :, 0, :].std(axis=-1), metrics_array[k, :, 0, :].mean(axis=-1) + metrics_array[k, :, 0, :].std(axis=-1), alpha=0.1, ) # plt.figure(2) axes[1].plot(areas, metrics_array[k, :, 1, :].mean(axis=-1), label=name) axes[1].fill_between( areas, metrics_array[k, :, 1, :].mean(axis=-1) - metrics_array[k, :, 1, :].std(axis=-1), metrics_array[k, :, 1, :].mean(axis=-1) + metrics_array[k, :, 1, :].std(axis=-1), alpha=0.1, ) # plt.figure(3) axes[2].plot(areas, metrics_array[k, :, 2, :].mean(axis=-1), label=name) axes[2].fill_between( areas, metrics_array[k, :, 2, :].mean(axis=-1) - metrics_array[k, :, 2, :].std(axis=-1), metrics_array[k, :, 2, :].mean(axis=-1) + metrics_array[k, :, 2, :].std(axis=-1), alpha=0.1, ) # plt.figure(4) axes[3].plot(areas, metrics_array[k, :, 3, :].mean(axis=-1), label=name) axes[3].fill_between( areas, metrics_array[k, :, 3, :].mean(axis=-1) - metrics_array[k, :, 3, :].std(axis=-1), metrics_array[k, :, 3, :].mean(axis=-1) + metrics_array[k, :, 3, :].std(axis=-1), alpha=0.1, ) # plt.figure(1) axes[0].set_ylabel("Accuracy", fontsize=18) axes[1].set_ylabel("Cross Entropy", fontsize=18) axes[2].set_ylabel("Sufficiency", fontsize=18) axes[3].set_ylabel("Comprehensiveness", fontsize=18) for i in range(4): axes[i].set_xlim(0.1, 0.6) axes[i].set_xlabel("Fraction of the average perturbed", fontsize=16) # plt.tight_layout() fig.tight_layout() # 调整整体空白 plt.subplots_adjust(wspace=0.35, hspace=0) h, lab = axes[0].get_legend_handles_labels() lab = [ "occlusion", # "lime", "fit", "dynamask", "gatemask", "extrmask", "retain", ] order = [0,1,5,2,4,3] plt.legend([h[i] for i in order], [lab_name[lab[i]] for i in order], ncol = len(explainer_list), bbox_to_anchor=(0.16,1.3), fontsize=18) plt.savefig("mimic_avg.pdf", bbox_inches="tight") ########################################################################################### ############################################################################################ ############################################################################################ explainer_list = [ "occlusion", # "lime", "fit", "dyna_mask", "gate_mask", "extremal_mask", "retain", ] baseline = "Zeros" areas = [float(area) for area in [0.1, 0.2, 0.3, 0.4, 0.5, 0.6]] metrics_array = np.zeros((len(explainer_list), len(areas), 4, CV)) for cv in range(CV): for e, explainer in enumerate(explainer_list): for a, area in enumerate(areas): metrics_array[e, a, 0, cv] = data[data.Fold==cv][data.Topk==area][data.Explainer==explainer][data.Baseline==baseline].Accuracy.values[0] metrics_array[e, a, 1, cv] = data[data.Fold==cv][data.Topk==area][data.Explainer==explainer][data.Baseline==baseline]['Cross Entropy'].values[0] metrics_array[e, a, 2, cv] = data[data.Fold==cv][data.Topk==area][data.Explainer==explainer][data.Baseline==baseline]['Sufficiency'].values[0] metrics_array[e, a, 3, cv] = data[data.Fold==cv][data.Topk==area][data.Explainer==explainer][data.Baseline==baseline].Comprehensiveness.values[0] fig, axes = plt.subplots(1, 4, figsize=(19, 4)) # Plot the CE and the ACC for each attribution method and each mask area for k, name in enumerate(explainer_list): # plt.figure(1) axes[0].plot(areas, metrics_array[k, :, 0, :].mean(axis=-1), label=name) axes[0].fill_between( areas, metrics_array[k, :, 0, :].mean(axis=-1) - metrics_array[k, :, 0, :].std(axis=-1), metrics_array[k, :, 0, :].mean(axis=-1) + metrics_array[k, :, 0, :].std(axis=-1), alpha=0.1, ) # plt.figure(2) axes[1].plot(areas, metrics_array[k, :, 1, :].mean(axis=-1), label=name) axes[1].fill_between( areas, metrics_array[k, :, 1, :].mean(axis=-1) - metrics_array[k, :, 1, :].std(axis=-1), metrics_array[k, :, 1, :].mean(axis=-1) + metrics_array[k, :, 1, :].std(axis=-1), alpha=0.1, ) # plt.figure(3) axes[2].plot(areas, metrics_array[k, :, 2, :].mean(axis=-1), label=name) axes[2].fill_between( areas, metrics_array[k, :, 2, :].mean(axis=-1) - metrics_array[k, :, 2, :].std(axis=-1), metrics_array[k, :, 2, :].mean(axis=-1) + metrics_array[k, :, 2, :].std(axis=-1), alpha=0.1, ) # plt.figure(4) axes[3].plot(areas, metrics_array[k, :, 3, :].mean(axis=-1), label=name) axes[3].fill_between( areas, metrics_array[k, :, 3, :].mean(axis=-1) - metrics_array[k, :, 3, :].std(axis=-1), metrics_array[k, :, 3, :].mean(axis=-1) + metrics_array[k, :, 3, :].std(axis=-1), alpha=0.1, ) # plt.figure(1) axes[0].set_ylabel("Accuracy", fontsize=18) axes[1].set_ylabel("Cross Entropy", fontsize=18) axes[2].set_ylabel("Sufficiency", fontsize=18) axes[3].set_ylabel("Comprehensiveness", fontsize=18) for i in range(4): axes[i].set_xlim(0.1, 0.6) axes[i].set_xlabel("Fraction of the zero perturbed", fontsize=16) fig.tight_layout() plt.subplots_adjust(wspace=0.35, hspace=0) h, lab = axes[0].get_legend_handles_labels() lab = [ "occlusion", # "lime", "fit", "dynamask", "gatemask", "extrmask", "retain", ] order = [0,1,5,2,4,3] plt.legend([h[i] for i in order], [lab_name[lab[i]] for i in order], ncol = len(explainer_list), bbox_to_anchor=(0.16,1.3), fontsize=18) plt.savefig("mimic_zeros.pdf", bbox_inches="tight") print(resuldasdasdt)