PyG搭建GNN实现链接回归预测

20 篇文章 35 订阅

前言

前面写了一些有关GNN的各种图任务,主要是节点分类以及链接预测:

  1. PyG搭建GCN前的准备:了解PyG中的数据格式
  2. PyG搭建GCN实现节点分类(GCNConv参数详解)
  3. PyG搭建GAT实现节点分类
  4. PyG利用MessagePassing搭建GCN实现节点分类
  5. 搭建SGC实现引文网络节点预测(PyTorch+PyG)
  6. PyG搭建R-GCN实现节点分类
  7. PyG搭建异质图注意力网络HAN实现DBLP节点分类
  8. 链接预测中训练集、验证集以及测试集的划分(以PyG的RandomLinkSplit为例)
  9. PyG搭建GCN实现链接预测
  10. PyG搭建R-GCN实现链接预测

其中链接预测主要指预测某对节点间是否存在边,是一个二分类任务,即有(1)/没有(0)边。而链接回归,顾名思义,就是预测某对节点构成的边上的某一个具体数值

数据集

链接回归可以存在于一个图中,也可以多个图同时进行训练。本文的数据集为多个图,给定部分图参与训练,然后预测指定图上所有链接上的值。

单个图如下所示:

Data(x=[3, 75], edge_index=[2, 4], edge_values=[4])

任务是预测图上所有边上的值,即edge_value

图的尺寸各不相同,为了实现批量训练,使用PyG提供的DataLoader对多个图进行批量封装:

train_loader = DataLoader(datas[:num_train], batch_size=batch_size, shuffle=True, drop_last=False)
val_loader = DataLoader(datas[num_train:num_train+num_val], batch_size=batch_size, shuffle=True, drop_last=False)
test_loader = DataLoader(datas[num_train+num_val:], batch_size=batch_size, shuffle=True, drop_last=False)

模型

搭建一个GCN实现链接回归预测:

class GCN(torch.nn.Module):
    def __init__(self, in_feats, h_feats, out_feats):
        super(GCN, self).__init__()
        self.conv1 = GCNConv(in_feats, h_feats)
        self.conv2 = GCNConv(h_feats, out_feats)
        self.fc = nn.Sequential(
            nn.Linear(2 * out_feats, out_feats),
            nn.ReLU(),
            nn.Linear(out_feats, 1)
        )

    def forward(self, data):
        x, edge_index, batch = data.x, data.edge_index, data.batch
        x = x.float()
        x = F.elu(self.conv1(x, edge_index))
        x = self.conv2(x, edge_index)
        # 
        x_src = x[edge_index[0]]
        x_dst = x[edge_index[1]]
        edge_x = torch.cat((x_src, x_dst), dim=1)
        out = self.fc(edge_x)
        out = torch.flatten(out)

        return out

可以看出,我们首先利用GCN得到了图中所有节点的嵌入表示x,然后根据x取出图中所有链接两端的节点的表示向量:

x_src = x[edge_index[0]]
x_dst = x[edge_index[1]]

然后,为了预测链接上的值,我们采用了一种最简单的方式:

edge_x = torch.cat((x_src, x_dst), dim=1)
out = self.fc(edge_x)

即将链接两端节点的向量进行拼接,然后将拼接后的向量经过一个线性层以得到链接上的预测值。

最终得到的out包含了图中所有链接上的预测值。

训练/测试

模型训练:

def train(train_loader, val_loader, test_loader, m, n):
    model = GCN().to(device)
    optimizer = torch.optim.Adam(model.parameters(), lr=0.01, weight_decay=1e-4)
    loss_function = torch.nn.MSELoss().to(device)
    scheduler = StepLR(optimizer, step_size=50, gamma=0.5)
    min_epochs = 10
    min_val_loss = 5
    best_model = None
    best_mape = 0
    model.train()
    for epoch in tqdm(range(50)):
        train_losses = []
        for tr in train_loader:
            tr = tr.to(device)
            out = model(tr)
            optimizer.zero_grad()
            loss = loss_function(out, tr.edge_values.float())
            loss.backward()
            optimizer.step()
            scheduler.step()
            train_losses.append(loss.item())
        # validation
        val_loss, test_mape, test_loader = test(model, val_loader, test_loader, m, n)
        if val_loss < min_val_loss and epoch + 1 > min_epochs:
            min_val_loss = val_loss
            best_model = copy.deepcopy(model)
            best_mape = test_mape
        print('Epoch {:03d} train_loss {:.4f} val_loss {:.4f} test mape {:.4f}'.format(epoch,
                                                                                       np.mean(train_losses),
                                                                                       val_loss, test_mape))

    print('best mape:', best_mape)
    # 反归一化
    for te in test_loader:
        t = te.edge_values.cpu().numpy()
        t = (m - n) * t + n
        te.edge_values = torch.FloatTensor(t)
        
    return best_model
  • 8
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
利用pyg库可以实现时间序列预测Pyg是一个强大的Python库,被广泛用于神经网络(graph neural networks, GNNs)的开发和研究。它提供了许多用于处理数据的功能和模型。 要使用pyg库进行时间序列预测,我们首先需要将时间序列数据转化为数据的形式。一种常见的方法是将每个时间点视为中的一个节点,并通过边连接相邻时间点的节点。然后,我们可以使用pyg库的函数和模型来处理和预测时间序列数据。 首先,我们可以使用pyg库的`torch_geometric.data.Data`类来表示数据。我们可以使用这个类来创建一个包含节点特征、边索引和边特征的对象。对于时间序列数据,我们可以将每个时间点的特征作为节点特征,并使用相邻时间点的索引作为边索引。 然后,我们可以使用pyg库的模型来预测时间序列的未来值。比如,我们可以使用卷积神经网络(graph convolutional neural network, GCN)模型。该模型可以从数据中学习节点的表示,并进行预测。我们可以使用pyg库的`torch_geometric.nn`模块来创建和训练GCN模型。 在预测过程中,我们可以根据需要选择不同的损失函数和优化器,以优化模型的性能。我们可以使用pyg库提供的损失函数和优化器,如MSE损失函数和Adam优化器。 总之,利用pyg库可以方便地处理和预测时间序列数据。通过将时间序列转化为数据的形式,并使用pyg库提供的函数和模型来处理,我们可以实现精确的时间序列预测

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Cyril_KI

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值