14、图算法助力机器学习:连接特征提取与链接预测实战

图算法助力机器学习:连接特征提取与链接预测实战

1. 机器学习与上下文的重要性

机器学习并非人工智能,而是实现人工智能的一种方法。它通过特定示例和基于预期结果的逐步改进来训练软件,无需明确编程如何实现更好的结果。训练过程需要向模型提供大量数据,使其学习如何处理和整合这些信息。

机器学习的“学习”体现在算法的迭代上,不断做出改变以接近目标,例如减少与训练数据相比的分类错误。同时,它具有动态性,在面对更多数据时能够自我修改和优化,可在使用前的多批次训练或使用过程中的在线学习中实现。

随着机器学习预测的成功、大型数据集的可获取性以及并行计算能力的提升,机器学习对于开发人工智能概率模型的人来说变得更加实用。但要记住,其根本目标是像人类一样做出选择,否则可能只是另一种高度针对性、基于规则的软件。

为了提高机器学习的准确性并使解决方案更具广泛适用性,我们需要融入大量上下文信息,就像人类在做决策时会利用上下文一样。人类利用周围的上下文,而非仅仅直接的数据点,来判断情况的关键因素、估计缺失信息以及将经验应用于新情况,上下文有助于改善预测。

2. 图、上下文与准确性

缺乏周边和相关信息时,试图预测行为或为不同情况提供建议的解决方案需要更详尽的训练和规定性规则。这就是为什么人工智能擅长特定、明确的任务,但在处理模糊情况时会遇到困难。图增强机器学习可以填补这种缺失的上下文信息,这对于做出更好的决策至关重要。

从图论和现实生活中我们知道,关系往往是行为的最强预测因素。例如,一个人投票,其朋友、家人甚至同事投票的可能性会增加。有人研究发现,报告投票的朋友会使额外 1.4% 的用户声称自己也会投票,而朋友的朋友又会增加 1.7%。小比例也可能产生重大影响,在某些案例中,相隔两跳的人比直接朋友的总体影响更大。

添加图特征和上下文可以提高预测的准确性,特别是在连接关系重要的情况下。例如,零售公司不仅使用历史数据,还使用关于客户相似性和在线行为的上下文数据来个性化产品推荐。亚马逊的 Alexa 使用多层上下文模型,提高了准确性。2018 年,亚马逊还引入了“上下文延续”,在回答新问题时纳入之前对话的参考信息。

然而,如今许多机器学习方法错过了大量丰富的上下文信息。这是因为机器学习依赖于由元组构建的输入数据,忽略了许多预测性关系和网络数据。此外,上下文信息并不总是容易获取或难以处理,传统方法在大规模查找四跳或更多跳的连接时可能会面临挑战。而使用图,我们可以更轻松地获取和整合连接数据。

3. 连接特征提取与选择

特征提取和选择有助于将原始数据转化为适合训练机器学习模型的子集和格式,这是一个基础步骤,执行得当可使机器学习产生更一致准确的预测。

  • 特征提取 :是将大量数据和属性提炼为一组代表性描述属性的方法。该过程从输入数据的独特特征或模式中得出数值(特征),以便在其他数据中区分不同类别。当数据因大小、格式或需要进行附带比较而难以被模型直接分析时,会使用特征提取。
  • 特征选择 :是确定提取的特征子集中对目标最关键或最具影响力的特征的过程。它用于凸显预测重要性并提高效率。例如,如果有 20 个特征,其中 13 个特征共同解释了 92% 的预测需求,那么可以在模型中消除 7 个特征。

选择合适的特征组合可以提高准确性,因为它从根本上影响模型的学习方式。即使是适度的改进也可能产生重大影响,因此本文重点关注连接特征。连接特征是从数据结构中提取的特征,可以通过基于节点周围图部分的局部图查询或使用图算法基于关系识别数据中预测元素的全局图查询来提取。

不仅要获得正确的特征组合,还要消除不必要的特征,以降低模型过度针对性的可能性,避免创建仅在训练数据上表现良好的模型(过拟合),并显著扩展模型的适用性。我们还可以使用图算法评估这些特征,确定对模型最具影响力的特征,例如将特征映射到图中的节点,基于相似特征创建关系,然后计算特征的中心性。

mermaid 流程图:特征提取与选择流程
graph LR
    A[原始数据] --> B[特征提取]
    B --> C[特征选择]
    C --> D[训练机器学习模型]
4. 图嵌入

图嵌入是将图中的节点和关系表示为特征向量,这些特征向量是具有维度映射的特征集合,例如 (x, y, z) 坐标。

图嵌入与连接特征提取对图数据的使用方式略有不同。它使我们能够将整个图或图数据的子集以适合机器学习任务的数值格式表示。这对于无监督学习特别有用,因为无监督学习中的数据未分类,图嵌入可以通过关系引入更多上下文信息。此外,图嵌入还可用于数据探索、计算实体之间的相似性以及降低维度以辅助统计分析。

这是一个快速发展的领域,有多种选择,包括 node2vec、struc2vec、GraphSAGE、DeepWalk 和 DeepGL。

5. 连接特征的类型及应用
  • 图特征 :包括与图的连接相关的各种指标,如节点的入度和出度、潜在三角形的数量以及共同邻居的数量。在示例中,我们从这些指标开始,因为它们易于收集,并且是早期假设的良好测试。当我们确切知道要查找的内容时,可以使用特征工程。例如,如果想知道距离四跳以内有欺诈账户的人数,这种方法使用图遍历非常有效地查找深层关系路径,考虑标签、属性、计数和推断的关系。我们还可以轻松自动化这些过程,并将这些预测性图特征纳入现有管道。例如,可以抽象出欺诈者关系的计数,并将该数字作为节点属性用于其他机器学习任务。
  • 图算法特征 :当我们知道要查找的大致结构但不确定确切模式时,可以使用图算法来查找特征。例如,某些类型的社区分组可能是欺诈的指示,我们可以使用社区检测算法提取连接特征,PageRank 等中心性算法也经常被应用。

结合多种类型的连接特征的方法似乎比单一方法更有效。例如,可以结合通过 Louvain 算法发现的社区、使用 PageRank 确定的有影响力的节点以及三跳外已知欺诈者的度量等连接特征来预测欺诈。

表格:连接特征类型及应用对比
特征类型 特点 应用场景
图特征 易于收集,与连接相关的基本指标 早期假设测试,明确查找内容时的特征工程
图算法特征 利用图算法,适用于大致结构已知但模式不确定的情况 欺诈预测等复杂场景
6. 连接特征在链接预测中的应用

链接预测是估计未来关系形成的可能性,或判断图中是否因数据不完整而缺失某些关系。由于网络是动态的且增长迅速,能够预测即将添加的链接具有广泛的应用,从产品推荐到药物重新定位,甚至推断犯罪关系。

图中的连接特征通常用于改进链接预测,使用基本的图特征以及从中心性和社区算法中提取的特征。基于节点接近度或相似性的链接预测也很常见,有研究表明,仅网络结构可能包含足够的潜在信息来检测节点接近度,并且比更直接的测量方法表现更好。

7. 工具和数据准备

为了进行链接预测的实践,我们需要设置工具和数据,并创建机器学习管道。

首先,设置本章使用的库:
- py2neo :一个与 Python 数据科学生态系统集成良好的 Neo4j Python 库。
- pandas :一个高性能的库,用于数据库之外的数据处理,具有易于使用的数据结构和数据分析工具。
- Spark MLlib :Spark 的机器学习库,这里将其作为机器学习库的示例,本章展示的方法也可与其他机器学习库(如 scikit - learn)结合使用。

在 pyspark REPL 中运行代码,可通过以下命令启动 REPL:

export SPARK_VERSION="spark-2.4.0-bin-hadoop2.7"
./${SPARK_VERSION}/bin/pyspark \
  --driver-memory 2g \
  --executor-memory 6g \
  --packages julioasotodv:spark-tree-plotting:0.2

启动后,导入以下将使用的库:

from py2neo import Graph
import pandas as pd
from numpy.random import randint
from pyspark.ml import Pipeline
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.feature import StringIndexer, VectorAssembler
from pyspark.ml.evaluation import BinaryClassificationEvaluator
from pyspark.sql.types import *
from pyspark.sql import functions as F
from sklearn.metrics import roc_curve, auc
from collections import Counter
from cycler import cycler
import matplotlib
matplotlib.use('TkAgg')
import matplotlib.pyplot as plt
8. 链接预测实践示例

我们将基于引文网络数据集进行链接预测实践。该数据集是从 DBLP、ACM 和 MAG 中提取的研究数据集,最新版本包含 3,079,007 篇论文、1,766,547 位作者、9,437,718 个作者关系和 25,166,994 个引用关系。

我们将关注以下出版物中的文章:
- 《计算机科学讲义》
- 《ACM 通讯》
- 《软件工程国际会议》
- 《计算与通信进展》

得到的数据集包含 51,956 篇论文、80,299 位作者、140,575 个作者关系和 28,706 个引用关系。我们将基于合作撰写论文的作者创建合著者图,然后预测作者对之间未来的合作关系。我们只关注之前未合作过的作者之间的合作。

后续步骤包括将数据导入 Neo4j,正确平衡数据并将样本拆分为 Spark DataFrames 进行训练和测试,解释链接预测的假设和方法,在 Spark 中创建机器学习管道,最后训练和评估各种预测模型,从基本的图特征开始,并添加使用 Neo4j 提取的更多图算法特征。

mermaid 流程图:链接预测实践流程
graph LR
    A[设置工具和数据] --> B[导入数据到 Neo4j]
    B --> C[平衡数据并拆分样本]
    C --> D[解释假设和方法]
    D --> E[创建机器学习管道]
    E --> F[训练和评估模型]

图算法助力机器学习:连接特征提取与链接预测实战

9. 数据导入与预处理

在设置好工具和导入必要的库之后,我们需要将引文网络数据集导入到 Neo4j 中。以下是具体的操作步骤:

  1. 启动 Neo4j 数据库 :确保 Neo4j 数据库已启动,并且可以通过网络访问。
  2. 使用 py2neo 连接到 Neo4j :使用以下代码连接到 Neo4j 数据库。
from py2neo import Graph
graph = Graph("bolt://localhost:7687", auth=("neo4j", "your_password"))
  1. 导入数据 :从本地文件或其他数据源读取数据,并将其导入到 Neo4j 中。在导入过程中,需要根据数据的结构创建节点和关系。例如,对于作者和论文数据,可以创建 Author Paper 节点,并使用 WROTE 关系连接它们。

在将数据导入到 Neo4j 之后,我们需要对数据进行预处理,包括平衡数据和拆分样本。

  • 平衡数据 :由于在链接预测中,正样本(存在关系)和负样本(不存在关系)的数量可能不平衡,我们需要进行数据平衡操作。可以使用随机欠采样或过采样的方法来平衡数据。
  • 拆分样本 :将数据拆分为训练集和测试集,通常按照 70:30 或 80:20 的比例进行拆分。以下是使用 Spark 进行数据拆分的示例代码:
from pyspark.sql import SparkSession
spark = SparkSession.builder.appName("LinkPrediction").getOrCreate()
data = spark.read.csv("your_data.csv", header=True, inferSchema=True)
train_data, test_data = data.randomSplit([0.7, 0.3], seed=42)
表格:数据预处理步骤及说明
步骤 说明
启动 Neo4j 数据库 确保数据库可正常访问
连接到 Neo4j 使用 py2neo 库建立连接
导入数据 根据数据结构创建节点和关系
平衡数据 处理正样本和负样本数量不平衡问题
拆分样本 将数据拆分为训练集和测试集
10. 链接预测的假设和方法

在进行链接预测之前,我们需要明确假设和方法。

  • 假设 :我们假设作者之间的合作关系受到多种因素的影响,包括共同的研究领域、引用关系、社交网络等。通过提取这些因素的特征,我们可以预测作者之间未来的合作可能性。
  • 方法 :我们将使用机器学习模型进行链接预测,包括随机森林分类器。在训练模型之前,我们需要提取连接特征,包括图特征和图算法特征。
11. 创建机器学习管道

在 Spark 中,我们可以使用 Pipeline 来创建机器学习管道。以下是创建管道的步骤:

  1. 特征索引 :使用 StringIndexer 对分类特征进行索引。
  2. 特征组装 :使用 VectorAssembler 将所有特征组装成一个向量。
  3. 模型选择 :选择合适的机器学习模型,例如随机森林分类器。
  4. 创建管道 :将上述步骤组合成一个管道。

以下是创建机器学习管道的示例代码:

from pyspark.ml import Pipeline
from pyspark.ml.classification import RandomForestClassifier
from pyspark.ml.feature import StringIndexer, VectorAssembler

# 特征索引
indexers = [StringIndexer(inputCol=col, outputCol=col + "_index") for col in categorical_cols]
# 特征组装
assembler = VectorAssembler(inputCols=[col + "_index" for col in categorical_cols] + numerical_cols, outputCol="features")
# 模型选择
rf = RandomForestClassifier(labelCol="label", featuresCol="features")
# 创建管道
pipeline = Pipeline(stages=indexers + [assembler, rf])
mermaid 流程图:机器学习管道创建流程
graph LR
    A[特征索引] --> B[特征组装]
    B --> C[模型选择]
    C --> D[创建管道]
12. 训练和评估模型

在创建好机器学习管道之后,我们可以使用训练集对模型进行训练,并使用测试集对模型进行评估。

  • 训练模型 :使用 pipeline.fit() 方法对模型进行训练。
model = pipeline.fit(train_data)
  • 评估模型 :使用 BinaryClassificationEvaluator 对模型进行评估,计算模型的准确率、召回率、F1 值等指标。
from pyspark.ml.evaluation import BinaryClassificationEvaluator

predictions = model.transform(test_data)
evaluator = BinaryClassificationEvaluator(labelCol="label", rawPredictionCol="rawPrediction")
accuracy = evaluator.evaluate(predictions)
print("Accuracy: ", accuracy)
表格:模型评估指标及说明
指标 说明
准确率 模型预测正确的样本占总样本的比例
召回率 模型正确预测为正样本的数量占实际正样本数量的比例
F1 值 综合考虑准确率和召回率的指标
13. 结果分析与优化

在完成模型训练和评估之后,我们需要对结果进行分析,并根据分析结果对模型进行优化。

  • 特征重要性分析 :使用随机森林分类器的 featureImportances 属性分析各个特征的重要性。根据特征重要性,我们可以选择保留重要的特征,去除不重要的特征,以提高模型的性能。
import pandas as pd

feature_importances = pd.DataFrame(model.stages[-1].featureImportances.toArray(), index=assembler.getInputCols(), columns=["importance"])
feature_importances.sort_values(by="importance", ascending=False, inplace=True)
print(feature_importances)
  • 模型调优 :使用网格搜索或随机搜索等方法对模型的超参数进行调优,以找到最优的超参数组合。例如,对于随机森林分类器,可以调整树的数量、树的深度等超参数。
14. 总结

通过本文的实践,我们展示了如何使用图算法来增强机器学习的链接预测能力。我们从机器学习与上下文的重要性出发,介绍了图、上下文与准确性的关系,以及连接特征提取与选择的方法。通过图嵌入和不同类型的连接特征,我们能够更好地利用图数据中的上下文信息,提高链接预测的准确性。

在实践部分,我们基于引文网络数据集进行了链接预测的实验,包括数据导入、预处理、模型训练和评估等步骤。通过创建机器学习管道和使用随机森林分类器,我们能够有效地预测作者之间未来的合作关系。最后,我们对结果进行了分析和优化,以提高模型的性能。

图算法在机器学习中的应用具有广阔的前景,可以应用于各种领域,如社交网络分析、推荐系统、欺诈检测等。通过不断探索和实践,我们可以进一步挖掘图数据的潜力,提高机器学习的性能和准确性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值