使用Jaccard系数来预测网络中可能的链路



我使用Jaccard系数来预测newtork中的链接,然后得到我预测的AUC分数。我的代码是有效的,但每次它都会给我一个不同的分数,因为每次它都随机选择不同的节点作为训练集。假设我想运行1000个预测分数,并存储它们,然后得到这些分数的平均值。我需要在代码中添加/更改什么?

输入


#Remove 20% of the edges
proportion_edges=.2
edge_subset = random.sample(G.edges(), int(proportion_edges*G.number_of_edges()))
#Create a copy of the graph and remove the edges
G_train = G.copy()
G_train.remove_edges_from(edge_subset)

#Make prediction using Jaccard Coefficient
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])
#Compute the ROC AUC Score for Jaccard Coefficient
from sklearn import metrics
from sklearn.metrics import roc_auc_score
fpr_jaccard, tpr_jaccard, _ = metrics.roc_curve(label_jaccard, score_jaccard)
auc_jaccard = roc_auc_score(label_jaccard, score_jaccard)
auc_jaccard

输出

0.6926406926406927

简单地回答您的问题:您需要围绕代码构建一个循环:

# Settings
proportion_edges=.2
auc_jaccard_list = []
for i in range(1000):
#Remove 20% of the edges
edge_subset = random.sample(G.edges(), int(proportion_edges*G.number_of_edges()))
# ...
auc_jaccard = roc_auc_score(label_jaccard, score_jaccard)
auc_jaccard_list.append(auc_jaccard)
# print results
print(np.mean(auc_jaccard_list))

方法方面

从方法论的角度来看,我建议修改一些细节:

类1边的定义

您考虑所有节点对进行评估:

score_jaccard, label_jaccard = zip(*[(s, (u,v) in edge_subset) for (u,v,s) in pred_jaccard])

但只有测试边才算为类1。这意味着所有现有的训练边都被视为类0。
这样做意味着评估您的方法预测的效果,以及边是否是随机选择的边集的一部分。

建议:创建一个由随机选择的节点对组成的测试集,与是否有边无关。并且只对这些对求值。这可能会增加你的拍卖额。

混合训练和测试

去除边缘进行测试也会修改训练集,并更改训练集和测试集的jaccard系数。

建议:不幸的是,如果不了解更多的用例,很难想出一个好的方法。

最新更新