将GFQL与PyGraphistry加载器、机器学习、人工智能和可视化结合#

常见的图可视化任务#

有关可视化技术的介绍,请参阅10 Minutes to Graphistry Visualization

简单绘图#

目标: 使用 .plot() 方法快速可视化图表。

代码

g2 = g1.chain(gfql_query)
g2.plot()

解释:

这将使用graphistry.PlotterBase.PlotterBase.plot()方法创建一个交互式的GFQL结果图形可视化。

常见的数据加载和整理任务#

我们将涵盖与图结构的数据加载和整形相关的一系列常见任务:

使用Pandas从CSV加载数据#

目标: 演示如何使用pandas从CSV文件加载数据并将其转换为图结构。

代码

import pandas as pd
import graphistry

# pd.DataFrame[['src', 'dst', ...]]
df = pd.read_csv('data.csv')

# g._edges: df[['src', 'dst', ...]]
g = graphistry.edges(df, 'src', 'dst')

解释:

此示例说明了如何使用pandas从CSV文件加载数据,并通过graphistry.PlotterBase.PlotterBase.edges()将其绑定到图结构中以便使用GFQL。有关使用pandas的更多信息,请参阅官方pandas文档

使用cuDF从Parquet加载GPU数据#

目标:演示如何使用GPU加速的cuDF从Parquet文件加载数据并将其转换为图结构。

代码

import cudf
import graphistry

# cudf.DataFrame[['src', 'dst', ...]]
df = cudf.read_parquet('data.parquet')

# g._edges: df[['src', 'dst', ...]]
g = graphistry.edges(df, 'src', 'dst')

解释:

此示例展示了如何使用cuDF从Parquet文件加载数据,并使用GFQL将其转换为图结构。有关使用cuDF的更多详细信息,请参阅官方cuDF文档。

绑定节点和边#

目标: 展示当.edges().nodes()都可用时,如何将加载的数据转换为图结构。

代码

# pd.DataFrame[['n_id', ...]]
df1 = pd.read_csv('nodes.csv')

# pd.DataFrame[['src', 'dst', ...]]
df2 = pd.read_csv('edges.csv')

# g._edges: df2[['src', 'dst', ...]]
# g._nodes: df1[['n_id', ...]] <-- optional
g = graphistry.edges(df2, 'src', 'dst').nodes(df1, 'n_id')

解释:

此示例演示了如何使用GFQL绑定节点和边的图形数据。graphistry.PlotterBase.PlotterBase.edges()方法用于加载边数据。绑定节点数据是可选的,通过方法graphistry.PlotterBase.PlotterBase.nodes实现。

使用超图处理多节点列#

目标:讨论如何使用默认的direct=False参数,通过超图从表示节点的多列行中创建图。

代码

g = graphistry.hypergraph(df, entity_cols=['a', 'b', 'c'])['graph']
# g._node == 'nodeID'
# g._nodes: df[['nodeTitle', 'type', 'category', 'nodeID', 'a', 'b', 'c', 'd', 'e', 'EventID']]
# g._source == 'attribID'
# g._destination == 'EventID'
# g._nodes.type.unique() == ['a', 'b', 'c', 'EventID']
# g._edges: df[['EventID', 'attribID', 'a', 'd', 'e', 'c', 'edgeType']]

解释:

本示例解释了如何使用默认的direct=False参数将图数据转换为超图格式。在这种情况下,列abc中的所有值都成为节点。此外,由于direct=False,每一行也成为一个节点,并与其在列abc中的对应值相连。当direct=True时,列abc的节点将直接连接。有关更多变体和高级用法,请参阅graphistry.PlotterBase.PlotterBase.hypergraph()

常见的图机器学习和图人工智能任务#

我们将介绍一系列与图机器学习和AI相关的常见任务,您可以在GFQL结果上执行这些任务:

UMAP聚类与降维用于嵌入和相似图#

目标: 展示如何应用UMAP进行降维,将宽数据转换为用于聚类、嵌入和相似性图的数据。

代码

df = pd.DataFrame({
    'a': [0, 1, 2, 3, 4],
    'b': [10, 20, 30, 40, 50],
    'c': [100, 200, 300, 400, 500]
})
g = graphistry.nodes(df).umap()  # Automatically featurizes & embeds into X, Y space
g.plot()

assert set(g._nodes.columns) == {'_n', 'a', 'b', 'c', 'x', 'y'}
assert set(g._edges.columns) == {'_src_implicit', '_dst_implicit', '_weight'}
assert isinstance(g._node_features, (pd.DataFrame, cudf.DataFrame))

解释:

此示例演示了如何利用graphistry.umap_utils.UMAPMixin.umap()。请参阅其参考文档以了解许多可选的覆盖和使用模式,例如定义X=['col1', 'col2', …]以指定要聚类的列。

UMAP 拟合/变换用于缩放#

目标: 解释如何使用UMAP的fit/transform功能来跨数据集缩放特征。

代码

# Train: Feature columns X and label column y are optional
g1 = graphistry.nodes(df_sample).umap(X=['col_1', ..., 'col_n'], y='col_m')

# Transform new data under initial UMAP embedding
g2 = g1.transform_umap(batch_df, return_graph=True)

# Visualize new data under initial UMAP embedding
g2.plot()

解释:

此示例说明了如何在一个数据集上拟合UMAP模型,然后使用该模型转换另一个数据集,从而实现特征的一致缩放。有关使用UMAP的fit/transform的更多详细信息,请参阅graphistry.umap_utils.UMAPMixin.umap()文档。

使用RGCN图神经网络进行异常检测#

目标: 介绍RGCN的基本概念以及如何构建和训练一个简单的图模型。

代码

# df: df[['src_ip', 'dst_ip', 'o1', 'dst_port', ...]]

g = graphistry.edges(df, 'src_ip', 'dst_ip')  # graph
g2 = g.embed(  # rerun until happy with quality
    device=dev0,

    #relation='dst_port', # always 22, so runs as a GCN instead of RGCN
    relation='o1', # split by sw type

    #==== OPTIONAL: NODE FEATURES ====
    #requires node feature data, ex: g = graphistry.nodes(nodes_df, node_id_col).edges(..
    #use_feat=True
    #X=[g._node] + good_feats_col_names,
    #cardinality_threshold=len(g._edges)+1, #optional: avoid topic modeling on high-cardinality cols
    #min_words=len(g._edges)+1, #optional: avoid topic modeling on high-cardinality cols

    epochs=10
)

def to_cpu(tensor, is_gpu=True):
    return tensor.cpu() if is_gpu else tensor

score2 = pd.Series(to_cpu(g2._score(g2._triplets)).numpy())

# df[['score', 'is_low_score', ...]]
df.assign(
    score=score2,
    is_low_score=(score2 < (score2.mean() - 2 * score2.std()))
)

解释:

本示例介绍了如何使用graphistry.embed_utils.HeterographEmbedModuleMixin.embed()构建和训练一个基本的关系图卷积网络(RGCN)。有关此示例的更多信息,请参阅SSH日志RGCN演示笔记本

使用DBSCAN进行聚类标注#

目标: 讨论使用DBSCAN基于特征对节点或边进行聚类。

代码

g2 = g1.umap().dbscan(eps=0.5, min_samples=5)  # Apply DBSCAN clustering
print('labels: ', g2._nodes['_dbscan'])

解释:

此示例说明了如何使用graphistry.compute.cluster.ClusterMixin.dbscan()在通过UMAP降维后对图数据进行标签。

自动化特征生成#

目标: 说明如何从原始数据生成特征以供AI应用使用。

代码

g = graphistry.nodes(df).featurize(kind='nodes', X=['raw_feature_1', 'raw_feature_2'])

解释:

此示例演示了如何从GFQL查询返回的原始数据自动生成特征,以便与ML和AI一起使用,使用graphistry.feature_utils.FeatureMixin.featurize()方法。参数feature_engine= (graphistry.feature_utils.FeatureEngine)选择特征生成引擎。

图中的语义搜索#

目标: 使用图嵌入和自然语言查询实现语义搜索。

代码

 g2 = g1.featurize(
    X = ['text_col_1', .., 'text_col_n'],
    kind='nodes',
    model_name = "paraphrase-MiniLM-L6-v2")

results_df, query_vector = g2.search('my natural language query => df hits', ...)

g3 = g2.search_graph('my natural language query => graph', ...)
g3.plot()

解释:

此示例展示了如何使用嵌入在图数据中执行语义搜索。有关实现语义搜索的更多详细信息,请参阅我们文档中的语义搜索部分。

知识图谱嵌入#

目标: 解释知识图谱嵌入的训练模型和预测关系。

代码

g2 = g1.embed(relation='relationship_column_of_interest')

g3 = g2.predict_links_all(threshold=0.95)  # score high confidence predicted edges
g3.plot()

# Score over any set of entities and/or relations.
g4 = g2.predict_links(
  source=['entity_k'],
  relation=['relationship_1', 'relationship_4', ..],
  destination=['entity_l', 'entity_m', ..],
  threshold=0.9,  # score threshold
  return_dataframe=False)  # return graph vs _edges df

解释:

本示例描述了如何使用GFQL训练知识图谱嵌入模型,以及如何预测实体之间的关系。展示了如何使用graphistry.embed_utils.HeterographEmbedModuleMixin.embed()graphistry.embed_utils.HeterographEmbedModuleMixin.predict_links_all()graphistry.embed_utils.HeterographEmbedModuleMixin.predict_links()