{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "\n", "MAO\n", "\n", "--- This is a classification problem ---\n", "\n", "1. Loading dataset from file...\n", "\n", "2. Calculating gram matrices. This could take a while...\n", "\n", "calculating kernels: 0%| | 2/2346.0 [00:00<02:17, 16.99it/s]" ] }, { "name": "stderr", "output_type": "stream", "text": [ "../pygraph/kernels/commonWalkKernel.py:168: ComplexWarning: Casting complex values to real discards the imaginary part\n", " D[i][i] = np.exp(beta * ew[i])\n", "../pygraph/kernels/commonWalkKernel.py:79: ComplexWarning: Casting complex values to real discards the imaginary part\n", " edge_label, weight)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "calculating kernels: 100%|██████████| 2346/2346.0 [09:31<00:00, 4.13it/s]\n", " --- kernel matrix of common walk kernel of size 68 built in 571.1209850311279 seconds ---\n", "\n", "[[ 1. 0.99682307 0.99737306 ..., 0.97765855 0.96593664\n", " 0.92542251]\n", " [ 0.99682307 1. 0.99795677 ..., 0.98819739 0.97748489\n", " 0.94249778]\n", " [ 0.99737306 0.99795677 1. ..., 0.98590615 0.9753702\n", " 0.94038317]\n", " ..., \n", " [ 0.97765855 0.98819739 0.98590615 ..., 1. 0.98685012\n", " 0.961209 ]\n", " [ 0.96593664 0.97748489 0.9753702 ..., 0.98685012 1. 0.99067559]\n", " [ 0.92542251 0.94249778 0.94038317 ..., 0.961209 0.99067559 1. ]]\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "1 gram matrices are calculated, 0 of which are ignored.\n", "\n", "3. Fitting and predicting using nested cross validation. This could really take a while...\n", " \n", "4. Getting final performances...\n", "best_params_out: [{}]\n", "best_params_in: [{'C': 3.1622776601683795}]\n", "\n", "best_val_perf: 0.665952380952\n", "best_val_std: 0.0528237368363\n", "final_performance: 0.70619047619\n", "final_confidence: 0.132993644234\n", "train_performance: 0.675101010101\n", "train_std: 0.0302704867371\n", "\n", "time to calculate gram matrix with different hyperpapams: 571.12±nan\n", "time to calculate best gram matrix: 571.1209850311279 s\n", "\n", "params train_perf valid_perf test_perf gram_matrix_time\n", "----------------- ------------ ------------ ----------- ------------------\n", "{'C': '1.00e-10'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e-10'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '1.00e-09'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e-09'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '1.00e-08'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e-08'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '1.00e-07'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e-07'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '1.00e-06'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e-06'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '1.00e-05'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e-05'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '1.00e-04'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e-04'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '1.00e-03'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e-03'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '1.00e-02'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e-02'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '1.00e-01'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e-01'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '1.00e+00'} 0.56±0.02 0.55±0.05 0.54±0.14 571.12\n", "{'C': '3.16e+00'} 0.68±0.03 0.67±0.05 0.71±0.13 571.12\n", "{'C': '1.00e+01'} 0.54±0.04 0.56±0.04 0.58±0.14 571.12\n", "{'C': '3.16e+01'} 0.47±0.03 0.48±0.03 0.48±0.15 571.12\n", "{'C': '1.00e+02'} 0.46±0.03 0.46±0.03 0.47±0.16 571.12\n", "{'C': '3.16e+02'} 0.48±0.05 0.48±0.05 0.51±0.17 571.12\n", "{'C': '1.00e+03'} 0.49±0.06 0.49±0.07 0.53±0.17 571.12\n", "{'C': '3.16e+03'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '1.00e+04'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '3.16e+04'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '1.00e+05'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '3.16e+05'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '1.00e+06'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '3.16e+06'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '1.00e+07'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '3.16e+07'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '1.00e+08'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '3.16e+08'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '1.00e+09'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '3.16e+09'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "{'C': '1.00e+10'} 0.49±0.06 0.50±0.07 0.53±0.17 571.12\n", "calculate performance: 100%|██████████| 1230/1230 [00:09<00:00, 130.38it/s]\n", "\n", "\n", "ENZYMES\n", "\n", "--- This is a classification problem ---\n", "\n", "1. Loading dataset from file...\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "/usr/local/lib/python3.5/dist-packages/numpy/core/_methods.py:135: RuntimeWarning: Degrees of freedom <= 0 for slice\n", " keepdims=keepdims)\n", "/usr/local/lib/python3.5/dist-packages/numpy/core/_methods.py:127: RuntimeWarning: invalid value encountered in double_scalars\n", " ret = ret.dtype.type(ret / rcount)\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n", "2. Calculating gram matrices. This could take a while...\n", "\n", "calculating kernels: 0%| | 10/180300.0 [00:19<117:40:38, 2.35s/it]" ] }, { "ename": "NetworkXError", "evalue": "Graph has no nodes or edges", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mNetworkXError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 58\u001b[0m \u001b[0;34m(\u001b[0m\u001b[0mds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'task'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'task'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mds\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;34m'classification'\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mNUM_TRIALS\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;36m30\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 59\u001b[0m \u001b[0mdatafile_y\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m'dataset_y'\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0;34m'dataset_y'\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mds\u001b[0m \u001b[0;32melse\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 60\u001b[0;31m extra_params=(ds['extra_params'] if 'extra_params' in ds else None))\n\u001b[0m\u001b[1;32m 61\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/media/ljia/DATA/research-repo/codes/Linlin/py-graph/pygraph/utils/model_selection_precomputed.py\u001b[0m in \u001b[0;36mmodel_selection_for_precomputed_kernel\u001b[0;34m(datafile, estimator, param_grid_precomputed, param_grid, model_type, NUM_TRIALS, datafile_y, extra_params)\u001b[0m\n\u001b[1;32m 99\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'gram matrix with parameters'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'is: '\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 100\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 101\u001b[0;31m \u001b[0mKmatrix\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcurrent_run_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mestimator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdataset\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mparams_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 102\u001b[0m \u001b[0mKmatrix_diag\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKmatrix\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiagonal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 103\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/media/ljia/DATA/research-repo/codes/Linlin/py-graph/pygraph/kernels/commonWalkKernel.py\u001b[0m in \u001b[0;36mcommonwalkkernel\u001b[0;34m(node_label, edge_label, n, weight, compute_method, *args)\u001b[0m\n\u001b[1;32m 77\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mGn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 78\u001b[0m Kmatrix[i][j] = _untilnwalkkernel_exp(Gn[i], Gn[j], node_label,\n\u001b[0;32m---> 79\u001b[0;31m edge_label, weight)\n\u001b[0m\u001b[1;32m 80\u001b[0m \u001b[0mKmatrix\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKmatrix\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 81\u001b[0m \u001b[0mpbar\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mupdate\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m1\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/media/ljia/DATA/research-repo/codes/Linlin/py-graph/pygraph/kernels/commonWalkKernel.py\u001b[0m in \u001b[0;36m_untilnwalkkernel_exp\u001b[0;34m(G1, G2, node_label, edge_label, beta)\u001b[0m\n\u001b[1;32m 143\u001b[0m \u001b[0;31m# get tensor product / direct product\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 144\u001b[0m \u001b[0mgp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdirect_product\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG1\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mG2\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnode_label\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0medge_label\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 145\u001b[0;31m \u001b[0mA\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mnx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0madjacency_matrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mtodense\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 146\u001b[0m \u001b[0;31m# print(A)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 147\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/networkx/linalg/graphmatrix.py\u001b[0m in \u001b[0;36madjacency_matrix\u001b[0;34m(G, nodelist, weight)\u001b[0m\n\u001b[1;32m 160\u001b[0m \u001b[0mto_dict_of_dicts\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 161\u001b[0m \"\"\"\n\u001b[0;32m--> 162\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mnx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mto_scipy_sparse_matrix\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mG\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mnodelist\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mnodelist\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mweight\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mweight\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 163\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 164\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/networkx/convert_matrix.py\u001b[0m in \u001b[0;36mto_scipy_sparse_matrix\u001b[0;34m(G, nodelist, dtype, weight, format)\u001b[0m\n\u001b[1;32m 762\u001b[0m \u001b[0mnlen\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnodelist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 763\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mnlen\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;36m0\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 764\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mnx\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mNetworkXError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"Graph has no nodes or edges\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 765\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 766\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnodelist\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m!=\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mset\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mnodelist\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mNetworkXError\u001b[0m: Graph has no nodes or edges" ] } ], "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.commonWalkKernel import commonwalkkernel\n", "\n", "dslist = [ \n", "# {'name': 'Acyclic', 'dataset': '../datasets/acyclic/dataset_bps.ds', 'task': 'regression'}, # node_labeled\n", "# {'name': 'COIL-DEL', 'dataset': '../datasets/COIL-DEL/COIL-DEL_A.txt'}, # edge_labeled\n", "# {'name': 'PAH', 'dataset': '../datasets/PAH/dataset.ds',}, # unlabeled\n", "# {'name': 'Mutagenicity', 'dataset': '../datasets/Mutagenicity/Mutagenicity_A.txt'}, # fully_labeled\n", " {'name': 'MAO', 'dataset': '../datasets/MAO/dataset.ds',},\n", "\n", "# {'name': 'MUTAG', 'dataset': '../datasets/MUTAG/MUTAG.mat',\n", "# 'extra_params': {'am_sp_al_nl_el': [0, 0, 3, 1, 2]}},\n", "# {'name': 'Alkane', 'dataset': '../datasets/Alkane/dataset.ds', 'task': 'regression', \n", "# 'dataset_y': '../datasets/Alkane/dataset_boiling_point_names.txt',},\n", "# {'name': 'BZR', 'dataset': '../datasets/BZR_txt/BZR_A_sparse.txt'},\n", "# {'name': 'COX2', 'dataset': '../datasets/COX2_txt/COX2_A_sparse.txt'}, \n", " {'name': 'ENZYMES', 'dataset': '../datasets/ENZYMES_txt/ENZYMES_A_sparse.txt'},\n", "# {'name': 'DHFR', 'dataset': '../datasets/DHFR_txt/DHFR_A_sparse.txt'},\n", "# {'name': 'SYNTHETIC', 'dataset': '../datasets/SYNTHETIC_txt/SYNTHETIC_A_sparse.txt'},\n", "# {'name': 'MSRC9', 'dataset': '../datasets/MSRC_9_txt/MSRC_9_A.txt'},\n", "# {'name': 'MSRC21', 'dataset': '../datasets/MSRC_21_txt/MSRC_21_A.txt'},\n", "# {'name': 'FIRSTMM_DB', 'dataset': '../datasets/FIRSTMM_DB/FIRSTMM_DB_A.txt'},\n", "\n", "# {'name': 'PROTEINS', 'dataset': '../datasets/PROTEINS_txt/PROTEINS_A_sparse.txt'},\n", "# {'name': 'PROTEINS_full', 'dataset': '../datasets/PROTEINS_full_txt/PROTEINS_full_A_sparse.txt'},\n", "# {'name': 'D&D', 'dataset': '../datasets/D&D/DD.mat',\n", "# 'extra_params': {'am_sp_al_nl_el': [0, 1, 2, 1, -1]}},\n", "# {'name': 'AIDS', 'dataset': '../datasets/AIDS/AIDS_A.txt'},\n", "# {'name': 'NCI1', 'dataset': '../datasets/NCI1/NCI1.mat',\n", "# 'extra_params': {'am_sp_al_nl_el': [1, 1, 2, 0, -1]}},\n", "# {'name': 'NCI109', 'dataset': '../datasets/NCI109/NCI109.mat',\n", "# 'extra_params': {'am_sp_al_nl_el': [1, 1, 2, 0, -1]}},\n", "# {'name': 'NCI-HIV', 'dataset': '../datasets/NCI-HIV/AIDO99SD.sdf',\n", "# 'dataset_y': '../datasets/NCI-HIV/aids_conc_may04.txt',},\n", " \n", "# # not working below\n", "# {'name': 'PTC_FM', 'dataset': '../datasets/PTC/Train/FM.ds',},\n", "# {'name': 'PTC_FR', 'dataset': '../datasets/PTC/Train/FR.ds',},\n", "# {'name': 'PTC_MM', 'dataset': '../datasets/PTC/Train/MM.ds',},\n", "# {'name': 'PTC_MR', 'dataset': '../datasets/PTC/Train/MR.ds',},\n", "]\n", "estimator = commonwalkkernel\n", "param_grid_precomputed = {}\n", "param_grid = [{'C': np.logspace(-10, 10, num = 41, base = 10)}, \n", " {'alpha': np.logspace(-10, 10, num = 41, base = 10)}]\n", "\n", "for ds in dslist:\n", " print()\n", " print(ds['name'])\n", " model_selection_for_precomputed_kernel(\n", " ds['dataset'], estimator, param_grid_precomputed, \n", " (param_grid[1] if ('task' in ds and ds['task'] == 'regression') else param_grid[0]), \n", " (ds['task'] if 'task' in ds else 'classification'), NUM_TRIALS=30,\n", " datafile_y=(ds['dataset_y'] if 'dataset_y' in ds else None),\n", " extra_params=(ds['extra_params'] if 'extra_params' in ds else None))\n", " print()" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "scrolled": true }, "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", "\n", "gram matrix with parameters {'n': 0.0} is: \n" ] }, { "ename": "IndexError", "evalue": "index 1 is out of bounds for axis 0 with size 1", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mIndexError\u001b[0m Traceback (most recent call last)", "\u001b[0;32m\u001b[0m in \u001b[0;36m\u001b[0;34m()\u001b[0m\n\u001b[1;32m 13\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 14\u001b[0m model_selection_for_precomputed_kernel(datafile, estimator, param_grid_precomputed, param_grid, \n\u001b[0;32m---> 15\u001b[0;31m 'regression', NUM_TRIALS=30)\n\u001b[0m", "\u001b[0;32m/media/ljia/DATA/research-repo/codes/Linlin/py-graph/pygraph/utils/model_selection_precomputed.py\u001b[0m in \u001b[0;36mmodel_selection_for_precomputed_kernel\u001b[0;34m(datafile, estimator, param_grid_precomputed, param_grid, model_type, NUM_TRIALS, datafile_y)\u001b[0m\n\u001b[1;32m 94\u001b[0m \u001b[0mprint\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m'gram matrix with parameters'\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mparams_out\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m'is: '\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 95\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m---> 96\u001b[0;31m \u001b[0mKmatrix\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mcurrent_run_time\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mestimator\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mdataset\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mparams_out\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 97\u001b[0m \u001b[0mKmatrix_diag\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKmatrix\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mdiagonal\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcopy\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 98\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/media/ljia/DATA/research-repo/codes/Linlin/py-graph/pygraph/kernels/untilnWalkKernel.py\u001b[0m in \u001b[0;36muntilnwalkkernel\u001b[0;34m(node_label, edge_label, labeled, n, weight, compute_method, *args)\u001b[0m\n\u001b[1;32m 65\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mrange\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mlen\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mGn\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 66\u001b[0m Kmatrix[i][j] = _untilnwalkkernel_direct(\n\u001b[0;32m---> 67\u001b[0;31m Gn[i], Gn[j], node_label, edge_label, labeled, weight)\n\u001b[0m\u001b[1;32m 68\u001b[0m \u001b[0mKmatrix\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mKmatrix\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 69\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/media/ljia/DATA/research-repo/codes/Linlin/py-graph/pygraph/kernels/untilnWalkKernel.py\u001b[0m in \u001b[0;36m_untilnwalkkernel_direct\u001b[0;34m(G1, G2, node_label, edge_label, labeled, weight)\u001b[0m\n\u001b[1;32m 129\u001b[0m \u001b[0;32mfor\u001b[0m \u001b[0mi\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mj\u001b[0m \u001b[0;32min\u001b[0m \u001b[0mproduct\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mgp\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mgp\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 130\u001b[0m \u001b[0mmat_tmp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mT\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mnp\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mexp\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mweight\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mD\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;34m*\u001b[0m \u001b[0mT\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mI\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 131\u001b[0;31m \u001b[0mkernel\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkernel\u001b[0m \u001b[0;34m+\u001b[0m \u001b[0mmat_tmp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mi\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0mj\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 132\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 133\u001b[0m \u001b[0;31m# from matplotlib import pyplot as plt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;32m/usr/local/lib/python3.5/dist-packages/numpy/matrixlib/defmatrix.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, index)\u001b[0m\n\u001b[1;32m 282\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 283\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 284\u001b[0;31m \u001b[0mout\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mN\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mndarray\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m__getitem__\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mindex\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 285\u001b[0m \u001b[0;32mfinally\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 286\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;32mFalse\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n", "\u001b[0;31mIndexError\u001b[0m: index 1 is out of bounds for axis 0 with size 1" ] } ], "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.untilnWalkKernel import untilnwalkkernel\n", "\n", "datafile = '../../../../datasets/acyclic/Acyclic/dataset_bps.ds'\n", "estimator = untilnwalkkernel\n", "param_grid_precomputed = {'n': np.linspace(0, 10, 11)}\n", "param_grid = {'alpha': np.logspace(-10, 10, num = 41, 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": null, "metadata": {}, "outputs": [], "source": [ "# results\n", "\n", "# untiln kernel when h = 2\n", " lmda rmse_test std_test rmse_train std_train k_time\n", "----------- ----------- ---------- ------------ ----------- --------\n", " 1e-10 7.46524 1.71862 5.99486 0.356634 38.1447\n", " 1e-09 7.37326 1.77195 5.96155 0.374395 37.4921\n", " 1e-08 7.35105 1.78349 5.96481 0.378047 37.9971\n", " 1e-07 7.35213 1.77903 5.96728 0.382251 38.3182\n", " 1e-06 7.3524 1.77992 5.9696 0.3863 39.6428\n", " 1e-05 7.34958 1.78141 5.97114 0.39017 37.3711\n", " 0.0001 7.3513 1.78136 5.94251 0.331843 37.3967\n", " 0.001 7.35822 1.78119 5.9326 0.32534 36.7357\n", " 0.01 7.37552 1.79037 5.94089 0.34763 36.8864\n", " 0.1 7.32951 1.91346 6.42634 1.29405 36.8382\n", " 1 7.27134 2.20774 6.62425 1.2242 37.2425\n", " 10 7.49787 2.36815 6.81697 1.50182 37.8286\n", " 100 7.42887 2.64789 6.68766 1.34809 36.3701\n", " 1000 7.24914 2.65554 6.81906 1.41008 36.1695\n", " 10000 7.08183 2.6248 6.93431 1.38441 37.5723\n", "100000 8.021 3.43694 8.69813 0.909839 37.8158\n", " 1e+06 8.49625 3.6332 9.59333 0.96626 38.4688\n", " 1e+07 10.9067 3.17593 11.5642 2.07792 36.9926\n", " 1e+08 61.1524 10.4355 65.3527 13.9538 37.1321\n", " 1e+09 99.943 13.6994 98.8848 5.27014 36.7443\n", " 1e+10 100.083 13.8503 97.9168 3.22768 37.096\n" ] } ], "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 }