sonics-song-arena / leaderboard.py
awsaf49's picture
use `binary` average in all metrics
fb58804 verified
from glob import glob
from sklearn.metrics import accuracy_score, recall_score, f1_score
import os
import pandas as pd
def get_merged_df(results_path, skip_samples = True):
results = glob(os.path.join(results_path, "*.json"))
dfs = []
for r in results:
if skip_samples and 'sample_result' in r:
continue
df = pd.read_json(r, lines = True)
if df.drop(['algorithm'], axis = 1).isna().values.any():
print(f"Missing values in {r}")
else:
dfs.append(df)
full_df = pd.concat(dfs)
return full_df
def map_df(full_df):
gnd_truth_mapping = {'full fake': 1,
'half fake': 1,
'mostly fake': 1,
'real': 0}
pred_mapping = {'fake':1, 'real': 0}
full_df['gnd_truth'] = full_df['label'].map(gnd_truth_mapping)
full_df['pred'] = full_df['type'].map(pred_mapping)
return full_df
def get_duration_scores(df):
columns = ['Under 26 s', '55 s', '125 s', 'Overall' ]
samples_tested = []
acc_scores = []
for c in columns:
if c == 'Overall':
mask = df.gnd_truth == 0
elif c == 'Under 26 s':
mask = (df.gnd_truth == 0) & (df.duration < 26)
elif c == '55 s':
mask = (df.gnd_truth == 0) & (df.duration >= 26) & (df.duration < 56)
elif c == '125 s':
mask = (df.gnd_truth == 0) & (df.duration >= 56) & (df.duration < 126)
else:
raise ValueError
sel_df = df[mask]
samples_tested.append(len(sel_df))
acc_scores.append(round(accuracy_score(sel_df.gnd_truth.values, sel_df.pred.values), 3))
lb = pd.DataFrame({"Sample": columns, "Num Samples": samples_tested, "Accuracy": acc_scores})
return lb
def get_algorithm_scores_v1(df):
columns = list(df[df.label != 'real'].algorithm.unique())
samples_tested = []
acc_scores = []
rec_scores = []
for c in columns:
mask = (df.algorithm == c) | (df.label == 'real')
sel_df = df[mask]
samples_tested.append(len(sel_df[sel_df.label != 'real']))
rec_scores.append(round(recall_score(sel_df.gnd_truth.values, sel_df.pred.values), 3))
lb = pd.DataFrame({"Sample": columns, "Num Samples": samples_tested, "Recall": rec_scores})
return lb
def get_algorithm_scores_v2(df):
columns = list(df[df.label != 'real'].algorithm.unique())
columns2 = list(df[df.label != 'real'].label.unique())
samples_tested = []
acc_scores = []
tpr_scores = []
tnr_scores = [float('nan')]*(len(columns) + len(columns2))
f1_scores = [float('nan')]*(len(columns) + len(columns2))
for c in columns:
mask = (df.algorithm == c)
sel_df = df[mask]
samples_tested.append(len(sel_df))
tpr_scores.append(round(recall_score(sel_df.gnd_truth.values, sel_df.pred.values, pos_label=1, average="binary"), 3))
for c in columns2:
mask = (df.label == c)
sel_df = df[mask]
samples_tested.append(len(sel_df))
tpr_scores.append(round(recall_score(sel_df.gnd_truth.values, sel_df.pred.values, pos_label=1, average="binary"), 3))
mask = (df.label != "real")
sel_df = df[mask]
tpr_scores.append(round(recall_score(sel_df.gnd_truth.values, sel_df.pred.values, pos_label=1, average="binary"), 3))
mask = (df.label == "real")
sel_df = df[mask]
tnr_scores.append(round(recall_score(sel_df.gnd_truth.values, sel_df.pred.values, pos_label=0, average="binary"), 3))
sel_df = df.copy()
samples_tested.append(len(sel_df))
f1_scores.append(round(f1_score(sel_df.gnd_truth.values, sel_df.pred.values, average="binary"), 3))
lb = pd.DataFrame({"Sample": columns + columns2 + ["overall"], "Num Samples": samples_tested,
"TPR": tpr_scores, "TNR": tnr_scores, "F1": f1_scores})
return lb
def build_leaderboard(results_path = 'results'):
full_df = get_merged_df(results_path)
full_df_mapped = map_df(full_df)
leaderboard = get_algorithm_scores_v2(full_df_mapped)
return leaderboard