fblgit's picture
Upload folder using huggingface_hub
76cdab0
raw
history blame
6.09 kB
import logging
logging.basicConfig(level='ERROR')
import numpy as np
from tqdm import tqdm
import json
from collections import defaultdict
import matplotlib.pyplot as plt
from sklearn.metrics import auc, roc_curve
import matplotlib
import random
from ipdb import set_trace as bp
import time
matplotlib.rcParams['pdf.fonttype'] = 42
matplotlib.rcParams['ps.fonttype'] = 42
matplotlib.rcParams['pdf.fonttype'] = 42
matplotlib.rcParams['ps.fonttype'] = 42
# plot data
def sweep(score, x):
"""
Compute a ROC curve and then return the FPR, TPR, AUC, and ACC.
"""
fpr, tpr, _ = roc_curve(x, -score)
acc = np.max(1-(fpr+(1-tpr))/2)
return fpr, tpr, auc(fpr, tpr), acc
def do_plot(prediction, answers, sweep_fn=sweep, metric='auc', legend="", output_dir=None):
"""
Generate the ROC curves by using ntest models as test models and the rest to train.
"""
fpr, tpr, auc, acc = sweep_fn(np.array(prediction), np.array(answers, dtype=bool))
low = tpr[np.where(fpr<.05)[0][-1]]
# bp()
print('Attack %s AUC %.4f, Accuracy %.4f, TPR@5%%FPR of %.4f\n'%(legend, auc,acc, low))
metric_text = ''
if metric == 'auc':
metric_text = 'auc=%.3f'%auc
elif metric == 'acc':
metric_text = 'acc=%.3f'%acc
plt.plot(fpr, tpr, label=legend+metric_text)
return legend, auc,acc, low
def fig_fpr_tpr(all_output, output_dir):
print("output_dir", output_dir)
answers = []
metric2predictions = defaultdict(list)
for ex in all_output:
answers.append(ex["label"])
for metric in ex["pred"].keys():
if ("raw" in metric) and ("clf" not in metric):
continue
metric2predictions[metric].append(ex["pred"][metric])
plt.figure(figsize=(4,3))
with open(f"{output_dir}/auc.txt", "w") as f:
for metric, predictions in metric2predictions.items():
legend, auc, acc, low = do_plot(predictions, answers, legend=metric, metric='auc', output_dir=output_dir)
f.write('%s AUC %.4f, Accuracy %.4f, TPR@0.1%%FPR of %.4f\n'%(legend, auc, acc, low))
plt.semilogx()
plt.semilogy()
plt.xlim(1e-5,1)
plt.ylim(1e-5,1)
plt.xlabel("False Positive Rate")
plt.ylabel("True Positive Rate")
plt.plot([0, 1], [0, 1], ls='--', color='gray')
plt.subplots_adjust(bottom=.18, left=.18, top=.96, right=.96)
plt.legend(fontsize=8)
plt.savefig(f"{output_dir}/auc.png")
def load_jsonl(input_path):
with open(input_path, 'r') as f:
data = [json.loads(line) for line in tqdm(f)]
random.seed(0)
random.shuffle(data)
return data
def dump_jsonl(data, path):
with open(path, 'w') as f:
for line in tqdm(data):
f.write(json.dumps(line) + "\n")
def read_jsonl(path):
with open(path, 'r') as f:
return [json.loads(line) for line in tqdm(f)]
def convert_huggingface_data_to_list_dic(dataset):
all_data = []
for i in range(len(dataset)):
ex = dataset[i]
all_data.append(ex)
return all_data
def process_truthful_qa(data):
new_data = []
for ex in data:
new_ex = {}
label = ex["mc2_targets"]["labels"].index(1)
output = ex["mc2_targets"]["choices"][label]
# We change to mc2 instead of mc1 as it's those that open llm lead uses. (check about)
new_ex["output"] = output
new_ex["input"] = ex["question"] + " " + output
new_data.append(new_ex)
return new_data
def process_mmlu(data):
new_data = []
for ex in data:
new_ex = {}
label = ex["choices"][ex["answer"]]
output = label
new_ex["output"] = output
new_ex["input"] = ex["question"] + " " + output
new_data.append(new_ex)
return new_data
def process_arc(data):
new_data = []
choice2label = {"A": 0, "B": 1, "C": 2, "D": 3}
for ex in data:
new_ex = {}
# bp()
# print(ex["answerKey"])
if ex["answerKey"] not in choice2label:
continue
label = choice2label[ex["answerKey"]]
output = ex["choices"]["text"][label]
new_ex["output"] = output
new_ex["input"] = ex["question"] + " " + output
new_data.append(new_ex)
return new_data
def process_gsm8k(data):
new_data = []
for ex in data:
new_ex = {}
output = ex["answer"].split('####')[0].strip()
new_ex["output"] = output
new_ex["input"] = ex["question"] + " " + output
new_data.append(new_ex)
return new_data
def process_winogrande(data):
'''
new_data = []
for ex in data:
new_ex = {}
label = int(ex["answer"])
output = ex[f"option{label}"]
new_ex["output"] = output
new_ex["input"] = ex["sentence"] + " " + output
new_data.append(new_ex)
return new_data
'''
new_data = []
for doc in data:
new_doc = {}
# Convert the answer to a numeric index
answer_to_num = {"1": 0, "2": 1}
label_idx = answer_to_num[doc["answer"]]
# Generate options and select the correct one based on label_idx
options = [doc["option1"], doc["option2"]]
output = options[label_idx]
# Build the new sentence by inserting the selected option
idx = doc["sentence"].index("_")
input_sentence = doc["sentence"][:idx] + output + doc["sentence"][idx+1:]
# Assigning the processed values to the new_doc
new_doc["output"] = output
new_doc["input"] = input_sentence
# Append the processed document to new_data
new_data.append(new_doc)
return new_data
# I'm not sure if that's the correct format for winogrande given how the dataset works.
def process_hellaswag(data):
new_data = []
for ex in data:
new_ex = {}
label = int(ex["label"]) # For some reason label is in str and not int?
output = ex["endings"][label]
new_ex["output"] = output
new_ex["input"] = ex["ctx"] + " " + output
new_data.append(new_ex)
return new_data