基于Jaccard系数的网络链接预测:如何实现多次运行取平均AUC
修改方案
直接给你改好的代码,核心就是加个循环把整个预测流程跑1000次,把每次的AUC分数存起来最后算平均:
import random import networkx as nx from sklearn import metrics from sklearn.metrics import roc_auc_score import numpy as np # 用来计算平均值,也可以用sum/len替代 # 初始化存储AUC分数的列表 auc_scores = [] # 重复执行1000次预测流程 for _ in range(1000): # 随机选取20%的边作为测试集 proportion_edges = .2 edge_subset = random.sample(G.edges(), int(proportion_edges * G.number_of_edges())) # 构建移除测试边后的训练图 G_train = G.copy() G_train.remove_edges_from(edge_subset) # 用Jaccard系数做链接预测 pred_jaccard = list(nx.jaccard_coefficient(G_train)) score_jaccard, label_jaccard = zip(*[(s, (u,v) in edge_subset) for (u,v,s) in pred_jaccard]) # 计算当前轮次的AUC并加入列表 auc_jaccard = roc_auc_score(label_jaccard, score_jaccard) auc_scores.append(auc_jaccard) # 计算并输出1000次结果的平均值 mean_auc = np.mean(auc_scores) print(f"1000次预测的平均AUC分数:{mean_auc}")
关键修改说明
- 把所有依赖的导入语句移到代码最顶部,避免循环内重复导入浪费资源
- 新增
auc_scores = []用来存储每一轮的AUC结果 - 用
for _ in range(1000):包裹整个预测流程,实现1000次重复执行 - 每轮循环结束后把当前的AUC分数追加到列表中
- 最后用
numpy.mean()计算平均值,要是不想安装numpy,也可以用sum(auc_scores)/len(auc_scores)替代
内容的提问来源于stack exchange,提问作者Oscar Fernando CV
相关产品推荐
相关产品推荐

