stellargraph/stellargraph

View on GitHub
demos/node-classification/rgcn-node-classification.ipynb

Summary

Maintainability
Test Coverage
{
 "cells": [
  {
   "cell_type": "markdown",
   "id": "0",
   "metadata": {},
   "source": [
    "# Node classification with Relational Graph Convolutional Network (RGCN)\n"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "1",
   "metadata": {
    "nbsphinx": "hidden",
    "tags": [
     "CloudRunner"
    ]
   },
   "source": [
    "<table><tr><td>Run the latest release of this notebook:</td><td><a href=\"https://mybinder.org/v2/gh/stellargraph/stellargraph/master?urlpath=lab/tree/demos/node-classification/rgcn-node-classification.ipynb\" alt=\"Open In Binder\" target=\"_parent\"><img src=\"https://mybinder.org/badge_logo.svg\"/></a></td><td><a href=\"https://colab.research.google.com/github/stellargraph/stellargraph/blob/master/demos/node-classification/rgcn-node-classification.ipynb\" alt=\"Open In Colab\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\"/></a></td></tr></table>"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "2",
   "metadata": {},
   "source": [
    "This example demonstrates how use an RGCN [1] on the AIFB dataset with stellargraph. \n",
    "\n",
    "[1] Modeling Relational Data with Graph Convolutional Networks. Thomas N. Kipf, Michael Schlichtkrull (2017). https://arxiv.org/pdf/1703.06103.pdf"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "3",
   "metadata": {},
   "source": [
    "First we load the required libraries."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "4",
   "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.3.0b"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "5",
   "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.3.0b\")\n",
    "except AttributeError:\n",
    "    raise ValueError(\n",
    "        f\"This notebook requires StellarGraph version 1.3.0b, but a different version {sg.__version__} is installed.  Please see <https://github.com/stellargraph/stellargraph/issues/1172>.\"\n",
    "    ) from None"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "6",
   "metadata": {},
   "outputs": [],
   "source": [
    "from rdflib.extras.external_graph_libs import *\n",
    "from rdflib import Graph, URIRef, Literal\n",
    "\n",
    "import networkx as nx\n",
    "from networkx.classes.function import info\n",
    "\n",
    "import stellargraph as sg\n",
    "from stellargraph.mapper import RelationalFullBatchNodeGenerator\n",
    "from stellargraph.layer import RGCN\n",
    "\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import os\n",
    "import pandas as pd\n",
    "\n",
    "import tensorflow as tf\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras.layers import Dense\n",
    "from tensorflow.keras.models import Model\n",
    "\n",
    "import sklearn\n",
    "from sklearn import model_selection\n",
    "from collections import Counter\n",
    "from stellargraph import datasets\n",
    "from IPython.display import display, HTML\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "7",
   "metadata": {},
   "source": [
    "## Loading the data"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "8",
   "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,
   "id": "9",
   "metadata": {
    "tags": [
     "DataLoading"
    ]
   },
   "outputs": [
    {
     "data": {
      "text/html": [
       "The AIFB dataset describes the AIFB research institute in terms of its staff, research group, and publications. First used for machine learning with RDF in Bloehdorn, Stephan and Sure, York, \"Kernel Methods for Mining Instance Data in Ontologies\", The Semantic Web (2008), http://dx.doi.org/10.1007/978-3-540-76298-0_5. It contains ~8k entities, ~29k edges, and 45 different relationships or edge types. In (Bloehdorn et al 2007) the dataset was first used to predict the affiliation (i.e., research group) for people in the dataset. The dataset contains 178 members of a research group with 5 different research groups. The goal is to predict which research group a researcher belongs to."
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "dataset = datasets.AIFB()\n",
    "display(HTML(dataset.description))\n",
    "G, affiliation = dataset.load()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "10",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "StellarDiGraph: Directed multigraph\n",
      " Nodes: 8285, Edges: 29043\n",
      "\n",
      " Node types:\n",
      "  default: [8285]\n",
      "    Features: float32 vector, length 8285\n",
      "    Edge types: default-http://swrc.ontoware.org/ontology#abstract->default, default-http://swrc.ontoware.org/ontology#address->default, default-http://swrc.ontoware.org/ontology#author->default, default-http://swrc.ontoware.org/ontology#booktitle->default, default-http://swrc.ontoware.org/ontology#carriedOutBy->default, ... (40 more)\n",
      "\n",
      " Edge types:\n",
      "    default-http://swrc.ontoware.org/ontology#publication->default: [4163]\n",
      "    default-http://www.w3.org/1999/02/22-rdf-syntax-ns#type->default: [4124]\n",
      "    default-http://swrc.ontoware.org/ontology#author->default: [3986]\n",
      "    default-http://swrc.ontoware.org/ontology#isAbout->default: [2477]\n",
      "    default-http://swrc.ontoware.org/ontology#name->default: [1302]\n",
      "    default-http://swrc.ontoware.org/ontology#year->default: [1227]\n",
      "    default-http://swrc.ontoware.org/ontology#title->default: [1227]\n",
      "    default-http://swrc.ontoware.org/ontology#publishes->default: [1217]\n",
      "    default-http://swrc.ontoware.org/ontology#projectInfo->default: [952]\n",
      "    default-http://swrc.ontoware.org/ontology#hasProject->default: [952]\n",
      "    default-http://swrc.ontoware.org/ontology#booktitle->default: [765]\n",
      "    default-http://swrc.ontoware.org/ontology#month->default: [759]\n",
      "    default-http://swrc.ontoware.org/ontology#isWorkedOnBy->default: [571]\n",
      "    default-http://swrc.ontoware.org/ontology#pages->default: [548]\n",
      "    default-http://swrc.ontoware.org/ontology#abstract->default: [534]\n",
      "    default-http://swrc.ontoware.org/ontology#dealtWithIn->default: [357]\n",
      "    default-http://swrc.ontoware.org/ontology#member->default: [339]\n",
      "    default-http://swrc.ontoware.org/ontology#volume->default: [311]\n",
      "    default-http://swrc.ontoware.org/ontology#series->default: [298]\n",
      "    default-http://swrc.ontoware.org/ontology#homepage->default: [239]\n",
      "    ... (25 more)\n"
     ]
    }
   ],
   "source": [
    "print(G.info())"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "11",
   "metadata": {},
   "source": [
    "The relationship 'affiliation' indicates whether a researcher is affiliated with a research group e.g. (researcher, research group, affiliation). This is used to create the one-hot labels in the `affiliation` DataFrame. These relationships are not included in `G` (nor is its inverse relationship 'employs'). The idea here is to test whether we can recover a 'missing' relationship. "
   ]
  },
  {
   "cell_type": "markdown",
   "id": "12",
   "metadata": {},
   "source": [
    "## Input preparation\n",
    "\n",
    "The nodes don't natively have features, so they've been replaced with one-hot indicators to allow the model to learn from the graph structure. We're only training on the people with affiliations, so we split that into train and test splits."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "id": "13",
   "metadata": {},
   "outputs": [],
   "source": [
    "train_targets, test_targets = model_selection.train_test_split(\n",
    "    affiliation, train_size=0.8, test_size=None\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "id": "14",
   "metadata": {},
   "outputs": [],
   "source": [
    "generator = RelationalFullBatchNodeGenerator(G, sparse=True)\n",
    "\n",
    "train_gen = generator.flow(train_targets.index, targets=train_targets)\n",
    "test_gen = generator.flow(test_targets.index, targets=test_targets)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "15",
   "metadata": {},
   "source": [
    "## RGCN model creation and training\n",
    "\n",
    "We use stellargraph to create an RGCN object. This creates a stack of relational graph convolutional layers. We add a softmax layer to transform the features created by RGCN into class predictions and create a Keras model.  Then we train the model on the stellargraph generators.\n",
    "\n",
    "Each RGCN layer creates a weight matrix for each relationship in the graph. If `num_bases==0` these weight matrices are completely independent. If `num_bases!=0` each weight matrix is a different linear combination of the same basis matrices. This introduces parameter sharing and reduces the number of the parameters in the model.  See the paper for more details."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "16",
   "metadata": {},
   "outputs": [],
   "source": [
    "rgcn = RGCN(\n",
    "    layer_sizes=[32, 32],\n",
    "    activations=[\"relu\", \"relu\"],\n",
    "    generator=generator,\n",
    "    bias=True,\n",
    "    num_bases=20,\n",
    "    dropout=0.5,\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "id": "17",
   "metadata": {},
   "outputs": [],
   "source": [
    "x_in, x_out = rgcn.in_out_tensors()\n",
    "predictions = Dense(train_targets.shape[-1], activation=\"softmax\")(x_out)\n",
    "model = Model(inputs=x_in, outputs=predictions)\n",
    "model.compile(\n",
    "    loss=\"categorical_crossentropy\",\n",
    "    optimizer=keras.optimizers.Adam(0.01),\n",
    "    metrics=[\"acc\"],\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "id": "18",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch 1/20\n",
      "1/1 [==============================] - 27s 27s/step - loss: 1.6109 - acc: 0.2746 - val_loss: 1.5623 - val_acc: 0.3611\n",
      "Epoch 2/20\n",
      "1/1 [==============================] - 23s 23s/step - loss: 1.5564 - acc: 0.5000 - val_loss: 1.4438 - val_acc: 0.4167\n",
      "Epoch 3/20\n",
      "1/1 [==============================] - 22s 22s/step - loss: 1.4328 - acc: 0.5070 - val_loss: 1.2094 - val_acc: 0.5000\n",
      "Epoch 4/20\n",
      "1/1 [==============================] - 21s 21s/step - loss: 1.2018 - acc: 0.5141 - val_loss: 0.9568 - val_acc: 0.6389\n",
      "Epoch 5/20\n",
      "1/1 [==============================] - 20s 20s/step - loss: 0.8872 - acc: 0.7606 - val_loss: 0.7373 - val_acc: 0.6944\n",
      "Epoch 6/20\n",
      "1/1 [==============================] - 20s 20s/step - loss: 0.7686 - acc: 0.8099 - val_loss: 0.5692 - val_acc: 0.7778\n",
      "Epoch 7/20\n",
      "1/1 [==============================] - 21s 21s/step - loss: 0.6025 - acc: 0.8662 - val_loss: 0.4802 - val_acc: 0.8889\n",
      "Epoch 8/20\n",
      "1/1 [==============================] - 21s 21s/step - loss: 0.4335 - acc: 0.8944 - val_loss: 0.4364 - val_acc: 0.9444\n",
      "Epoch 9/20\n",
      "1/1 [==============================] - 21s 21s/step - loss: 0.3616 - acc: 0.9437 - val_loss: 0.4061 - val_acc: 0.9444\n",
      "Epoch 10/20\n",
      "1/1 [==============================] - 21s 21s/step - loss: 0.3286 - acc: 0.9437 - val_loss: 0.3821 - val_acc: 0.9444\n",
      "Epoch 11/20\n",
      "1/1 [==============================] - 20s 20s/step - loss: 0.3106 - acc: 0.9507 - val_loss: 0.3619 - val_acc: 0.9444\n",
      "Epoch 12/20\n",
      "1/1 [==============================] - 21s 21s/step - loss: 0.2678 - acc: 0.9437 - val_loss: 0.3498 - val_acc: 0.9167\n",
      "Epoch 13/20\n",
      "1/1 [==============================] - 20s 20s/step - loss: 0.2236 - acc: 0.9507 - val_loss: 0.3463 - val_acc: 0.9167\n",
      "Epoch 14/20\n",
      "1/1 [==============================] - 21s 21s/step - loss: 0.2434 - acc: 0.9296 - val_loss: 0.3552 - val_acc: 0.9167\n",
      "Epoch 15/20\n",
      "1/1 [==============================] - 20s 20s/step - loss: 0.2236 - acc: 0.9296 - val_loss: 0.3680 - val_acc: 0.9167\n",
      "Epoch 16/20\n",
      "1/1 [==============================] - 20s 20s/step - loss: 0.1783 - acc: 0.9437 - val_loss: 0.3912 - val_acc: 0.9167\n",
      "Epoch 17/20\n",
      "1/1 [==============================] - 20s 20s/step - loss: 0.1887 - acc: 0.9437 - val_loss: 0.4214 - val_acc: 0.9167\n",
      "Epoch 18/20\n",
      "1/1 [==============================] - 19s 19s/step - loss: 0.1636 - acc: 0.9437 - val_loss: 0.4550 - val_acc: 0.9167\n",
      "Epoch 19/20\n",
      "1/1 [==============================] - 18s 18s/step - loss: 0.1699 - acc: 0.9437 - val_loss: 0.4450 - val_acc: 0.9167\n",
      "Epoch 20/20\n",
      "1/1 [==============================] - 18s 18s/step - loss: 0.1848 - acc: 0.9437 - val_loss: 0.4342 - val_acc: 0.9167\n"
     ]
    }
   ],
   "source": [
    "history = model.fit(train_gen, validation_data=test_gen, epochs=20)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "id": "19",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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ac4LV/Xlkr5xhAR522UlIuKv9NPGj82YMYOgoN9/R/vuu+8wxpCZmXnM1xljmDVrVqPff9SoUZxzzjmN7selVn7guI3l2Y857ul9DNv2FPHkx6s59ZlveO6LtXSJac5btw7ii7+cwZUD4hXeIuJWurLmBHLqqaeSlZVFTIxzr4aeNWsWN954I4dvyztx4kTvvjVpeTF88wTE9oU+1xy12YrMPN5YtInPfsvCABf3jeP2MzrSMy7CfbWKiBxGAX4CCQkJoW1b923dGRHh5QGX+irkb4PLXoWAQ0fPVVWWhet288aiDFIz9tAsNIjbTu/IqFMTiYts3O1DRUScQef8vNQbb7xBREQEJSUlhxx/7rnnSEhIoLKykjvuuIPOnTsTHh5Op06deOihhygtLT1qn7WdQl+4cCF9+vQhLCyMPn36sHDhwiNe9/DDD9O9e3eaNGlC+/btufPOO8nPzz/Y5403Ona7NcZgjGHUqFHAkafQrbW88MILdOrUiZCQEDp37sxLL710yHslJiby2GOPce+999KqVSvatGnDfffdR0VFRf3+Ao9nfzYsehG6XQgdzzh4uKS8kjlLtnLuv7/ntrfS2JJbxMMXduenB8/ioQu7K7xFxGsowL3U1VdfTVlZGR999NEhx2fOnMkNN9yAMYaYmBhmz57NmjVreOmll5g+fTpPP/10nd9jx44djBgxggEDBrB8+XL+9a9/ce+99x7RLjw8nClTprB69WpmzJjBd999xz333AM4TstPmjQJgKysLLKyspg4cWKt7zd58mQeffRRxo8fz6pVq/i///s/xo8fz9SpUw9p9/LLLxMbG8vixYt5+eWXmTRpEm+99VadP1edfPc0VBTDuU8CkFdUxsvfbOD0575l/LzfCA0K5KVrTiH573/kjmGdaKF9y0XEy5x4p9A/Hw87f3P/+7btDRc8W+fmERERXHrppcycOZNrrnHMz6alpbF69WrmzZtHQEAATz311MH2iYmJpKenM3nyZJ544ok6vcfkyZOJiorijTfeICgoiB49evD0009z8cUXH9LukUceOeR9nnnmGUaOHMn06dMJCQk5eKr8eKfnn332We6++25Gjx4NQJcuXVi3bh1PPfUUt91228F2Z5xxBuPHjz/YZvr06Xz99deHtGmU3Wtg2QwYeAdEdWH9rn3cPG0JWfklnNk1mtHDOnFq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\n",
      "text/plain": [
       "<Figure size 504x576 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "sg.utils.plot_history(history)"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "20",
   "metadata": {},
   "source": [
    "Now we assess the accuracy of our trained model on the test set - it does pretty well on this example dataset!"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "id": "21",
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Test Set Metrics:\n",
      "\tloss: 0.4342\n",
      "\tacc: 0.9167\n"
     ]
    }
   ],
   "source": [
    "test_metrics = model.evaluate(test_gen)\n",
    "print(\"\\nTest Set Metrics:\")\n",
    "for name, val in zip(model.metrics_names, test_metrics):\n",
    "    print(\"\\t{}: {:0.4f}\".format(name, val))"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "22",
   "metadata": {},
   "source": [
    "## Node embeddings\n",
    "\n",
    "We evaluate node embeddings as the activations of the output of the last graph convolution layer in the GCN layer stack and visualise them, coloring nodes by their true subject label. We expect to see nice clusters of researchers in the node embedding space, with researchers from the same group belonging to the same cluster.\n",
    "\n",
    "To calculate the node embeddings rather than the class predictions, we create a new model with the same inputs as we used previously `x_inp` but now the output is the embeddings `x_out` rather than the predicted class. Additionally note that the weights trained previously are kept in the new model."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "id": "23",
   "metadata": {},
   "outputs": [],
   "source": [
    "from sklearn.decomposition import PCA\n",
    "from sklearn.manifold import TSNE\n",
    "\n",
    "# get embeddings for all people nodes\n",
    "all_gen = generator.flow(affiliation.index, targets=affiliation)\n",
    "embedding_model = Model(inputs=x_in, outputs=x_out)\n",
    "emb = embedding_model.predict(all_gen)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "id": "24",
   "metadata": {},
   "outputs": [],
   "source": [
    "X = emb.squeeze(0)\n",
    "y = affiliation.idxmax(axis=\"columns\").astype(\"category\")\n",
    "\n",
    "if X.shape[1] > 2:\n",
    "    transform = TSNE\n",
    "\n",
    "    trans = transform(n_components=2)\n",
    "    emb_transformed = pd.DataFrame(trans.fit_transform(X), index=affiliation.index)\n",
    "    emb_transformed[\"label\"] = y\n",
    "else:\n",
    "    emb_transformed = pd.DataFrame(X, index=affiliation.index)\n",
    "    emb_transformed = emb_transformed.rename(columns={\"0\": 0, \"1\": 1})\n",
    "    emb_transformed[\"label\"] = y"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "id": "25",
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 504x504 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "alpha = 0.7\n",
    "\n",
    "fig, ax = plt.subplots(figsize=(7, 7))\n",
    "ax.scatter(\n",
    "    emb_transformed[0],\n",
    "    emb_transformed[1],\n",
    "    c=emb_transformed[\"label\"].cat.codes,\n",
    "    cmap=\"jet\",\n",
    "    alpha=alpha,\n",
    ")\n",
    "ax.set(aspect=\"equal\", xlabel=\"$X_1$\", ylabel=\"$X_2$\")\n",
    "plt.title(\n",
    "    \"{} visualization of RGCN embeddings for AIFB dataset\".format(transform.__name__)\n",
    ")\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "id": "26",
   "metadata": {},
   "source": [
    "Aside from a slight overlap the classes are well separated despite only using 2-dimensions. This indicates that our model is performing well at clustering the researchers into the right groups."
   ]
  },
  {
   "cell_type": "markdown",
   "id": "27",
   "metadata": {
    "nbsphinx": "hidden",
    "tags": [
     "CloudRunner"
    ]
   },
   "source": [
    "<table><tr><td>Run the latest release of this notebook:</td><td><a href=\"https://mybinder.org/v2/gh/stellargraph/stellargraph/master?urlpath=lab/tree/demos/node-classification/rgcn-node-classification.ipynb\" alt=\"Open In Binder\" target=\"_parent\"><img src=\"https://mybinder.org/badge_logo.svg\"/></a></td><td><a href=\"https://colab.research.google.com/github/stellargraph/stellargraph/blob/master/demos/node-classification/rgcn-node-classification.ipynb\" alt=\"Open In Colab\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\"/></a></td></tr></table>"
   ]
  }
 ],
 "metadata": {
  "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"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}