{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "--- This is a regression problem ---\n", "\n", "1. Loading dataset from file...\n", "\n", "2. Calculating gram matrices. This could take a while...\n", "--- shortest path kernel matrix of size 183 built in 12.671883821487427 seconds ---\n", "\n", "gram matrix with parameters {} is: \n", "[[ 3. 1. 3. ... 1. 1. 1.]\n", " [ 1. 6. 1. ... 0. 0. 3.]\n", " [ 3. 1. 3. ... 1. 1. 1.]\n", " ...\n", " [ 1. 0. 1. ... 55. 21. 7.]\n", " [ 1. 0. 1. ... 21. 55. 7.]\n", " [ 1. 3. 1. ... 7. 7. 55.]]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "3. Fitting and predicting using nested cross validation. This could really take a while...\n", "calculate performance: 0%| | 1/630 [00:00<01:12, 8.66it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/home/ljia/.local/lib/python3.5/site-packages/sklearn/linear_model/ridge.py:154: UserWarning: Singular matrix in solving dual problem. Using least-squares solution instead.\n", " warnings.warn(\"Singular matrix in solving dual problem. Using \"\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ " \n", "4. Getting final performances...\n", "\n", "best_params_out: [{}]\n", "best_params_in: [{'alpha': 35.481338923357534}]\n", "best_val_perf: 36.08752278925261\n", "best_val_std: 0.9660235949265693\n", "final_performance: 36.45033825376652\n", "final_confidence: 6.625276016213645\n", "train_performance: 28.645168242623424\n", "train_std: 0.59327479451686\n", "time to calculate gram matrix: 12.671883821487427 s\n", "\n", "params train_perf valid_perf test_perf gram_matrix_time\n", "--------------------- -------------- --------------- --------------- ------------------\n", "{'alpha': '1.00e-01'} 463.68±735.85 1255.03±1875.15 1552.81±4500.30 12.67\n", "{'alpha': '1.41e-01'} 371.29±454.77 910.40±924.50 893.80±1213.60 12.67\n", "{'alpha': '2.00e-01'} 522.21±1406.90 1587.46±4629.03 1301.10±3657.93 12.67\n", "{'alpha': '2.82e-01'} 248.98±245.92 721.57±817.51 569.68±566.78 12.67\n", "{'alpha': '3.98e-01'} 350.52±614.63 848.29±1379.89 830.27±1370.70 12.67\n", "{'alpha': '5.62e-01'} 167.98±215.81 434.68±466.73 566.30±1462.66 12.67\n", "{'alpha': '7.94e-01'} 157.92±268.28 432.36±664.00 452.75±857.58 12.67\n", "{'alpha': '1.12e+00'} 134.98±151.51 438.74±741.59 386.57±589.84 12.67\n", "{'alpha': '1.58e+00'} 97.98±149.69 234.55±335.91 237.38±304.30 12.67\n", "{'alpha': '2.24e+00'} 55.08±52.90 152.16±218.04 142.67±180.16 12.67\n", "{'alpha': '3.16e+00'} 57.00±44.47 170.95±206.48 143.07±176.76 12.67\n", "{'alpha': '4.47e+00'} 41.42±43.03 98.89±127.39 95.73±185.90 12.67\n", "{'alpha': '6.31e+00'} 29.24±1.43 48.94±3.64 48.05±9.90 12.67\n", "{'alpha': '8.91e+00'} 28.33±0.95 43.38±1.83 42.94±6.50 12.67\n", "{'alpha': '1.26e+01'} 27.92±0.76 40.24±1.40 40.08±5.78 12.67\n", "{'alpha': '1.78e+01'} 27.82±0.66 38.14±1.18 38.19±5.84 12.67\n", "{'alpha': '2.51e+01'} 28.04±0.61 36.78±1.05 37.00±6.19 12.67\n", "{'alpha': '3.55e+01'} 28.65±0.59 36.09±0.97 36.45±6.63 12.67\n", "{'alpha': '5.01e+01'} 32.00±10.86 37.44±6.49 38.66±11.46 12.67\n", "{'alpha': '7.08e+01'} 49.88±23.28 50.68±16.29 52.34±21.79 12.67\n", "{'alpha': '1.00e+02'} 35.36±1.02 39.45±1.20 40.39±8.79 12.67\n", "calculate performance: 100%|██████████| 630/630 [01:00<00:00, 16.40it/s]" ] } ], "source": [ "%load_ext line_profiler\n", "%matplotlib inline\n", "import numpy as np\n", "import sys\n", "sys.path.insert(0, \"../\")\n", "from pygraph.utils.model_selection_precomputed import model_selection_for_precomputed_kernel\n", "from pygraph.kernels.spKernel import spkernel\n", "\n", "datafile = '../../../../datasets/acyclic/Acyclic/dataset_bps.ds'\n", "estimator = spkernel\n", "param_grid_precomputed = {}\n", "param_grid = {'alpha': np.logspace(-1, 2, num = 21, base = 10)}\n", "\n", "model_selection_for_precomputed_kernel(datafile, estimator, param_grid_precomputed, param_grid, \n", " 'regression', NUM_TRIALS=30)" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", " --- This is a regression problem ---\n", "\n", "\n", " Loading dataset from file...\n", "\n", " Calculating kernel matrix, this could take a while...\n", "--- shortest path kernel matrix of size 185 built in 13.3865065574646 seconds ---\n", "[[ 3. 1. 3. ... 1. 1. 1.]\n", " [ 1. 6. 1. ... 0. 0. 3.]\n", " [ 3. 1. 3. ... 1. 1. 1.]\n", " ...\n", " [ 1. 0. 1. ... 55. 21. 7.]\n", " [ 1. 0. 1. ... 21. 55. 7.]\n", " [ 1. 3. 1. ... 7. 7. 55.]]\n", "\n", " Starting calculate accuracy/rmse...\n", "calculate performance: 94%|█████████▎| 936/1000 [00:01<00:00, 757.54it/s]\n", " Mean performance on train set: 28.360361\n", "With standard deviation: 1.357183\n", "\n", " Mean performance on test set: 35.191954\n", "With standard deviation: 4.495767\n", "calculate performance: 100%|██████████| 1000/1000 [00:01<00:00, 771.22it/s]\n", "\n", "\n", " rmse_test std_test rmse_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 35.192 4.49577 28.3604 1.35718 13.3865\n" ] } ], "source": [ "%load_ext line_profiler\n", "\n", "import sys\n", "sys.path.insert(0, \"../\")\n", "from pygraph.utils.utils import kernel_train_test\n", "from pygraph.kernels.spKernel import spkernel\n", "\n", "datafile = '../../../../datasets/acyclic/Acyclic/dataset_bps.ds'\n", "kernel_file_path = 'kernelmatrices_path_acyclic/'\n", "\n", "kernel_para = dict(edge_weight = 'atom')\n", "\n", "kernel_train_test(datafile, kernel_file_path, spkernel, kernel_para, normalize = False)\n", "\n", "# %lprun -f spkernel \\\n", "# kernel_train_test(datafile, kernel_file_path, spkernel, kernel_para, normalize = False)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# results\n", "\n", "# with y normalization\n", " RMSE_test std_test RMSE_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 35.6337 5.23183 32.3805 3.92531 14.9301\n", "\n", "# without y normalization\n", " RMSE_test std_test RMSE_train std_train k_time\n", "----------- ---------- ------------ ----------- --------\n", " 35.192 4.49577 28.3604 1.35718 14.5768" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "scrolled": false }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "- This script take as input a kernel matrix\n", "and returns the classification or regression performance\n", "- The kernel matrix can be calculated using any of the graph kernels approaches\n", "- The criteria used for prediction are SVM for classification and kernel Ridge regression for regression\n", "- For predition we divide the data in training, validation and test. For each split, we first train on the train data, \n", "then evaluate the performance on the validation. We choose the optimal parameters for the validation set and finally\n", "provide the corresponding performance on the test set. If more than one split is performed, the final results \n", "correspond to the average of the performances on the test sets. \n", "\n", "@references\n", " https://github.com/eghisu/GraphKernels/blob/master/GraphKernelsCollection/python_scripts/compute_perf_gk.py\n", "\n", "\n", " Loading dataset from file...\n", "[ -23.7 14. 37.3 109.7 10.8 39. 42. 66.6 135. 148.5\n", " 40. 34.6 32. 63. 53.5 67. 64.4 84.7 95.5 92.\n", " 84.4 154. 156. 166. 183. 70.3 63.6 52.5 59. 59.5\n", " 55.2 88. 83. 104.5 102. 92. 107.4 123.2 112.5 118.5\n", " 101.5 173.7 165.5 181. 99.5 92.3 90.1 80.2 82. 91.2\n", " 91.5 81.2 93. 69. 86.3 82. 103. 103.5 96. 112. 104.\n", " 132.5 123.5 120.3 145. 144.2 142.8 132. 134.2 137. 139.\n", " 133.6 120.4 120. 137. 195.8 177.2 181. 185.9 175.7 186. 211.\n", " 125. 118. 117.1 107. 102.5 112. 97.4 91.5 87.6 106.5\n", " 101. 99.3 90. 137. 114. 126. 124. 140.5 157.5 146. 145.\n", " 141. 171. 166. 155. 145. 159. 138. 142. 159. 163.5\n", " 229.5 142. 125. 132. 130.5 125. 122. 121. 122.2 112. 106.\n", " 114.5 151. 128.5 109.5 126. 147. 158. 147. 165. 188.9\n", " 170. 178. 148.5 165. 177. 167. 195. 226. 215. 201. 205.\n", " 151.5 165.5 157. 139. 163. 153.5 139. 162. 173. 159.5\n", " 159.5 155.5 141. 126. 164. 163. 166.5 146. 165. 159. 195.\n", " 218. 250. 235. 186.5 156.5 162. 162. 170.2 173.2 186.8\n", " 173. 187. 174. 188.5 199. 228. 215. 216. 240. ]\n", "\n", " Loading the matrix from file...\n", "[[ 3. 1. 3. ..., 1. 1. 1.]\n", " [ 1. 6. 1. ..., 0. 0. 3.]\n", " [ 3. 1. 3. ..., 1. 1. 1.]\n", " ..., \n", " [ 1. 0. 1. ..., 55. 21. 7.]\n", " [ 1. 0. 1. ..., 21. 55. 7.]\n", " [ 1. 3. 1. ..., 7. 7. 55.]]\n", "\n", " --- This is a regression problem ---\n", "\n", " Starting split 10...\n", "\n", " Normalizing output y...\n", "The best performance is for trial 12 with parameter alpha = 100.000000\n", "The best performance on the validation set is: 40.422382\n", "The corresponding performance on test set is: 47.424532\n", "\n", " Starting split 11...\n", "\n", " Normalizing output y...\n", "The best performance is for trial 12 with parameter alpha = 100.000000\n", "The best performance on the validation set is: 33.084913\n", "The corresponding performance on test set is: 35.493699\n", "\n", " Starting split 12...\n", "\n", " Normalizing output y...\n", "The best performance is for trial 12 with parameter alpha = 100.000000\n", "The best performance on the validation set is: 31.306710\n", "The corresponding performance on test set is: 33.173366\n", "\n", " Starting split 13...\n", "\n", " Normalizing output y...\n", "The best performance is for trial 12 with parameter alpha = 100.000000\n", "The best performance on the validation set is: 43.500424\n", "The corresponding performance on test set is: 32.633129\n", "\n", " Starting split 14...\n", "\n", " Normalizing output y...\n", "The best performance is for trial 10 with parameter alpha = 1.000000\n", "The best performance on the validation set is: 53.561752\n", "The corresponding performance on test set is: 42.883548\n", "\n", " Starting split 15...\n", "\n", " Normalizing output y...\n", "The best performance is for trial 12 with parameter alpha = 100.000000\n", "The best performance on the validation set is: 40.444773\n", "The corresponding performance on test set is: 32.713040\n", "\n", " Starting split 16...\n", "\n", " Normalizing output y...\n", "The best performance is for trial 11 with parameter alpha = 10.000000\n", "The best performance on the validation set is: 37.046818\n", "The corresponding performance on test set is: 37.337851\n", "\n", " Starting split 17...\n", "\n", " Normalizing output y...\n", "The best performance is for trial 12 with parameter alpha = 100.000000\n", "The best performance on the validation set is: 39.907628\n", "The corresponding performance on test set is: 38.889064\n", "\n", " Starting split 18...\n", "\n", " Normalizing output y...\n", "The best performance is for trial 12 with parameter alpha = 100.000000\n", "The best performance on the validation set is: 29.879950\n", "The corresponding performance on test set is: 27.652558\n", "\n", " Starting split 19...\n", "\n", " Normalizing output y...\n", "The best performance is for trial 11 with parameter alpha = 10.000000\n", "The best performance on the validation set is: 44.911892\n", "The corresponding performance on test set is: 35.804454\n", "\n", " Mean performance on val set: 39.406724\n", "With standard deviation: 6.720820\n", "\n", " Mean performance on test set: 36.400524\n", "With standard deviation: 5.352940\n" ] } ], "source": [ "# Author: Elisabetta Ghisu\n", "\n", "\"\"\"\n", "- This script take as input a kernel matrix\n", "and returns the classification or regression performance\n", "- The kernel matrix can be calculated using any of the graph kernels approaches\n", "- The criteria used for prediction are SVM for classification and kernel Ridge regression for regression\n", "- For predition we divide the data in training, validation and test. For each split, we first train on the train data, \n", "then evaluate the performance on the validation. We choose the optimal parameters for the validation set and finally\n", "provide the corresponding performance on the test set. If more than one split is performed, the final results \n", "correspond to the average of the performances on the test sets. \n", "\n", "@references\n", " https://github.com/eghisu/GraphKernels/blob/master/GraphKernelsCollection/python_scripts/compute_perf_gk.py\n", "\"\"\"\n", "\n", "print(__doc__)\n", "\n", "import sys\n", "import pathlib\n", "sys.path.insert(0, \"../\")\n", "from tabulate import tabulate\n", "\n", "import random\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from sklearn.kernel_ridge import KernelRidge # 0.17\n", "from sklearn.metrics import accuracy_score, mean_squared_error\n", "from sklearn import svm\n", "\n", "from pygraph.kernels.spkernel import spkernel\n", "from pygraph.utils.graphfiles import loadDataset\n", "\n", "print('\\n Loading dataset from file...')\n", "dataset, y = loadDataset(\"../../../../datasets/acyclic/Acyclic/dataset_bps.ds\")\n", "y = np.array(y)\n", "print(y)\n", "\n", "kernel_file_path = 'kernelmatrix.ds'\n", "path = pathlib.Path(kernel_file_path)\n", "if path.is_file():\n", " print('\\n Loading the matrix from file...')\n", " Kmatrix = np.loadtxt(kernel_file_path)\n", " print(Kmatrix)\n", "else:\n", " print('\\n Calculating kernel matrix, this could take a while...')\n", " #@Q: is it appropriate to use bond type between atoms as the edge weight to calculate shortest path????????\n", " Kmatrix, run_time = spkernel(dataset, edge_weight = 'bond_type')\n", " print(Kmatrix)\n", " print('Saving kernel matrix to file...')\n", " np.savetxt(kernel_file_path, Kmatrix)\n", "\n", "# setup the parameters\n", "model_type = 'regression' # Regression or classification problem\n", "print('\\n --- This is a %s problem ---' % model_type)\n", "\n", "datasize = len(dataset)\n", "trials = 21 # Trials for hyperparameters random search\n", "splits = 10 # Number of splits of the data\n", "alpha_grid = np.logspace(-10, 10, num = trials, base = 10) # corresponds to (2*C)^-1 in other linear models such as LogisticRegression\n", "C_grid = np.logspace(-10, 10, num = trials, base = 10)\n", "random.seed(20) # Set the seed for uniform parameter distribution\n", "\n", "\n", "\"\"\"\n", "- Here starts the main program\n", "- First we permute the data, then for each split we evaluate corresponding performances\n", "- In the end, the performances are averaged over the test sets\n", "\"\"\"\n", "\n", "# Initialize the performance of the best parameter trial on validation with the corresponding performance on test\n", "val_split = []\n", "test_split = []\n", "\n", "# For each split of the data\n", "for j in range(10, 10 + splits):\n", " print('\\n Starting split %d...' % j)\n", "\n", " # Set the random set for data permutation\n", " random_state = int(j)\n", " np.random.seed(random_state)\n", " idx_perm = np.random.permutation(datasize)\n", "# print(idx_perm)\n", " \n", " # Permute the data\n", " y_perm = y[idx_perm] # targets permutation\n", "# print(y_perm)\n", " Kmatrix_perm = Kmatrix[:, idx_perm] # inputs permutation\n", "# print(Kmatrix_perm)\n", " Kmatrix_perm = Kmatrix_perm[idx_perm, :] # inputs permutation\n", " \n", " # Set the training, validation and test\n", " # Note: the percentage can be set up by the user\n", " num_train_val = int((datasize * 90) / 100) # 90% (of entire dataset) for training and validation\n", " num_test = datasize - num_train_val # 10% (of entire dataset) for test\n", " num_train = int((num_train_val * 90) / 100) # 90% (of train + val) for training\n", " num_val = num_train_val - num_train # 10% (of train + val) for validation\n", " \n", " # Split the kernel matrix\n", " Kmatrix_train = Kmatrix_perm[0:num_train, 0:num_train]\n", " Kmatrix_val = Kmatrix_perm[num_train:(num_train + num_val), 0:num_train]\n", " Kmatrix_test = Kmatrix_perm[(num_train + num_val):datasize, 0:num_train]\n", "\n", " # Split the targets\n", " y_train = y_perm[0:num_train]\n", "\n", " # Normalization step (for real valued targets only)\n", " print('\\n Normalizing output y...')\n", " if model_type == 'regression':\n", " y_train_mean = np.mean(y_train)\n", " y_train_std = np.std(y_train)\n", " y_train = (y_train - y_train_mean) / float(y_train_std)\n", "# print(y)\n", " \n", " y_val = y_perm[num_train:(num_train + num_val)]\n", " y_test = y_perm[(num_train + num_val):datasize]\n", " \n", " # Record the performance for each parameter trial respectively on validation and test set\n", " perf_all_val = []\n", " perf_all_test = []\n", " \n", " # For each parameter trial\n", " for i in range(trials):\n", " # For regression use the Kernel Ridge method\n", " if model_type == 'regression':\n", "# print('\\n Starting experiment for trial %d and parameter alpha = %3f\\n ' % (i, alpha_grid[i]))\n", "\n", " # Fit the kernel ridge model\n", " KR = KernelRidge(kernel = 'precomputed', alpha = alpha_grid[i])\n", "# KR = svm.SVR(kernel = 'precomputed', C = C_grid[i])\n", " KR.fit(Kmatrix_train, y_train)\n", "\n", " # predict on the validation and test set\n", " y_pred = KR.predict(Kmatrix_val)\n", " y_pred_test = KR.predict(Kmatrix_test)\n", "# print(y_pred)\n", "\n", " # adjust prediction: needed because the training targets have been normalizaed\n", " y_pred = y_pred * float(y_train_std) + y_train_mean\n", "# print(y_pred)\n", " y_pred_test = y_pred_test * float(y_train_std) + y_train_mean\n", "# print(y_pred_test)\n", "\n", " # root mean squared error on validation\n", " rmse = np.sqrt(mean_squared_error(y_val, y_pred))\n", " perf_all_val.append(rmse)\n", "\n", " # root mean squared error in test \n", " rmse_test = np.sqrt(mean_squared_error(y_test, y_pred_test))\n", " perf_all_test.append(rmse_test)\n", "\n", "# print('The performance on the validation set is: %3f' % rmse)\n", "# print('The performance on the test set is: %3f' % rmse_test)\n", " \n", " # --- FIND THE OPTIMAL PARAMETERS --- #\n", " # For regression: minimise the mean squared error\n", " if model_type == 'regression':\n", "\n", " # get optimal parameter on validation (argmin mean squared error)\n", " min_idx = np.argmin(perf_all_test)\n", " alpha_opt = alpha_grid[min_idx]\n", "\n", " # performance corresponding to optimal parameter on val\n", " perf_val_opt = perf_all_val[min_idx]\n", "\n", " # corresponding performance on test for the same parameter\n", " perf_test_opt = perf_all_test[min_idx]\n", "\n", " print('The best performance is for trial %d with parameter alpha = %3f' % (min_idx, alpha_opt))\n", " print('The best performance on the validation set is: %3f' % perf_val_opt)\n", " print('The corresponding performance on test set is: %3f' % perf_test_opt)\n", "\n", " # append the best performance on validation\n", " # at the current split\n", " val_split.append(perf_val_opt)\n", "\n", " # append the correponding performance on the test set\n", " test_split.append(perf_test_opt)\n", "\n", "# average the results\n", "# mean of the validation performances over the splits\n", "val_mean = np.mean(np.asarray(val_split))\n", "# std deviation of validation over the splits\n", "val_std = np.std(np.asarray(val_split))\n", "\n", "# mean of the test performances over the splits\n", "test_mean = np.mean(np.asarray(test_split))\n", "# std deviation of the test oer the splits\n", "test_std = np.std(np.asarray(test_split))\n", "\n", "print('\\n Mean performance on val set: %3f' % val_mean)\n", "print('With standard deviation: %3f' % val_std)\n", "print('\\n Mean performance on test set: %3f' % test_mean)\n", "print('With standard deviation: %3f' % test_std)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "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.5.2" } }, "nbformat": 4, "nbformat_minor": 2 }