2026/1/13 15:03:57
网站建设
项目流程
百度网站分析报告,WordPress不发邮件了,物流网站素材,快速排名网站原文#xff1a;towardsdatascience.com/how-to-test-graph-quality-to-improve-graph-machine-learning-performance-ad63f4e5b3dc 本文将向你展示如何测试你的拓扑图的质量
图是能够表示大量信息的数据结构。除了将数据样本单独表示为节点外#xff0c;图还表示了数据之间…原文towardsdatascience.com/how-to-test-graph-quality-to-improve-graph-machine-learning-performance-ad63f4e5b3dc本文将向你展示如何测试你的拓扑图的质量图是能够表示大量信息的数据结构。除了将数据样本单独表示为节点外图还表示了数据之间的关系封装了数据集中存储的更多信息。然而在创建图时验证图的质量是非常重要的这正是我将在本文中讨论的如何做到这一点。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/f39cd3ff859aa316a1b805aae5b62860.png通过这篇文章了解如何确保图的质量。图片由 ChatGPT 提供。“用放大镜查看一些节点”提示。ChatGPT4OpenAI2024 年 2 月 25 日。chat.openai.com.动机本文的动机是我正在为正在进行的项目创建图。这些图随后在我的流程中用于执行如图下流程图所示聚类。为了确保我的图正确无误我希望有一个可以输出我创建的每个图的质量的测试。在机器学习项目中工作验证你的结果和质量对于节省时间、修复错误以及确保你的数据流程正确运行至关重要。验证结果可以作为理智检查这样你就可以确定如果机器学习算法没有按预期运行问题不是图。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/b8a0a281eeeb19ecf5e0912eece2cf20.png我的机器学习项目的流程。图片由作者提供。此外我还想缩小我将要讨论的范围。首先当提到图时我指的是纯粹由其拓扑结构定义的图结构这意味着我只指的是数据之间的关系。一个纯粹由其拓扑结构定义的图可以用两个列表来表示。一个列表包含所有节点的索引另一个列表包含所有边也可能包括边的权重一个二维列表每行源目标权重。如果你的图是加权的你可以忽略权重或者将所有权重设置为 1。其次我将做出的一个范围定义是我正在使用我的图来区分不同的类别这将在我在图上使用的测试类型中反映出来。仅由拓扑信息定义的图可以用于其他几个目的如最短路径问题或链接预测这些内容我将在后续文章中介绍。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/43d25d2dd663b97b2eb7976d4899f714.png仅由拓扑信息定义的图。图片由作者提供。目录· 动机 · 目录 · 如何创建图 ∘ 找到数据集 ∘ 将数据集转换为图 · 测试 1下游任务 ∘ 在什么情况下使用下游任务 ∘ 在什么情况下不使用下游任务 · 测试 2图度量 ∘ 在什么情况下使用图度量 ∘ 在什么情况下不使用图度量 · 测试 3视觉检查 ∘ 在什么情况下使用视觉检查 ∘ 在什么情况下不使用视觉检查 · 测试 4Node2Vec 聚类 ∘ 在什么情况下使用 Node2Vec 聚类 ∘ 在什么情况下不使用 Node2Vec 聚类 · 什么是一个好的图 · 结论如何创建图首先你需要一个可以测试的图。为此你需要一个数据集来构建这个图如果数据集本身不是一个图你需要从数据中构建一个图。找到数据集Kaggle 上有许多您可以使用的免费数据集人们创建并上传到该网站。在 Kaggle 上您可以找到预先制作的图形数据集以及您可以创建图形的数据集例如著名的 MNIST 数据集这不是 MNIST 数据集的原始来源但它表明 Kaggle 包含各种不同类型的免费数据集您可以下载。另一个选择是斯坦福大学的网站该网站上有许多高质量的数据集例如推特社交图。您还可以使用PyTorch、HuggingFace、PapersWithCode和GitHub等网站来查找开源数据集。要了解更多关于创建数据的信息您可以阅读我下面关于创建强大嵌入的文章如何从您的数据创建强大的嵌入以供您的 AI 使用将您的数据集转换为图形在您获得数据集之后您接下来需要将其转换为由拓扑信息定义的图形。为此您首先需要定义不同的数据样本。数据样本可以是 MNIST 中的图像或者由价格、生产商和名称等不同属性定义的超市商品。当您拥有数据样本后您可以通过几种方法将它们转换为图形。其中一种方法是计算向量的余弦相似度。两个样本之间的相似度将代表样本之间的边边的权重即为相似度。此外您还可以在此处添加阈值只有当边的权重超过一定阈值时才添加边。例如两个数据样本之间必须至少有 0.9 的相似度您才能在它们之间创建边。您也可以使用百分位数例如只有最相似的数据样本对的前 20%才能在它们之间创建边。然而这里的一个重要注意事项是由于您正在取数据的前百分比边的权重将依赖于您的数据而阈值将独立于您的数据。# code to create a graph based on a matrix of embeddingsimportnumpyasnpfromsklearn.metrics.pairwiseimportcosine_similarity num_samples10num_features10embeddingsnp.random.rand(num_samples,num_features)#10 data samples, each with a length of 10similarity_matrixcosine_similarity(embeddings)edges[]weights[]# get top 50 percentilethresholdnp.percentile(similarity_matrix,50)foriinrange(len(similarity_matrix)):forjinrange(i1,len(similarity_matrix)):#we only need the upper triangle of the matrixifsimilarity_matrix[i][j]threshold:edges.append((i,j))#assuming we are looking at an undirectional graphweights.append(similarity_matrix[i,j])# make a networkx graph with the edges and weightsGnx.Graph()G.add_nodes_from(range(num_samples))for(source,destination),weightinzip(edges,weights):G.add_edge(source,destination,weightweight)nx.draw(G)将绘制出如下图形https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/cbfbaa0bf50d3b5a69dcb12fc821a7a3.png使用最相似的 20%节点创建的图形。请注意由于我们只使用了前 50%因此图形连接性不强。图片由作者提供。最后你也可以通过应用 KMeans 聚类来创建边尽管对于我的用例来说这并不推荐因为我的图形的目标是应用聚类因此我不希望我的图形依赖于另一种聚类方法。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/86e4a14deabc7c128c6bb35814ed2d09.png余弦相似度公式。图片由作者提供。测试 1下游任务你可以使用下游任务来测试你图形的质量通过应用不同的指标来计算性能。例如你可以使用社区检测的下游任务使用如 AMI、NMI 和 Rand 指数等指标。你可以使用的下游任务将取决于你使用图形的目的我在另一篇《数据科学走向》文章中对此进行了更深入的探讨。点击此处查看文章。由于我使用我的图形来区分不同的类别因此我的下游任务将是社区检测在由拓扑信息定义的图上应用聚类。在选择下游任务时我也考虑了关于我的数据集的更多信息。定义我使用的数据集有两个主要属性它是有权重的。这意味着我需要一个利用加权边的社区检测算法我需要检测特定的社区数量。因此我的社区检测算法需要有一个选项来设置要检测的确切社区数量。对于我的要求来说谱聚类方法是一个完美的候选者Scikit-Learn 有相应的代码点击此处查看。然后我可以使用以下代码来检测我图中的社区# code to perform spectral clusteringimportnumpyasnpfromsklearn.clusterimportSpectralClustering n_communities3num_nodes10# Number of nodes in your graphsimilarity_matrixnp.random.rand(num_nodes,num_nodes)# Since the similarity matrix should be symmetric, we symmetrize itsimilarity_matrix(similarity_matrixsimilarity_matrix.T)/2np.fill_diagonal(similarity_matrix,0)scSpectralClustering(n_clustersn_communities,affinityprecomputed,assign_labelskmeans,random_state42)labelssc.fit_predict(similarity_matrix)你可以用以下方式将其绘制成图# plot the graph with assigned labelsGnx.Graph()G.add_nodes_from(range(num_nodes))# if you have your own edges, you can ignore the for loops hereedges[]weights[]foriinrange(len(similarity_matrix)):forjinrange(i1,len(similarity_matrix)):#we only need the upper triangle of the matrixedges.append((i,j))#assuming we are looking at an undirectional graphweights.append(similarity_matrix[i,j])# add edges to graphfor(source,destination),weightinzip(edges,weights):G.add_edge(source,destination,weightweight)# draw graphposnx.spring_layout(G,k1)nx.draw(G,pos,with_labelsTrue,node_colorlabels)这将绘制出如下所示的图https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/9139b5e217784575b04ca622a207a1d7.png使用谱聚类进行图聚类。你可以看到用不同颜色定义的不同社区。图片由作者提供。然后你必须找到一些可以用来衡量下游任务表现如何的指标。由于我使用社区检测自然可以使用的指标是 AMI、NMI 和 Rand 指数以了解社区检测表现如何。然后你可以通过这些指标来解释图形的质量。然而请注意单个图形的指标并不一定意味着很多但你可以比较不同图形的指标以查看哪个图形表现最好。注意如果你使用社区检测你应该确保你的图是连通的。也就是说你只有一个节点岛屿因此对于所有节点对它们之间存在路径。如果一个图不是连通的社区检测通常会表现不佳。在以下情况下使用下游任务当你有合适的下游任务进行测试时当你想要一个关于图品质的相对度量不要在以下情况下使用下游任务你想要一个关于图品质的绝对度量测试 2图指标你还可以使用不同的图指标来测试你图的品质。我之前写过两篇关于分析图网络的文章一篇是关于基本图分析的文章《分析图网络第一部分》另一篇是关于更高级分析的文章《分析图网络第二部分》。一般来说你可以使用不同的指标如度数或连通性来理解你的图。这些指标与你的图品质的关系将取决于你的图是用于什么目的。例如如果你使用你的图进行社区检测高连通性可能是一个期望的特性。此外我还建议自己创建一些指标你可以使用这些指标来理解你的图。当你有节点标签时这里的一个建议是计算与相同标签的节点最连接的节点的百分比。这个指标的百分比越高表示图越好因为这个指标表明更多相似元素是连接的。你可以根据你的图的使用案例创建自己的指标。这种做法的优势在于你可以定制指标以适应你的特定需求这可以创建一个与你的图品质高度相关的指标。创建这样的指标反过来又允许你快速了解哪些图比其他图更好这可以节省你大量的时间和精力。你使用的其他指标示例图中平均边权重图中孤立节点的数量图中节点岛屿的数量https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/876516e9c6e59d1ebec3521ceac294d9.png一个具有两个节点岛屿的示例图。岛屿 1 由图(0, 1, 4)组成岛屿 2 由节点(2,3)组成。图片由作者提供当以下情况使用图指标你可以找到一个合适的指标来表示你图的品质当以下情况不使用图指标图指标不能提供有意义的信息来解释你图的品质测试 3视觉检查在机器学习中通过视觉检查你的数据对于理解你所处理的数据集至关重要。同样的逻辑也适用于图形。为了理解你图形的质量你应该使用视觉检查使用像 Graphviz、Gephi 或 Cytoscape 这样的工具。你可以使用这些工具来更好地理解你图形的优缺点。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/e4bf8b0343726d5eae4bc2ecc87ce278.png在图片中你可以看到之前用 Cytoscape 可视化的图形节点颜色由它们的标签定义。标签相同的节点0,1,4以及标签相同的节点2,3。图片由作者提供。当首次打开图形可视化工具时你可能会被选项的数量以及有时不直观的设计所压倒。然而如果你能完全理解这些工具的细节这将给你带来强大的优势。我自己使用 Cytoscape。要在 Cytoscape 中可视化一个图形我通常使用 Python 中的 NetworkX 定义一个图形然后将其写入 .graphml 文件格式。这样就可以在 Cytoscape 中打开这个图形。我在 Cytoscape 中使用的一些重要选项是分析网络。分析网络是顶部栏工具选项下的一个选项。分析网络选项为你提供了关于你图形的各种信息如连通性和度。图形布局。通过顶部栏中的布局菜单选择图形布局尝试不同的布局以查看哪个布局提供了最佳的可视化效果。选择相邻节点。你可以在图形中通过右键单击一个节点按下选择选项然后选择选择第一个相邻节点选项来选择相邻节点。这将突出显示图形中的所有相邻节点这对于理解连接了哪些类型的节点非常有用。节点信息着色。为了进一步了解哪些节点是相连的你可以通过节点属性来着色每个节点例如节点的标签。你可以通过转到侧边栏中的样式选项选择节点选项卡然后选择填充颜色选项来完成此操作。这允许你根据你选择的属性为节点分配颜色。利用上述提到的某些选项并在 Cytoscape 或你选择的任何其他图形可视化工具中测试不同的选项是深入了解你图形的强大方式。反过来这也是测试你图形质量的好方法因为你可以发现你图形中的一些问题这些问题你可以修复以进一步提高你图形的质量。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/8eef8df378b2d91229a0239bf0386172.png在 Cytoscape 中选择索引为 1 的节点的第一个邻居。你可以看到节点0,4是 1 的直接邻居节点已被选中。对于更复杂的图这可以用来通过 Cytoscape 理解图中的连通性。图片由作者提供。视觉检查之所以有效是因为你获得了对图外观的直观认识并且可以突然发现图中你可能之前没有意识到的明显弱点。一个例子是通过查看每个节点的邻居节点你可能看到那些节点根本不应该成为邻居例如如果你在计算边时混淆了相似性和距离如本文前面所述这种情况可能发生。你可能在图中发现的另一个问题是孤立节点或节点岛屿的数量这些节点是相互连接的但并没有连接到主节点岛屿。在以下情况下使用视觉检查你想了解单个图的品质不要在以下情况下使用视觉检查你需要用于图品质的定量指标测试 4Node2Vec 聚类测试拓扑信息图品质的第三种方法是使用像Node2Vec这样的算法将其从基于拓扑信息的图转换为节点嵌入。然后你可以将 KMeans 或 DBScan 等经典聚类技术应用于节点嵌入并使用 AMI、NMI 或 Rand 指数等指标来衡量聚类质量。将由拓扑信息定义的图转换为节点嵌入是机器学习中的一个热门话题基于随机游走的方法如DeepWalk和Node2Vec是最常用的方法之一。将图转换为节点嵌入允许你应用通常基于嵌入的质量测试这些测试在我的关于嵌入质量的文章中有更详细的描述。下面是用于为 NetworkX 图创建 Node2Vec 嵌入的 Python 代码# get node2vec embeddings for a graph!pip install node2vecfromnode2vecimportNode2Vec# Generate walksnode2vecNode2Vec(G,dimensions64,walk_length30,num_walks200,workers4)modelnode2vec.fit(window10,min_count1,batch_words4)embeddingsmodel.wv.vectors当使用这个测试时你应该意识到应用于节点嵌入的聚类所输出的度量将依赖于你的算法将拓扑图转换为节点嵌入的质量。这是一个重要的弱点你应该在解释输出结果时考虑到这一点。尽管如此这个测试可以作为你在测试基于拓扑信息图时可以使用的额外选项。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/4205463819d5d291c42d49775595d19d.png两个随机游走的示例用绿色和紫色箭头突出显示。这两个随机游走都从节点 F 开始到达节点 C。绿色随机游走然后到达节点 B然后回到节点 C而紫色随机游走到达节点 D然后到达节点 E。这是 Node2Vec 基于的概念以及它是如何创建节点嵌入的。图片由作者提供。在以下情况下使用 Node2Vec 聚类你想要一个测试来进一步了解你图表的质量不要在以下情况下使用 Node2Vec 聚类你需要一个不受其他因素如本例中的 Node2Vec 算法影响的度量标准什么是好图的标志一张好图的定义将取决于图的用途。在绝对意义上一张好图可以被定义为在它被设计完成的任务中表现良好的图。这听起来很模糊但它强调了测试你图表质量的一个重要观点。图表质量测试应该反映图表执行的任务。有时创建一个与最终任务 100%相关的测试是不可能的这通常是由于缺乏可用的监督数据。因此创建上述描述的其他测试可能是可行的途径。然而你应该注意当使用上述测试时没有任何测试可以被视为图表质量的最终衡量标准。一个图表可能在测试中表现良好但这可能是由于除了图表质量之外的其他原因这说明了这些测试应该相互结合使用并且也应该用来比较不同的图表。如果一个特定的图表在所有测试中都优于其他图表你可以将其解释为你的图表质量更好的积极信号尽管你应该始终带着怀疑的态度看待这些结果。最终测试是为了更好地理解图表质量但遗憾的是它们不能给出一个确定的答案。https://github.com/OpenDocCN/towardsdatascience-blog-zh-2024/raw/master/docs/img/37698d78adb4b1aa270779864adfefd1.png根据 ChatGPT 的定义一个高质量的图。“你能制作一个高质量拓扑图的图片吗”提示。ChatGPT4OpenAI2024 年 2 月 25 日。chat.openai.com.结论在本文中我向你展示了如何在网络上找到图数据集以及如果数据尚未以图格式存在你可以如何使用阈值或使用百分位数等方法将其转换为拓扑图。然后我描述了你可以通过以下测试来理解图下游任务图指标视觉检查Node2Vec 聚类最后我还提到了如何解释结果以及什么因素使一个图变得优秀。我希望你在本文中学到了一些有用的东西。如果你想了解更多关于确保嵌入质量的信息你可以阅读以下我的 Towards Data Science 文章通过理解嵌入质量来提高 AI 性能的方法你也可以阅读我在WordPress上的文章。