{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Link prediction with GCN" ] }, { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden", "tags": [ "CloudRunner" ] }, "source": [ "
Run the latest release of this notebook:
" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "In this example, we use our implementation of the [GCN](https://arxiv.org/abs/1609.02907) algorithm to build a model that predicts citation links in the Cora dataset (see below). The problem is treated as a supervised link prediction problem on a homogeneous citation network with nodes representing papers (with attributes such as binary keyword indicators and categorical subject) and links corresponding to paper-paper citations. \n", "\n", "To address this problem, we build a model with the following architecture. First we build a two-layer GCN model that takes labeled node pairs (`citing-paper` -> `cited-paper`) corresponding to possible citation links, and outputs a pair of node embeddings for the `citing-paper` and `cited-paper` nodes of the pair. These embeddings are then fed into a link classification layer, which first applies a binary operator to those node embeddings (e.g., concatenating them) to construct the embedding of the potential link. Thus obtained link embeddings are passed through the dense link classification layer to obtain link predictions - probability for these candidate links to actually exist in the network. The entire model is trained end-to-end by minimizing the loss function of choice (e.g., binary cross-entropy between predicted link probabilities and true link labels, with true/false citation links having labels 1/0) using stochastic gradient descent (SGD) updates of the model parameters, with minibatches of 'training' links fed into the model." ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "nbsphinx": "hidden", "tags": [ "CloudRunner" ] }, "outputs": [], "source": [ "# install StellarGraph if running on Google Colab\n", "import sys\n", "if 'google.colab' in sys.modules:\n", " %pip install -q stellargraph[demos]==1.2.1" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "nbsphinx": "hidden", "tags": [ "VersionCheck" ] }, "outputs": [], "source": [ "# verify that we're using the correct version of StellarGraph for this notebook\n", "import stellargraph as sg\n", "\n", "try:\n", " sg.utils.validate_notebook_version(\"1.2.1\")\n", "except AttributeError:\n", " raise ValueError(\n", " f\"This notebook requires StellarGraph version 1.2.1, but a different version {sg.__version__} is installed. Please see .\"\n", " ) from None" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "import stellargraph as sg\n", "from stellargraph.data import EdgeSplitter\n", "from stellargraph.mapper import FullBatchLinkGenerator\n", "from stellargraph.layer import GCN, LinkEmbedding\n", "\n", "\n", "from tensorflow import keras\n", "from sklearn import preprocessing, feature_extraction, model_selection\n", "\n", "from stellargraph import globalvar\n", "from stellargraph import datasets\n", "from IPython.display import display, HTML\n", "%matplotlib inline" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Loading the CORA network data" ] }, { "cell_type": "markdown", "metadata": { "tags": [ "DataLoadingLinks" ] }, "source": [ "(See [the \"Loading from Pandas\" demo](../basics/loading-pandas.ipynb) for details on how data can be loaded.)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "tags": [ "DataLoading" ] }, "outputs": [ { "data": { "text/html": [ "The Cora dataset consists of 2708 scientific publications classified into one of seven classes. The citation network consists of 5429 links. Each publication in the dataset is described by a 0/1-valued word vector indicating the absence/presence of the corresponding word from the dictionary. The dictionary consists of 1433 unique words." ], "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "dataset = datasets.Cora()\n", "display(HTML(dataset.description))\n", "G, _ = dataset.load(subject_as_feature=True)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "StellarGraph: Undirected multigraph\n", " Nodes: 2708, Edges: 5429\n", "\n", " Node types:\n", " paper: [2708]\n", " Features: float32 vector, length 1440\n", " Edge types: paper-cites->paper\n", "\n", " Edge types:\n", " paper-cites->paper: [5429]\n" ] } ], "source": [ "print(G.info())" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We aim to train a link prediction model, hence we need to prepare the train and test sets of links and the corresponding graphs with those links removed.\n", "\n", "We are going to split our input graph into a train and test graphs using the EdgeSplitter class in `stellargraph.data`. We will use the train graph for training the model (a binary classifier that, given two nodes, predicts whether a link between these two nodes should exist or not) and the test graph for evaluating the model's performance on hold out data.\n", "Each of these graphs will have the same number of nodes as the input graph, but the number of links will differ (be reduced) as some of the links will be removed during each split and used as the positive samples for training/testing the link prediction classifier." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "From the original graph G, extract a randomly sampled subset of test edges (true and false citation links) and the reduced graph G_test with the positive test edges removed:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "** Sampled 542 positive and 542 negative edges. **\n" ] } ], "source": [ "# Define an edge splitter on the original graph G:\n", "edge_splitter_test = EdgeSplitter(G)\n", "\n", "# Randomly sample a fraction p=0.1 of all positive links, and same number of negative links, from G, and obtain the\n", "# reduced graph G_test with the sampled links removed:\n", "G_test, edge_ids_test, edge_labels_test = edge_splitter_test.train_test_split(\n", " p=0.1, method=\"global\", keep_connected=True\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The reduced graph G_test, together with the test ground truth set of links (edge_ids_test, edge_labels_test), will be used for testing the model.\n", "\n", "Now repeat this procedure to obtain the training data for the model. From the reduced graph G_test, extract a randomly sampled subset of train edges (true and false citation links) and the reduced graph G_train with the positive train edges removed:" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "** Sampled 488 positive and 488 negative edges. **\n" ] } ], "source": [ "# Define an edge splitter on the reduced graph G_test:\n", "edge_splitter_train = EdgeSplitter(G_test)\n", "\n", "# Randomly sample a fraction p=0.1 of all positive links, and same number of negative links, from G_test, and obtain the\n", "# reduced graph G_train with the sampled links removed:\n", "G_train, edge_ids_train, edge_labels_train = edge_splitter_train.train_test_split(\n", " p=0.1, method=\"global\", keep_connected=True\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "G_train, together with the train ground truth set of links (edge_ids_train, edge_labels_train), will be used for training the model." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating the GCN link model" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Next, we create the link generators for the train and test link examples to the model. The link generators take the pairs of nodes (`citing-paper`, `cited-paper`) that are given in the `.flow` method to the Keras model, together with the corresponding binary labels indicating whether those pairs represent true or false links.\n", "\n", "The number of epochs for training the model:" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "epochs = 50" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "For training we create a generator on the `G_train` graph, and make an iterator over the training links using the generator's `flow()` method:" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using GCN (local pooling) filters...\n" ] } ], "source": [ "train_gen = FullBatchLinkGenerator(G_train, method=\"gcn\")\n", "train_flow = train_gen.flow(edge_ids_train, edge_labels_train)" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Using GCN (local pooling) filters...\n" ] } ], "source": [ "test_gen = FullBatchLinkGenerator(G_test, method=\"gcn\")\n", "test_flow = train_gen.flow(edge_ids_test, edge_labels_test)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now we can specify our machine learning model, we need a few more parameters for this:\n", "\n", " * the `layer_sizes` is a list of hidden feature sizes of each layer in the model. In this example we use two GCN layers with 16-dimensional hidden node features at each layer.\n", " * `activations` is a list of activations applied to each layer's output\n", " * `dropout=0.3` specifies a 30% dropout at each layer. " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We create a GCN model as follows:" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "gcn = GCN(\n", " layer_sizes=[16, 16], activations=[\"relu\", \"relu\"], generator=train_gen, dropout=0.3\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "To create a Keras model we now expose the input and output tensors of the GCN model for link prediction, via the `GCN.in_out_tensors` method:" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "x_inp, x_out = gcn.in_out_tensors()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Final link classification layer that takes a pair of node embeddings produced by the GCN model, applies a binary operator to them to produce the corresponding link embedding (`ip` for inner product; other options for the binary operator can be seen by running a cell with `?LinkEmbedding` in it), and passes it through a dense layer:" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [], "source": [ "prediction = LinkEmbedding(activation=\"relu\", method=\"ip\")(x_out)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "The predictions need to be reshaped from `(X, 1)` to `(X,)` to match the shape of the targets we have supplied above." ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "prediction = keras.layers.Reshape((-1,))(prediction)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Stack the GCN and prediction layers into a Keras model, and specify the loss" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [], "source": [ "model = keras.Model(inputs=x_inp, outputs=prediction)\n", "\n", "model.compile(\n", " optimizer=keras.optimizers.Adam(lr=0.01),\n", " loss=keras.losses.binary_crossentropy,\n", " metrics=[\"acc\"],\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Evaluate the initial (untrained) model on the train and test set:" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ['...']\n", "1/1 [==============================] - 0s 121ms/step - loss: 1.8927 - acc: 0.5000\n", " ['...']\n", "1/1 [==============================] - 0s 9ms/step - loss: 1.8621 - acc: 0.5000\n", "\n", "Train Set Metrics of the initial (untrained) model:\n", "\tloss: 1.8927\n", "\tacc: 0.5000\n", "\n", "Test Set Metrics of the initial (untrained) model:\n", "\tloss: 1.8621\n", "\tacc: 0.5000\n" ] } ], "source": [ "init_train_metrics = model.evaluate(train_flow)\n", "init_test_metrics = model.evaluate(test_flow)\n", "\n", "print(\"\\nTrain Set Metrics of the initial (untrained) model:\")\n", "for name, val in zip(model.metrics_names, init_train_metrics):\n", " print(\"\\t{}: {:0.4f}\".format(name, val))\n", "\n", "print(\"\\nTest Set Metrics of the initial (untrained) model:\")\n", "for name, val in zip(model.metrics_names, init_test_metrics):\n", " print(\"\\t{}: {:0.4f}\".format(name, val))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Train the model:" ] }, { "cell_type": "code", "execution_count": 17, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ['...']\n", " ['...']\n", "Train for 1 steps, validate for 1 steps\n", "Epoch 1/50\n", "1/1 - 1s - loss: 1.7886 - acc: 0.5000 - val_loss: 1.5024 - val_acc: 0.5387\n", "Epoch 2/50\n", "1/1 - 0s - loss: 1.7260 - acc: 0.5400 - val_loss: 0.6822 - val_acc: 0.6070\n", "Epoch 3/50\n", "1/1 - 0s - loss: 0.8526 - acc: 0.5953 - val_loss: 0.7401 - val_acc: 0.5729\n", "Epoch 4/50\n", "1/1 - 0s - loss: 0.7397 - acc: 0.5666 - val_loss: 0.7479 - val_acc: 0.5849\n", "Epoch 5/50\n", "1/1 - 0s - loss: 0.7334 - acc: 0.5799 - val_loss: 0.6777 - val_acc: 0.6172\n", "Epoch 6/50\n", "1/1 - 0s - loss: 0.6413 - acc: 0.6404 - val_loss: 0.6981 - val_acc: 0.6375\n", "Epoch 7/50\n", "1/1 - 0s - loss: 0.7289 - acc: 0.6568 - val_loss: 0.6576 - val_acc: 0.6448\n", "Epoch 8/50\n", "1/1 - 0s - loss: 0.6367 - acc: 0.6568 - val_loss: 0.6846 - val_acc: 0.6338\n", "Epoch 9/50\n", "1/1 - 0s - loss: 0.6111 - acc: 0.6639 - val_loss: 0.6850 - val_acc: 0.6384\n", "Epoch 10/50\n", "1/1 - 0s - loss: 0.5818 - acc: 0.6855 - val_loss: 0.6667 - val_acc: 0.6513\n", "Epoch 11/50\n", "1/1 - 0s - loss: 0.5721 - acc: 0.6916 - val_loss: 0.6304 - val_acc: 0.6688\n", "Epoch 12/50\n", "1/1 - 0s - loss: 0.5422 - acc: 0.7551 - val_loss: 0.6461 - val_acc: 0.7048\n", "Epoch 13/50\n", "1/1 - 0s - loss: 0.5791 - acc: 0.7695 - val_loss: 0.6710 - val_acc: 0.7002\n", "Epoch 14/50\n", "1/1 - 0s - loss: 0.4987 - acc: 0.7838 - val_loss: 0.6632 - val_acc: 0.7131\n", "Epoch 15/50\n", "1/1 - 0s - loss: 0.5537 - acc: 0.7920 - val_loss: 0.7022 - val_acc: 0.7168\n", "Epoch 16/50\n", "1/1 - 0s - loss: 0.5463 - acc: 0.7807 - val_loss: 0.7353 - val_acc: 0.7251\n", "Epoch 17/50\n", "1/1 - 0s - loss: 0.5315 - acc: 0.7910 - val_loss: 0.7022 - val_acc: 0.7223\n", "Epoch 18/50\n", "1/1 - 0s - loss: 0.4832 - acc: 0.7930 - val_loss: 0.6777 - val_acc: 0.7251\n", "Epoch 19/50\n", "1/1 - 0s - loss: 0.4477 - acc: 0.8105 - val_loss: 0.6668 - val_acc: 0.7242\n", "Epoch 20/50\n", "1/1 - 0s - loss: 0.4439 - acc: 0.7971 - val_loss: 0.6176 - val_acc: 0.7196\n", "Epoch 21/50\n", "1/1 - 0s - loss: 0.3993 - acc: 0.8309 - val_loss: 0.6136 - val_acc: 0.7196\n", "Epoch 22/50\n", "1/1 - 0s - loss: 0.3830 - acc: 0.8248 - val_loss: 0.6248 - val_acc: 0.7196\n", "Epoch 23/50\n", "1/1 - 0s - loss: 0.4062 - acc: 0.8473 - val_loss: 0.6505 - val_acc: 0.7205\n", "Epoch 24/50\n", "1/1 - 0s - loss: 0.4259 - acc: 0.8504 - val_loss: 0.6313 - val_acc: 0.7232\n", "Epoch 25/50\n", "1/1 - 0s - loss: 0.3858 - acc: 0.8504 - val_loss: 0.6221 - val_acc: 0.7232\n", "Epoch 26/50\n", "1/1 - 0s - loss: 0.3439 - acc: 0.8596 - val_loss: 0.6356 - val_acc: 0.7196\n", "Epoch 27/50\n", "1/1 - 0s - loss: 0.3333 - acc: 0.8709 - val_loss: 0.6512 - val_acc: 0.7205\n", "Epoch 28/50\n", "1/1 - 0s - loss: 0.3255 - acc: 0.8760 - val_loss: 0.6791 - val_acc: 0.7232\n", "Epoch 29/50\n", "1/1 - 0s - loss: 0.3593 - acc: 0.8791 - val_loss: 0.7117 - val_acc: 0.7214\n", "Epoch 30/50\n", "1/1 - 0s - loss: 0.3251 - acc: 0.8873 - val_loss: 0.7323 - val_acc: 0.7242\n", "Epoch 31/50\n", "1/1 - 0s - loss: 0.3256 - acc: 0.8770 - val_loss: 0.7427 - val_acc: 0.7288\n", "Epoch 32/50\n", "1/1 - 0s - loss: 0.3088 - acc: 0.9037 - val_loss: 0.7509 - val_acc: 0.7297\n", "Epoch 33/50\n", "1/1 - 0s - loss: 0.3048 - acc: 0.8934 - val_loss: 0.7523 - val_acc: 0.7371\n", "Epoch 34/50\n", "1/1 - 0s - loss: 0.2989 - acc: 0.8996 - val_loss: 0.7425 - val_acc: 0.7380\n", "Epoch 35/50\n", "1/1 - 0s - loss: 0.2847 - acc: 0.9047 - val_loss: 0.7396 - val_acc: 0.7362\n", "Epoch 36/50\n", "1/1 - 0s - loss: 0.2645 - acc: 0.9016 - val_loss: 0.7313 - val_acc: 0.7380\n", "Epoch 37/50\n", "1/1 - 0s - loss: 0.2811 - acc: 0.8975 - val_loss: 0.7350 - val_acc: 0.7362\n", "Epoch 38/50\n", "1/1 - 0s - loss: 0.2720 - acc: 0.9078 - val_loss: 0.6788 - val_acc: 0.7389\n", "Epoch 39/50\n", "1/1 - 0s - loss: 0.2603 - acc: 0.8986 - val_loss: 0.6679 - val_acc: 0.7371\n", "Epoch 40/50\n", "1/1 - 0s - loss: 0.2580 - acc: 0.9047 - val_loss: 0.6692 - val_acc: 0.7408\n", "Epoch 41/50\n", "1/1 - 0s - loss: 0.2809 - acc: 0.8955 - val_loss: 0.6916 - val_acc: 0.7408\n", "Epoch 42/50\n", "1/1 - 0s - loss: 0.2540 - acc: 0.9016 - val_loss: 0.7552 - val_acc: 0.7435\n", "Epoch 43/50\n", "1/1 - 0s - loss: 0.2629 - acc: 0.9139 - val_loss: 0.8007 - val_acc: 0.7445\n", "Epoch 44/50\n", "1/1 - 0s - loss: 0.2614 - acc: 0.9273 - val_loss: 0.8633 - val_acc: 0.7445\n", "Epoch 45/50\n", "1/1 - 0s - loss: 0.2316 - acc: 0.9057 - val_loss: 0.8980 - val_acc: 0.7500\n", "Epoch 46/50\n", "1/1 - 0s - loss: 0.2204 - acc: 0.9242 - val_loss: 0.9062 - val_acc: 0.7472\n", "Epoch 47/50\n", "1/1 - 0s - loss: 0.2326 - acc: 0.9160 - val_loss: 0.9067 - val_acc: 0.7537\n", "Epoch 48/50\n", "1/1 - 0s - loss: 0.2358 - acc: 0.9334 - val_loss: 0.8805 - val_acc: 0.7601\n", "Epoch 49/50\n", "1/1 - 0s - loss: 0.2196 - acc: 0.9211 - val_loss: 0.8471 - val_acc: 0.7592\n", "Epoch 50/50\n", "1/1 - 0s - loss: 0.2102 - acc: 0.9221 - val_loss: 0.8198 - val_acc: 0.7620\n" ] } ], "source": [ "history = model.fit(\n", " train_flow, epochs=epochs, validation_data=test_flow, verbose=2, shuffle=False\n", ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Plot the training history:" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "sg.utils.plot_history(history)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Evaluate the trained model on test citation links:" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " ['...']\n", "1/1 [==============================] - 0s 9ms/step - loss: 0.1409 - acc: 0.9641\n", " ['...']\n", "1/1 [==============================] - 0s 9ms/step - loss: 0.8198 - acc: 0.7620\n", "\n", "Train Set Metrics of the trained model:\n", "\tloss: 0.1409\n", "\tacc: 0.9641\n", "\n", "Test Set Metrics of the trained model:\n", "\tloss: 0.8198\n", "\tacc: 0.7620\n" ] } ], "source": [ "train_metrics = model.evaluate(train_flow)\n", "test_metrics = model.evaluate(test_flow)\n", "\n", "print(\"\\nTrain Set Metrics of the trained model:\")\n", "for name, val in zip(model.metrics_names, train_metrics):\n", " print(\"\\t{}: {:0.4f}\".format(name, val))\n", "\n", "print(\"\\nTest Set Metrics of the trained model:\")\n", "for name, val in zip(model.metrics_names, test_metrics):\n", " print(\"\\t{}: {:0.4f}\".format(name, val))" ] }, { "cell_type": "markdown", "metadata": { "nbsphinx": "hidden", "tags": [ "CloudRunner" ] }, "source": [ "
Run the latest release of this notebook:
" ] } ], "metadata": { "file_extension": ".py", "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.9" }, "mimetype": "text/x-python", "name": "python", "npconvert_exporter": "python", "pygments_lexer": "ipython3", "version": 3 }, "nbformat": 4, "nbformat_minor": 4 }