AI-Scientist/review_iclr_bench/iclr_analysis.py 代码解释
parser.add_argument(
"--temperature",
type=float,
default=0.75,
help="GPT temperature.",
)
return parser.parse_args()
llm_cols = [
"paper_id",
"Summary",
"Questions",
"Limitations",
"Ethical Concerns",
"Soundness",
"Presentation",
"Contribution",
"Overall",
"Confidence",
"Strengths",
"Weaknesses",
"Originality",
"Quality",
"Clarity",
"Significance",
"Decision",
]
def prep_open_review_data(
ratings_path="ratings_subset.tsv",
data_seed=1,
balanced_val=False,
num_reviews=-1,
):
ratings = pd.read_csv(ratings_path, sep="\t", index_col=0)
ratings = ratings[ratings["decision"] != "Unknown"]
avg = np.nanmean(ratings[["0", "1", "2", "3", "4", "5", "6"]], axis=1)
ratings["mean"] = avg
ratings["url"] = "https://openreview.net/pdf?id=" + ratings.index
ratings["paper_id"] = ratings.index
ratings["simplified_decision"] = ratings["decision"].apply(
lambda x: (
"Accept"
if x in ["Accept (Oral)", "Accept (Poster)", "Accept (Spotlight)"]
else "Reject"
)
)
ratings = shuffle(ratings, random_state=data_seed)
ratings.drop_duplicates(inplace=True)
if balanced_val:
ratings = (
ratings[900:]
.groupby("simplified_decision")
.apply(lambda x: x.sample(n=int(num_reviews / 2), random_state=data_seed))
)
ratings = shuffle(ratings, random_state=data_seed)
ratings = ratings.set_index("paper_id")
return ratings
def get_perf_metrics(llm_ratings, ore_ratings):
try:
llm_ratings = llm_ratings.set_index("paper_id")
except Exception:
pass
num_llm_reviews = llm_ratings.shape[0]
if num_llm_reviews == 0:
return 0, 0, 0, 0, 0
correct = 0
y_pred = []
y_true = []
for i in range(num_llm_reviews):
name = llm_ratings.iloc[i].name
if (
llm_ratings["Decision"].loc[name]
== ore_ratings["simplified_decision"].loc[name]
):
correct += 1
y_pred.append(llm_ratings["Decision"].loc[name] == "Accept")
y_true.append(ore_ratings["simplified_decision"].loc[name] == "Accept")
accuracy = correct / num_llm_reviews
accuracy = round(accuracy, 2)
f1 = round(f1_score(y_true, y_pred), 2)
try:
roc = round(roc_auc_score(y_true, y_pred), 2)
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
fpr = fp / (fp + tn)
fnr = fn / (fn + tp)
except Exception:
roc = 0
fpr, fnr = 0, 0
return accuracy, f1, roc, fpr, fnr
ChatGPT-4o-Latest
Poe
以下是你提供的代码的逐行解释:
parser.add_argument
部分
python
复制
parser.add_argument(
"--temperature",
type=float,
default=0.75,
help="GPT temperature.",
)
parser.add_argument
: 这是一个用于定义命令行参数的函数。此处为parser
添加了一个参数--temperature
。
--temperature
: 提供的命令行参数名称(--
表示这是一个可选参数)。type=float
: 指定该参数的类型为浮点数。default=0.75
: 如果用户没有提供此参数,则使用默认值0.75
。help="GPT temperature."
: 参数的帮助信息,说明该参数用于设置 GPT 的温度。
python
复制
return parser.parse_args()
parser.parse_args()
: 解析命令行输入,返回解析后的参数对象。return
表示将解析的结果返回给调用该函数的代码。
llm_cols
部分
python
复制
llm_cols = [
"paper_id",
"Summary",
"Questions",
"Limitations",
"Ethical Concerns",
"Soundness",
"Presentation",
"Contribution",
"Overall",
"Confidence",
"Strengths",
"Weaknesses",
"Originality",
"Quality",
"Clarity",
"Significance",
"Decision",
]
llm_cols
: 定义了一个包含论文属性的列名列表,表示在 LLM(大语言模型)评审数据中的不同属性。
- 列名包括论文 ID、摘要、问题、局限性、伦理问题、健全性、展示等各类评审指标。
prep_open_review_data
函数
python
复制
def prep_open_review_data(
ratings_path="ratings_subset.tsv",
data_seed=1,
balanced_val=False,
num_reviews=-1,
):
prep_open_review_data
: 定义了一个用于准备 OpenReview 数据的函数。
ratings_path="ratings_subset.tsv"
: 指定加载的评分数据文件路径,默认值为"ratings_subset.tsv"
。data_seed=1
: 数据随机化的种子,默认值为1
,用于保证数据打乱的可重复性。balanced_val=False
: 是否生成平衡的验证集,默认为False
。num_reviews=-1
: 评审数量,默认值为-1
,表示不限制数量。
python
复制
ratings = pd.read_csv(ratings_path, sep="\t", index_col=0)
ratings = pd.read_csv(...)
: 使用pandas
读取 TSV 文件(以制表符分隔),并将文件内容加载为一个DataFrame
,文件中的第一列被用作索引列。
python
复制
ratings = ratings[ratings["decision"] != "Unknown"]
ratings = ratings[...]
: 过滤掉decision
列值为"Unknown"
的行,保留有效的评审数据。
python
复制
avg = np.nanmean(ratings[["0", "1", "2", "3", "4", "5", "6"]], axis=1)
avg = np.nanmean(...)
: 计算列"0"
到"6"
的均值(忽略空值NaN
),并将结果存储在avg
中。
python
复制
ratings["mean"] = avg
ratings["mean"] = avg
: 将计算出的平均值avg
添加为新的列"mean"
。
python
复制
ratings["url"] = "https://openreview.net/pdf?id=" + ratings.index
ratings["url"] = ...
: 为每篇论文生成对应的 URL,URL 前缀为"https://openreview.net/pdf?id="
,后面拼接论文的id
(即索引)。
python
复制
ratings["paper_id"] = ratings.index
ratings["paper_id"] = ratings.index
: 将ratings
的索引列赋值给新的paper_id
列。
python
复制
ratings["simplified_decision"] = ratings["decision"].apply(
lambda x: (
"Accept"
if x in ["Accept (Oral)", "Accept (Poster)", "Accept (Spotlight)"]
else "Reject"
)
)
ratings["simplified_decision"] = ...
: 创建一个新列simplified_decision
,并根据原来的decision
列值将评审决策简化为"Accept"
或"Reject"
。如果原始决策是"Accept (Oral)"
、"Accept (Poster)"
或"Accept (Spotlight)"
,则简化为"Accept"
,否则为"Reject"
。
python
复制
ratings = shuffle(ratings, random_state=data_seed)
shuffle(...)
: 将ratings
数据随机打乱,使用data_seed
保证随机性的一致性。
python
复制
ratings.drop_duplicates(inplace=True)
drop_duplicates(...)
: 删除ratings
中的重复行。
python
复制
if balanced_val:
if balanced_val:
: 检查是否需要生成平衡的验证集,如果balanced_val
为True
,则执行以下步骤。
python
复制
ratings = (
ratings[900:]
.groupby("simplified_decision")
.apply(lambda x: x.sample(n=int(num_reviews / 2), random_state=data_seed))
)
ratings[900:]
: 从第 900 行开始过滤数据。
groupby("simplified_decision")
: 按照simplified_decision
列分组。apply(lambda x: ...)
: 对每个组应用自定义的采样操作,随机抽取样本数为num_reviews/2
,使用data_seed
保证采样一致性。
python
复制
ratings = shuffle(ratings, random_state=data_seed)
- 再次将
ratings
随机打乱。
python
复制
ratings = ratings.set_index("paper_id")
ratings = ratings.set_index("paper_id")
: 将paper_id
设置为新的索引列。
python
复制
return ratings
- 返回处理后的
ratings
数据。
get_perf_metrics
函数
python
复制
def get_perf_metrics(llm_ratings, ore_ratings):
get_perf_metrics
: 定义了一个用于计算模型性能指标的函数,比较 LLM 评审 (llm_ratings
) 和 OpenReview 评审 (ore_ratings
) 的决策。
python
复制
try:
llm_ratings = llm_ratings.set_index("paper_id")
except Exception:
pass
set_index("paper_id")
: 尝试将 LLM 评审的paper_id
列设置为索引,如遇到错误则忽略。
python
复制
num_llm_reviews = llm_ratings.shape[0]
if num_llm_reviews == 0:
return 0, 0, 0, 0, 0
- 计算 LLM 评审的总数量,如果为 0,则直接返回 5 个零值,表示无准确性等指标可计算。
python
复制
correct = 0
y_pred = []
y_true = []
- 初始化变量:
correct = 0
: 用于统计预测正确的数量。y_pred = []
: 存储 LLM 预测的结果(是否接受)。y_true = []
: 存储 OpenReview 的真实结果(是否接受)。
python
复制
for i in range(num_llm_reviews):
name = llm_ratings.iloc[i].name
- 循环遍历每一个 LLM 评审,获取论文的
paper_id
。
python
复制
if (
llm_ratings["Decision"].loc[name]
== ore_ratings["simplified_decision"].loc[name]
):
correct += 1
- 如果 LLM 评审的决策与 OpenReview 的简化决策一致,则计数
correct
增加 1。
python
复制
y_pred.append(llm_ratings["Decision"].loc[name] == "Accept")
y_true.append(ore_ratings["simplified_decision"].loc[name] == "Accept")
- 将 LLM 评审是否为
"Accept"
和 OpenReview 是否为"Accept"
分别添加到y_pred
和y_true
列表中。
python
复制
accuracy = correct / num_llm_reviews
accuracy = round(accuracy, 2)
- 计算准确率(
accuracy
),即正确预测的比例,并将结果四舍五入到两位小数。
python
复制
f1 = round(f1_score(y_true, y_pred), 2)
- 计算 F1 分数,用于衡量模型的精确性和召回率,并将结果四舍五入到两位小数。
python
复制
try:
roc = round(roc_auc_score(y_true, y_pred), 2)
tn, fp, fn, tp = confusion_matrix(y_true, y_pred).ravel()
fpr = fp / (fp + tn)
fnr = fn / (fn + tp)
except Exception:
roc = 0
fpr, fnr = 0, 0
- 尝试计算 ROC-AUC 分数(
roc
),并提取混淆矩阵的四个值(TN, FP, FN, TP),用于计算假阳性率(fpr
)和假阴性率(fnr
)。如果计算过程中出现错误,则将所有值设为 0。
python
复制
return accuracy, f1, roc, fpr, fnr
- 返回五个性能指标:准确率、F1 分数、ROC-AUC、假阳性率、假阴性率。