diff --git a/Feature Extraction1.ipynb b/Feature Extraction1.ipynb new file mode 100644 index 0000000000000000000000000000000000000000..1a4d2f46bb5fa8d9c9519f1effeff90439f1db18 --- /dev/null +++ b/Feature Extraction1.ipynb @@ -0,0 +1,274 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ] + } + ], + "source": [ + "import os\n", + "import numpy as np\n", + "import pandas as pd\n", + "import matplotlib.pyplot as plt; \n", + " \n", + "# Importing sklearn libraries\n", + "from sklearn.model_selection import GridSearchCV\n", + "from sklearn.linear_model import LogisticRegression\n", + "from sklearn.metrics import confusion_matrix, accuracy_score\n", + "import hypopt\n", + "# Importing hypopt library for grid search\n", + "from hypopt import GridSearch\n", + " \n", + "# Importing Keras libraries\n", + "from keras.utils import np_utils\n", + "from keras.models import Sequential\n", + "from keras.applications import VGG16\n", + "from keras.applications import imagenet_utils\n", + "from keras.callbacks import ModelCheckpoint\n", + "from keras.preprocessing.image import load_img\n", + "from keras.preprocessing.image import img_to_array\n", + "from keras.layers import Dense, Conv2D, MaxPooling2D\n", + "from keras.layers import Dropout, Flatten, GlobalAveragePooling2D\n", + " \n", + "import warnings\n", + "warnings.filterwarnings('ignore')" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "def create_features(dataset, pre_model):\n", + " \n", + " x_scratch = []\n", + " \n", + " # loop over the images\n", + " for imagePath in dataset:\n", + " \n", + " # load the input image and image is resized to 224x224 pixels\n", + " image = load_img(imagePath, target_size=(224, 224))\n", + " image = img_to_array(image)\n", + " \n", + " # preprocess the image by (1) expanding the dimensions and\n", + " # (2) subtracting the mean RGB pixel intensity from the\n", + " # ImageNet dataset\n", + " image = np.expand_dims(image, axis=0)\n", + " image = imagenet_utils.preprocess_input(image)\n", + " \n", + " # add the image to the batch\n", + " x_scratch.append(image)\n", + " \n", + " x = np.vstack(x_scratch)\n", + " features = pre_model.predict(x, batch_size=32)\n", + " features_flatten = features.reshape((features.shape[0], 7 * 7 * 512))\n", + " return x, features, features_flatten" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[INFO] loading network...\n", + "Model: \"vgg16\"\n", + "_________________________________________________________________\n", + "Layer (type) Output Shape Param # \n", + "=================================================================\n", + "input_1 (InputLayer) (None, None, None, 3) 0 \n", + "_________________________________________________________________\n", + "block1_conv1 (Conv2D) (None, None, None, 64) 1792 \n", + "_________________________________________________________________\n", + "block1_conv2 (Conv2D) (None, None, None, 64) 36928 \n", + "_________________________________________________________________\n", + "block1_pool (MaxPooling2D) (None, None, None, 64) 0 \n", + "_________________________________________________________________\n", + "block2_conv1 (Conv2D) (None, None, None, 128) 73856 \n", + "_________________________________________________________________\n", + "block2_conv2 (Conv2D) (None, None, None, 128) 147584 \n", + "_________________________________________________________________\n", + "block2_pool (MaxPooling2D) (None, None, None, 128) 0 \n", + "_________________________________________________________________\n", + "block3_conv1 (Conv2D) (None, None, None, 256) 295168 \n", + "_________________________________________________________________\n", + "block3_conv2 (Conv2D) (None, None, None, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_conv3 (Conv2D) (None, None, None, 256) 590080 \n", + "_________________________________________________________________\n", + "block3_pool (MaxPooling2D) (None, None, None, 256) 0 \n", + "_________________________________________________________________\n", + "block4_conv1 (Conv2D) (None, None, None, 512) 1180160 \n", + "_________________________________________________________________\n", + "block4_conv2 (Conv2D) (None, None, None, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_conv3 (Conv2D) (None, None, None, 512) 2359808 \n", + "_________________________________________________________________\n", + "block4_pool (MaxPooling2D) (None, None, None, 512) 0 \n", + "_________________________________________________________________\n", + "block5_conv1 (Conv2D) (None, None, None, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv2 (Conv2D) (None, None, None, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_conv3 (Conv2D) (None, None, None, 512) 2359808 \n", + "_________________________________________________________________\n", + "block5_pool (MaxPooling2D) (None, None, None, 512) 0 \n", + "=================================================================\n", + "Total params: 14,714,688\n", + "Trainable params: 14,714,688\n", + "Non-trainable params: 0\n", + "_________________________________________________________________\n" + ] + } + ], + "source": [ + "# load the VGG16 network\n", + "print(\"[INFO] loading network...\")\n", + " \n", + "# chop the top dense layers, include_top=False\n", + "model = VGG16(weights=\"imagenet\", include_top=False)\n", + "model.summary()" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "import h5py" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "<HDF5 file \"pgm_pro.h5\" (mode r)>" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f = h5py.File('pgm_pro.h5', 'r')\n", + "f" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['x']" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "list(f.keys())" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(262144, 96, 96, 3)" + ] + }, + "execution_count": 7, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "d=f['x']\n", + "d.shape" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "x_scratch = []\n", + "for image in d:\n", + " image = np.expand_dims(image, axis=0)\n", + " image = imagenet_utils.preprocess_input(image)\n", + " \n", + " # add the image to the batch\n", + " x_scratch.append(image)\n", + " \n", + "x = np.vstack(x_scratch)\n", + "features = pre_model.predict(x, batch_size=32)\n", + "features_flatten = features.reshape((features.shape[0], 7 * 7 * 512))\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "print(x.shape,features.shape,features_flatten.shape)" + ] + }, + { + "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.7.3" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/PGM_ANN(Final Updated).ipynb b/PGM_ANN(Final Updated).ipynb new file mode 100644 index 0000000000000000000000000000000000000000..5b48172793a9278cfff565c9af59156c102a82f2 --- /dev/null +++ b/PGM_ANN(Final Updated).ipynb @@ -0,0 +1,2036 @@ +{ + "nbformat": 4, + "nbformat_minor": 0, + "metadata": { + "colab": { + "name": "PGM_ANN.ipynb", + "provenance": [], + "collapsed_sections": [] + }, + "kernelspec": { + "name": "python3", + "display_name": "Python 3" + }, + "accelerator": "GPU" + }, + "cells": [ + { + "cell_type": "code", + "metadata": { + "id": "upSABhFsRmeu", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from google.colab import drive" + ], + "execution_count": 1, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "D3YYQvnTRqPJ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 124 + }, + "outputId": "2e278461-72cb-40cd-a730-1894e52eb642" + }, + "source": [ + "drive.mount('/content/drive')" + ], + "execution_count": 2, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Go to this URL in a browser: https://accounts.google.com/o/oauth2/auth?client_id=947318989803-6bn6qk8qdgf4n4g3pfee6491hc0brc4i.apps.googleusercontent.com&redirect_uri=urn%3aietf%3awg%3aoauth%3a2.0%3aoob&response_type=code&scope=email%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdocs.test%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive%20https%3a%2f%2fwww.googleapis.com%2fauth%2fdrive.photos.readonly%20https%3a%2f%2fwww.googleapis.com%2fauth%2fpeopleapi.readonly\n", + "\n", + "Enter your authorization code:\n", + "··········\n", + "Mounted at /content/drive\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "tVB6gSdsRtjm", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import numpy as np\n", + "import pandas as pd" + ], + "execution_count": 3, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "RVaWZXPeR--G", + "colab_type": "code", + "colab": {} + }, + "source": [ + "df = pd.read_csv(\"/content/drive/My Drive/final1.csv\")" + ], + "execution_count": 4, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "T2x_ybiySDkS", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 257 + }, + "outputId": "0db16ca4-0d66-46db-a678-70205b2c17c6" + }, + "source": [ + "df.head()" + ], + "execution_count": 5, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Spine_image</th>\n", + " <th>L1_grade</th>\n", + " <th>L1_case</th>\n", + " <th>L2_grade</th>\n", + " <th>L2_case</th>\n", + " <th>L3_grade</th>\n", + " <th>L3_case</th>\n", + " <th>L4_grade</th>\n", + " <th>L4_case</th>\n", + " <th>L5_grade</th>\n", + " <th>L5_case</th>\n", + " <th>principal component 1</th>\n", + " <th>principal component 2</th>\n", + " <th>principal component 3</th>\n", + " <th>principal component 4</th>\n", + " <th>principal component 5</th>\n", + " <th>y</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>image001</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>-3.944886</td>\n", + " <td>107.638733</td>\n", + " <td>-8.037814</td>\n", + " <td>-59.901740</td>\n", + " <td>-24.724990</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>image002</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-10.738955</td>\n", + " <td>464.834864</td>\n", + " <td>163.544708</td>\n", + " <td>-97.795141</td>\n", + " <td>-236.564452</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>image003</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>-891.319221</td>\n", + " <td>-379.038651</td>\n", + " <td>-209.431202</td>\n", + " <td>-196.246050</td>\n", + " <td>-60.440237</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>image004</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>-2.153575</td>\n", + " <td>70.941242</td>\n", + " <td>46.629794</td>\n", + " <td>-90.688273</td>\n", + " <td>-33.238924</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>image005</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-16.248750</td>\n", + " <td>27.203317</td>\n", + " <td>-57.292098</td>\n", + " <td>16.494128</td>\n", + " <td>14.669335</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Spine_image L1_grade ... principal component 5 y\n", + "0 image001 1 ... -24.724990 0\n", + "1 image002 0 ... -236.564452 0\n", + "2 image003 1 ... -60.440237 0\n", + "3 image004 0 ... -33.238924 0\n", + "4 image005 1 ... 14.669335 0\n", + "\n", + "[5 rows x 17 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 5 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "mUEaceMAZhmN", + "colab_type": "code", + "colab": {} + }, + "source": [ + "df2 = df" + ], + "execution_count": 6, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "EgOEJqR3Yswg", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from sklearn.preprocessing import LabelEncoder\n", + "l = LabelEncoder()\n", + "df2[\"Spine_image\"] = l.fit_transform(df2[\"Spine_image\"])" + ], + "execution_count": 7, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "pgce4cNTSMNB", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "52f5d8ac-e086-4461-c27b-74ca379551d4" + }, + "source": [ + "from keras.models import Sequential\n", + "from keras.layers import Dense, Flatten, Dropout\n", + "from keras.utils import to_categorical" + ], + "execution_count": 8, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Using TensorFlow backend.\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "orFVRe9IVa5Q", + "colab_type": "code", + "colab": {} + }, + "source": [ + "X = df.drop([\"y\"],axis=1)\n", + "y = df[\"y\"]" + ], + "execution_count": 9, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "hOtutCZHdzh5", + "colab_type": "code", + "colab": {} + }, + "source": [ + "from sklearn.model_selection import train_test_split\n", + "X_train, X_test, y_train, y_test = train_test_split(df2, y, test_size=0.3, random_state=3)" + ], + "execution_count": 10, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "pqLe6Pl8V-sb", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 1000 + }, + "outputId": "78cef87e-6363-48ed-90a3-8c9f42e9af42" + }, + "source": [ + "classifier = Sequential()\n", + "\n", + "classifier.add(Dense(output_dim=10, init='uniform', activation='relu', input_dim=17))\n", + "\n", + "classifier.add(Dense(output_dim=1, init='uniform', activation='sigmoid'))\n", + "\n", + "classifier.compile(optimizer='adam', loss='binary_crossentropy', metrics = ['accuracy'])\n", + "\n", + "history = classifier.fit(X_train, y_train, batch_size=1, epochs=100, verbose=1)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:3: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(activation=\"relu\", input_dim=17, units=10, kernel_initializer=\"uniform\")`\n", + " This is separate from the ipykernel package so we can avoid doing imports until\n", + "/usr/local/lib/python3.6/dist-packages/ipykernel_launcher.py:5: UserWarning: Update your `Dense` call to the Keras 2 API: `Dense(activation=\"sigmoid\", units=1, kernel_initializer=\"uniform\")`\n", + " \"\"\"\n" + ], + "name": "stderr" + }, + { + "output_type": "stream", + "text": [ + "Epoch 1/100\n", + "10/10 [==============================] - 2s 179ms/step - loss: 0.9500 - accuracy: 0.5000\n", + "Epoch 2/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.7536 - accuracy: 0.6000\n", + "Epoch 3/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.5902 - accuracy: 0.7000\n", + "Epoch 4/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.4966 - accuracy: 0.7000\n", + "Epoch 5/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.4336 - accuracy: 0.8000\n", + "Epoch 6/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.3902 - accuracy: 0.8000\n", + "Epoch 7/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.3564 - accuracy: 0.8000\n", + "Epoch 8/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.3318 - accuracy: 0.8000\n", + "Epoch 9/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.3162 - accuracy: 0.9000\n", + "Epoch 10/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.3026 - accuracy: 0.9000\n", + "Epoch 11/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.2883 - accuracy: 0.9000\n", + "Epoch 12/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.2784 - accuracy: 0.9000\n", + "Epoch 13/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.2721 - accuracy: 0.9000\n", + "Epoch 14/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.2586 - accuracy: 0.9000\n", + "Epoch 15/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.2545 - accuracy: 0.9000\n", + "Epoch 16/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.2441 - accuracy: 1.0000\n", + "Epoch 17/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.2371 - accuracy: 1.0000\n", + "Epoch 18/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.2256 - accuracy: 1.0000\n", + "Epoch 19/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.2294 - accuracy: 0.9000\n", + "Epoch 20/100\n", + "10/10 [==============================] - 0s 5ms/step - loss: 0.2211 - accuracy: 0.9000\n", + "Epoch 21/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.2163 - accuracy: 1.0000\n", + "Epoch 22/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.2091 - accuracy: 1.0000\n", + "Epoch 23/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.2024 - accuracy: 1.0000\n", + "Epoch 24/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.1895 - accuracy: 1.0000\n", + "Epoch 25/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.1828 - accuracy: 1.0000\n", + "Epoch 26/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.1742 - accuracy: 1.0000\n", + "Epoch 27/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.1731 - accuracy: 0.9000\n", + "Epoch 28/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.1706 - accuracy: 0.9000\n", + "Epoch 29/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.1635 - accuracy: 1.0000\n", + "Epoch 30/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.1586 - accuracy: 1.0000\n", + "Epoch 31/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.1545 - accuracy: 1.0000\n", + "Epoch 32/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.1509 - accuracy: 0.9000\n", + "Epoch 33/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.1455 - accuracy: 1.0000\n", + "Epoch 34/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.1425 - accuracy: 1.0000\n", + "Epoch 35/100\n", + "10/10 [==============================] - 0s 5ms/step - loss: 0.1380 - accuracy: 1.0000\n", + "Epoch 36/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0863 - accuracy: 1.0000\n", + "Epoch 37/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0748 - accuracy: 1.0000\n", + "Epoch 38/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0603 - accuracy: 1.0000\n", + "Epoch 39/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0533 - accuracy: 1.0000\n", + "Epoch 40/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0490 - accuracy: 1.0000\n", + "Epoch 41/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0447 - accuracy: 1.0000\n", + "Epoch 42/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0418 - accuracy: 1.0000\n", + "Epoch 43/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0398 - accuracy: 1.0000\n", + "Epoch 44/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0371 - accuracy: 1.0000\n", + "Epoch 45/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0350 - accuracy: 1.0000\n", + "Epoch 46/100\n", + "10/10 [==============================] - 0s 5ms/step - loss: 0.0335 - accuracy: 1.0000\n", + "Epoch 47/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0318 - accuracy: 1.0000\n", + "Epoch 48/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0302 - accuracy: 1.0000\n", + "Epoch 49/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0287 - accuracy: 1.0000\n", + "Epoch 50/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0275 - accuracy: 1.0000\n", + "Epoch 51/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0261 - accuracy: 1.0000\n", + "Epoch 52/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0249 - accuracy: 1.0000\n", + "Epoch 53/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0237 - accuracy: 1.0000\n", + "Epoch 54/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0228 - accuracy: 1.0000\n", + "Epoch 55/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0218 - accuracy: 1.0000\n", + "Epoch 56/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0211 - accuracy: 1.0000\n", + "Epoch 57/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0202 - accuracy: 1.0000\n", + "Epoch 58/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0193 - accuracy: 1.0000\n", + "Epoch 59/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0186 - accuracy: 1.0000\n", + "Epoch 60/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0179 - accuracy: 1.0000\n", + "Epoch 61/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0171 - accuracy: 1.0000\n", + "Epoch 62/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0167 - accuracy: 1.0000\n", + "Epoch 63/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0159 - accuracy: 1.0000\n", + "Epoch 64/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0156 - accuracy: 1.0000\n", + "Epoch 65/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0148 - accuracy: 1.0000\n", + "Epoch 66/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0142 - accuracy: 1.0000\n", + "Epoch 67/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0138 - accuracy: 1.0000\n", + "Epoch 68/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0135 - accuracy: 1.0000\n", + "Epoch 69/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0129 - accuracy: 1.0000\n", + "Epoch 70/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0125 - accuracy: 1.0000\n", + "Epoch 71/100\n", + "10/10 [==============================] - 0s 5ms/step - loss: 0.0121 - accuracy: 1.0000\n", + "Epoch 72/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0118 - accuracy: 1.0000\n", + "Epoch 73/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0113 - accuracy: 1.0000\n", + "Epoch 74/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0109 - accuracy: 1.0000\n", + "Epoch 75/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0106 - accuracy: 1.0000\n", + "Epoch 76/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0104 - accuracy: 1.0000\n", + "Epoch 77/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0099 - accuracy: 1.0000\n", + "Epoch 78/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0098 - accuracy: 1.0000\n", + "Epoch 79/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0093 - accuracy: 1.0000\n", + "Epoch 80/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0091 - accuracy: 1.0000\n", + "Epoch 81/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0088 - accuracy: 1.0000\n", + "Epoch 82/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0086 - accuracy: 1.0000\n", + "Epoch 83/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0083 - accuracy: 1.0000\n", + "Epoch 84/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0081 - accuracy: 1.0000\n", + "Epoch 85/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0078 - accuracy: 1.0000\n", + "Epoch 86/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0077 - accuracy: 1.0000\n", + "Epoch 87/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0074 - accuracy: 1.0000\n", + "Epoch 88/100\n", + "10/10 [==============================] - 0s 5ms/step - loss: 0.0072 - accuracy: 1.0000\n", + "Epoch 89/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0070 - accuracy: 1.0000\n", + "Epoch 90/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0068 - accuracy: 1.0000\n", + "Epoch 91/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0067 - accuracy: 1.0000\n", + "Epoch 92/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0065 - accuracy: 1.0000\n", + "Epoch 93/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0064 - accuracy: 1.0000\n", + "Epoch 94/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0062 - accuracy: 1.0000\n", + "Epoch 95/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0060 - accuracy: 1.0000\n", + "Epoch 96/100\n", + "10/10 [==============================] - 0s 5ms/step - loss: 0.0059 - accuracy: 1.0000\n", + "Epoch 97/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0057 - accuracy: 1.0000\n", + "Epoch 98/100\n", + "10/10 [==============================] - 0s 4ms/step - loss: 0.0056 - accuracy: 1.0000\n", + "Epoch 99/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0055 - accuracy: 1.0000\n", + "Epoch 100/100\n", + "10/10 [==============================] - 0s 3ms/step - loss: 0.0053 - accuracy: 1.0000\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ty9kiJofgqui", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 257 + }, + "outputId": "829646b4-4ebb-49ed-f906-fb4b821a4c45" + }, + "source": [ + "X_test" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Spine_image</th>\n", + " <th>L1_grade</th>\n", + " <th>L1_case</th>\n", + " <th>L2_grade</th>\n", + " <th>L2_case</th>\n", + " <th>L3_grade</th>\n", + " <th>L3_case</th>\n", + " <th>L4_grade</th>\n", + " <th>L4_case</th>\n", + " <th>L5_grade</th>\n", + " <th>L5_case</th>\n", + " <th>principal component 1</th>\n", + " <th>principal component 2</th>\n", + " <th>principal component 3</th>\n", + " <th>principal component 4</th>\n", + " <th>principal component 5</th>\n", + " <th>y</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>12</th>\n", + " <td>12</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>-0.559168</td>\n", + " <td>28.321767</td>\n", + " <td>-100.590443</td>\n", + " <td>64.962574</td>\n", + " <td>-112.833504</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>4</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-16.248750</td>\n", + " <td>27.203317</td>\n", + " <td>-57.292098</td>\n", + " <td>16.494128</td>\n", + " <td>14.669335</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-10.738955</td>\n", + " <td>464.834864</td>\n", + " <td>163.544708</td>\n", + " <td>-97.795141</td>\n", + " <td>-236.564452</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>6</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>-12.987632</td>\n", + " <td>-144.288281</td>\n", + " <td>141.487290</td>\n", + " <td>135.029870</td>\n", + " <td>95.422477</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>-891.319221</td>\n", + " <td>-379.038651</td>\n", + " <td>-209.431202</td>\n", + " <td>-196.246050</td>\n", + " <td>-60.440237</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Spine_image L1_grade ... principal component 5 y\n", + "12 12 1 ... -112.833504 1\n", + "4 4 1 ... 14.669335 0\n", + "1 1 0 ... -236.564452 0\n", + "6 6 3 ... 95.422477 1\n", + "2 2 1 ... -60.440237 0\n", + "\n", + "[5 rows x 17 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 47 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "fGGpT20_e6PS", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 104 + }, + "outputId": "60b91e7e-4004-4706-f168-bded0421bbd3" + }, + "source": [ + "classifier.predict_classes(X_test)" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "array([[1],\n", + " [0],\n", + " [0],\n", + " [1],\n", + " [1]], dtype=int32)" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 46 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "zrqobz23atD_", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 384 + }, + "outputId": "b0d73c39-da94-4ce0-f0f8-6c287d6e6992" + }, + "source": [ + "!pip install pgmpy" + ], + "execution_count": 12, + "outputs": [ + { + "output_type": "stream", + "text": [ + "Collecting pgmpy\n", + "\u001b[?25l Downloading https://files.pythonhosted.org/packages/68/6b/661a65aa7788f3aff7228ba81625c540917d656f41e3eb031c6d60b0a25d/pgmpy-0.1.10-py3-none-any.whl (339kB)\n", + "\r\u001b[K |█ | 10kB 21.7MB/s eta 0:00:01\r\u001b[K |██ | 20kB 23.7MB/s eta 0:00:01\r\u001b[K |███ | 30kB 28.3MB/s eta 0:00:01\r\u001b[K |███▉ | 40kB 32.0MB/s eta 0:00:01\r\u001b[K |████▉ | 51kB 21.4MB/s eta 0:00:01\r\u001b[K |█████▉ | 61kB 17.4MB/s eta 0:00:01\r\u001b[K |██████▊ | 71kB 16.4MB/s eta 0:00:01\r\u001b[K |███████▊ | 81kB 15.8MB/s eta 0:00:01\r\u001b[K |████████▊ | 92kB 15.1MB/s eta 0:00:01\r\u001b[K |█████████▋ | 102kB 15.4MB/s eta 0:00:01\r\u001b[K |██████████▋ | 112kB 15.4MB/s eta 0:00:01\r\u001b[K |███████████▋ | 122kB 15.4MB/s eta 0:00:01\r\u001b[K |████████████▌ | 133kB 15.4MB/s eta 0:00:01\r\u001b[K |█████████████▌ | 143kB 15.4MB/s eta 0:00:01\r\u001b[K |██████████████▌ | 153kB 15.4MB/s eta 0:00:01\r\u001b[K |███████████████▌ | 163kB 15.4MB/s eta 0:00:01\r\u001b[K |████████████████▍ | 174kB 15.4MB/s eta 0:00:01\r\u001b[K |█████████████████▍ | 184kB 15.4MB/s eta 0:00:01\r\u001b[K |██████████████████▍ | 194kB 15.4MB/s eta 0:00:01\r\u001b[K |███████████████████▎ | 204kB 15.4MB/s eta 0:00:01\r\u001b[K |████████████████████▎ | 215kB 15.4MB/s eta 0:00:01\r\u001b[K |█████████████████████▎ | 225kB 15.4MB/s eta 0:00:01\r\u001b[K |██████████████████████▏ | 235kB 15.4MB/s eta 0:00:01\r\u001b[K |███████████████████████▏ | 245kB 15.4MB/s eta 0:00:01\r\u001b[K |████████████████████████▏ | 256kB 15.4MB/s eta 0:00:01\r\u001b[K |█████████████████████████ | 266kB 15.4MB/s eta 0:00:01\r\u001b[K |██████████████████████████ | 276kB 15.4MB/s eta 0:00:01\r\u001b[K |███████████████████████████ | 286kB 15.4MB/s eta 0:00:01\r\u001b[K |████████████████████████████ | 296kB 15.4MB/s eta 0:00:01\r\u001b[K |█████████████████████████████ | 307kB 15.4MB/s eta 0:00:01\r\u001b[K |██████████████████████████████ | 317kB 15.4MB/s eta 0:00:01\r\u001b[K |███████████████████████████████ | 327kB 15.4MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▉| 337kB 15.4MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 348kB 15.4MB/s \n", + "\u001b[?25hRequirement already satisfied: networkx in /usr/local/lib/python3.6/dist-packages (from pgmpy) (2.4)\n", + "Requirement already satisfied: statsmodels in /usr/local/lib/python3.6/dist-packages (from pgmpy) (0.10.2)\n", + "Requirement already satisfied: torch in /usr/local/lib/python3.6/dist-packages (from pgmpy) (1.5.1+cu101)\n", + "Requirement already satisfied: joblib in /usr/local/lib/python3.6/dist-packages (from pgmpy) (0.15.1)\n", + "Requirement already satisfied: tqdm in /usr/local/lib/python3.6/dist-packages (from pgmpy) (4.41.1)\n", + "Requirement already satisfied: numpy in /usr/local/lib/python3.6/dist-packages (from pgmpy) (1.18.5)\n", + "Requirement already satisfied: pandas in /usr/local/lib/python3.6/dist-packages (from pgmpy) (1.0.5)\n", + "Requirement already satisfied: pyparsing in /usr/local/lib/python3.6/dist-packages (from pgmpy) (2.4.7)\n", + "Requirement already satisfied: scipy in /usr/local/lib/python3.6/dist-packages (from pgmpy) (1.4.1)\n", + "Requirement already satisfied: decorator>=4.3.0 in /usr/local/lib/python3.6/dist-packages (from networkx->pgmpy) (4.4.2)\n", + "Requirement already satisfied: patsy>=0.4.0 in /usr/local/lib/python3.6/dist-packages (from statsmodels->pgmpy) (0.5.1)\n", + "Requirement already satisfied: future in /usr/local/lib/python3.6/dist-packages (from torch->pgmpy) (0.16.0)\n", + "Requirement already satisfied: pytz>=2017.2 in /usr/local/lib/python3.6/dist-packages (from pandas->pgmpy) (2018.9)\n", + "Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.6/dist-packages (from pandas->pgmpy) (2.8.1)\n", + "Requirement already satisfied: six in /usr/local/lib/python3.6/dist-packages (from patsy>=0.4.0->statsmodels->pgmpy) (1.12.0)\n", + "Installing collected packages: pgmpy\n", + "Successfully installed pgmpy-0.1.10\n" + ], + "name": "stdout" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "QKwySM3ZpilP", + "colab_type": "code", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "PwOZep3zWBWo", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 72 + }, + "outputId": "50b1feb8-13f2-41b0-ea6d-6311ed646181" + }, + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "from pgmpy.estimators import HillClimbSearch, BicScore" + ], + "execution_count": 13, + "outputs": [ + { + "output_type": "stream", + "text": [ + "/usr/local/lib/python3.6/dist-packages/statsmodels/tools/_testing.py:19: FutureWarning: pandas.util.testing is deprecated. Use the functions in the public API at pandas.testing instead.\n", + " import pandas.util.testing as tm\n" + ], + "name": "stderr" + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "TBCQsU3EanoZ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 312 + }, + "outputId": "6cfd555e-6890-4aad-8008-93522effae64" + }, + "source": [ + "est = HillClimbSearch(df2, scoring_method=BicScore(df2))\n", + "best_model = est.estimate()\n", + "sorted(best_model.nodes())" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "['L1_case',\n", + " 'L1_grade',\n", + " 'L2_case',\n", + " 'L2_grade',\n", + " 'L3_case',\n", + " 'L3_grade',\n", + " 'L4_case',\n", + " 'L4_grade',\n", + " 'L5_case',\n", + " 'L5_grade',\n", + " 'Spine_image',\n", + " 'principal component 1',\n", + " 'principal component 2',\n", + " 'principal component 3',\n", + " 'principal component 4',\n", + " 'principal component 5',\n", + " 'y']" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 51 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "ZiOVhEG1a8yh", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "c2ab4171-d890-4cc0-deaa-1d99859db590" + }, + "source": [ + "best_model.edges()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "OutEdgeView([('L2_case', 'L2_grade'), ('L2_case', 'L1_case'), ('L5_grade', 'L5_case')])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 52 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "d5kraXXdbR53", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 35 + }, + "outputId": "1c714705-84ea-4f28-cfe0-9b222502e3d1" + }, + "source": [ + "#search a model with restriction on the number of parents:\n", + "est.estimate(max_indegree=1).edges()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "OutEdgeView([('L2_case', 'L2_grade'), ('L2_case', 'L1_case'), ('L5_grade', 'L5_case')])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 53 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "xadSMlvWbhu4", + "colab_type": "code", + "colab": {} + }, + "source": [ + "import pandas as pd\n", + "from pgmpy.models import BayesianModel\n", + "from pgmpy.estimators import BayesianEstimator" + ], + "execution_count": 14, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "WbSngY_1pyNJ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 257 + }, + "outputId": "98d0c5ab-f0f0-412a-d326-1b25277bb3cf" + }, + "source": [ + "df2.head()" + ], + "execution_count": null, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Spine_image</th>\n", + " <th>L1_grade</th>\n", + " <th>L1_case</th>\n", + " <th>L2_grade</th>\n", + " <th>L2_case</th>\n", + " <th>L3_grade</th>\n", + " <th>L3_case</th>\n", + " <th>L4_grade</th>\n", + " <th>L4_case</th>\n", + " <th>L5_grade</th>\n", + " <th>L5_case</th>\n", + " <th>principal component 1</th>\n", + " <th>principal component 2</th>\n", + " <th>principal component 3</th>\n", + " <th>principal component 4</th>\n", + " <th>principal component 5</th>\n", + " <th>y</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>-3.944886</td>\n", + " <td>107.638733</td>\n", + " <td>-8.037814</td>\n", + " <td>-59.901740</td>\n", + " <td>-24.724990</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-10.738955</td>\n", + " <td>464.834864</td>\n", + " <td>163.544708</td>\n", + " <td>-97.795141</td>\n", + " <td>-236.564452</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>-891.319221</td>\n", + " <td>-379.038651</td>\n", + " <td>-209.431202</td>\n", + " <td>-196.246050</td>\n", + " <td>-60.440237</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>-2.153575</td>\n", + " <td>70.941242</td>\n", + " <td>46.629794</td>\n", + " <td>-90.688273</td>\n", + " <td>-33.238924</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>4</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-16.248750</td>\n", + " <td>27.203317</td>\n", + " <td>-57.292098</td>\n", + " <td>16.494128</td>\n", + " <td>14.669335</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Spine_image L1_grade ... principal component 5 y\n", + "0 0 1 ... -24.724990 0\n", + "1 1 0 ... -236.564452 0\n", + "2 2 1 ... -60.440237 0\n", + "3 3 0 ... -33.238924 0\n", + "4 4 1 ... 14.669335 0\n", + "\n", + "[5 rows x 17 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 55 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "7onwvOEhuf1a", + "colab_type": "code", + "colab": {} + }, + "source": [ + "#model = BayesianModel([('L1_grade', 'principal component 1'), ('L2_grade', 'principal component 1'),\n", + "# ('L3_grade', 'principal component 1'), ('L4_grade', 'principal component 1'),\n", + "# ('L5_grade', 'principal component 1'), ('L1_grade', 'principal component 2'),\n", + "# ('L2_grade', 'principal component 2'), ('L3_grade', 'principal component 2'),\n", + "# ('L4_grade', 'principal component 2'), ('L5_grade', 'principal component 2'),\n", + "# ('L1_grade', 'principal component 3'), ('L2_grade', 'principal component 3'),\n", + "# ('L3_grade', 'principal component 3'), ('L4_grade', 'principal component 3'),\n", + "# ('L5_grade', 'principal component 3'), ('L1_grade', 'principal component 4'),\n", + "# ('L2_grade', 'principal component 4'), ('L3_grade', 'principal component 4'),\n", + "# ('L4_grade', 'principal component 4'), ('L5_grade', 'principal component 4'),\n", + "# ('L1_grade', 'principal component 5'), ('L2_grade', 'principal component 5'),\n", + "# ('L3_grade', 'principal component 5'), ('L4_grade', 'principal component 5'),\n", + "# ('L5_grade', 'principal component 5'), ('Spine_image', 'principal component 1'),\n", + "# ('Spine_image', 'principal component 2'), ('Spine_image', 'principal component 3'),\n", + "# ('Spine_image', 'principal component 4'), ('Spine_image', 'principal component 5'),\n", + "# ('Spine_image', 'L1_grade'), ('Spine_image', 'L2_grade'), ('Spine_image', 'L3_grade'),\n", + "# ('Spine_image', 'L4_grade'), ('Spine_image', 'L5_grade'), ('principal component 1','y'),\n", + "# ('principal component 2','y'), ('principal component 3','y'), ('principal component 4','y'),\n", + "# ('principal component 5','y'), ('L1_grade','y'), ('L2_grade','y'), ('L3_grade','y'), ('L4_grade','y'),\n", + "# ('L5_grade','y')])" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "R8VhiUGovjgd", + "colab_type": "code", + "colab": {} + }, + "source": [ + "model = BayesianModel([('L1_grade', 'principal component 1'), ('L2_grade', 'principal component 2'),\n", + " ('L3_grade', 'principal component 3'), ('L4_grade', 'principal component 4'),\n", + " ('L5_grade', 'principal component 5'), ('Spine_image', 'L1_grade'), ('principal component 1','y'),\n", + " ('principal component 2','y'), ('principal component 3','y'), ('principal component 4','y'), \n", + " ('principal component 5','y'), ('Spine_image', 'L2_grade'), ('Spine_image', 'L3_grade'), \n", + " ('Spine_image', 'L4_grade'), ('Spine_image', 'L5_grade')])" + ], + "execution_count": 22, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "R4Hv9kPhSgnH", + "colab_type": "code", + "colab": {} + }, + "source": [ + "df2_train, df2_test, y_train, y_test = train_test_split(df2, y, test_size=0.3, random_state=3)" + ], + "execution_count": 23, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "pT0Ntd2JzUeo", + "colab_type": "code", + "colab": {} + }, + "source": [ + "model.fit(df2, estimator = BayesianEstimator)" + ], + "execution_count": 24, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "FPJOvFe6ZkeO", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 563 + }, + "outputId": "f0c8e70f-cef5-435c-beb4-312d4dc56586" + }, + "source": [ + "df2" + ], + "execution_count": 25, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Spine_image</th>\n", + " <th>L1_grade</th>\n", + " <th>L1_case</th>\n", + " <th>L2_grade</th>\n", + " <th>L2_case</th>\n", + " <th>L3_grade</th>\n", + " <th>L3_case</th>\n", + " <th>L4_grade</th>\n", + " <th>L4_case</th>\n", + " <th>L5_grade</th>\n", + " <th>L5_case</th>\n", + " <th>principal component 1</th>\n", + " <th>principal component 2</th>\n", + " <th>principal component 3</th>\n", + " <th>principal component 4</th>\n", + " <th>principal component 5</th>\n", + " <th>y</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>-3.944886</td>\n", + " <td>107.638733</td>\n", + " <td>-8.037814</td>\n", + " <td>-59.901740</td>\n", + " <td>-24.724990</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-10.738955</td>\n", + " <td>464.834864</td>\n", + " <td>163.544708</td>\n", + " <td>-97.795141</td>\n", + " <td>-236.564452</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>-891.319221</td>\n", + " <td>-379.038651</td>\n", + " <td>-209.431202</td>\n", + " <td>-196.246050</td>\n", + " <td>-60.440237</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>-2.153575</td>\n", + " <td>70.941242</td>\n", + " <td>46.629794</td>\n", + " <td>-90.688273</td>\n", + " <td>-33.238924</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>4</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-16.248750</td>\n", + " <td>27.203317</td>\n", + " <td>-57.292098</td>\n", + " <td>16.494128</td>\n", + " <td>14.669335</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>5</th>\n", + " <td>5</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1.391008</td>\n", + " <td>-3.650913</td>\n", + " <td>22.425898</td>\n", + " <td>-59.670321</td>\n", + " <td>-0.139423</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>6</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>-12.987632</td>\n", + " <td>-144.288281</td>\n", + " <td>141.487290</td>\n", + " <td>135.029870</td>\n", + " <td>95.422477</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>7</th>\n", + " <td>7</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>7.345358</td>\n", + " <td>-30.689443</td>\n", + " <td>277.092579</td>\n", + " <td>10.189355</td>\n", + " <td>51.459336</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>8</th>\n", + " <td>8</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>-26.736264</td>\n", + " <td>-175.703005</td>\n", + " <td>183.663659</td>\n", + " <td>513.210960</td>\n", + " <td>110.557724</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>9</th>\n", + " <td>9</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>11.751301</td>\n", + " <td>-88.514314</td>\n", + " <td>371.808821</td>\n", + " <td>-327.211158</td>\n", + " <td>131.698012</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>10</th>\n", + " <td>10</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1001.843850</td>\n", + " <td>-320.711021</td>\n", + " <td>-201.867593</td>\n", + " <td>-156.010988</td>\n", + " <td>-31.607538</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>11</th>\n", + " <td>11</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-4.023713</td>\n", + " <td>35.343307</td>\n", + " <td>-73.599328</td>\n", + " <td>119.908971</td>\n", + " <td>-159.973306</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>12</th>\n", + " <td>12</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>-0.559168</td>\n", + " <td>28.321767</td>\n", + " <td>-100.590443</td>\n", + " <td>64.962574</td>\n", + " <td>-112.833504</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>13</th>\n", + " <td>13</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>-48.120533</td>\n", + " <td>315.061678</td>\n", + " <td>-313.626645</td>\n", + " <td>-16.810376</td>\n", + " <td>509.313026</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>14</th>\n", + " <td>14</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>3</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-5.498821</td>\n", + " <td>93.250721</td>\n", + " <td>-242.207626</td>\n", + " <td>144.538191</td>\n", + " <td>-253.597537</td>\n", + " <td>1</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Spine_image L1_grade ... principal component 5 y\n", + "0 0 1 ... -24.724990 0\n", + "1 1 0 ... -236.564452 0\n", + "2 2 1 ... -60.440237 0\n", + "3 3 0 ... -33.238924 0\n", + "4 4 1 ... 14.669335 0\n", + "5 5 0 ... -0.139423 1\n", + "6 6 3 ... 95.422477 1\n", + "7 7 1 ... 51.459336 0\n", + "8 8 3 ... 110.557724 1\n", + "9 9 2 ... 131.698012 1\n", + "10 10 1 ... -31.607538 1\n", + "11 11 0 ... -159.973306 1\n", + "12 12 1 ... -112.833504 1\n", + "13 13 1 ... 509.313026 0\n", + "14 14 0 ... -253.597537 1\n", + "\n", + "[15 rows x 17 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 25 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "wD6x5QIGZJNQ", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 257 + }, + "outputId": "49d42091-76ca-4ea1-9f8d-646862d5013a" + }, + "source": [ + "df2_test" + ], + "execution_count": 26, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>Spine_image</th>\n", + " <th>L1_grade</th>\n", + " <th>L1_case</th>\n", + " <th>L2_grade</th>\n", + " <th>L2_case</th>\n", + " <th>L3_grade</th>\n", + " <th>L3_case</th>\n", + " <th>L4_grade</th>\n", + " <th>L4_case</th>\n", + " <th>L5_grade</th>\n", + " <th>L5_case</th>\n", + " <th>principal component 1</th>\n", + " <th>principal component 2</th>\n", + " <th>principal component 3</th>\n", + " <th>principal component 4</th>\n", + " <th>principal component 5</th>\n", + " <th>y</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>12</th>\n", + " <td>12</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>-0.559168</td>\n", + " <td>28.321767</td>\n", + " <td>-100.590443</td>\n", + " <td>64.962574</td>\n", + " <td>-112.833504</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>4</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-16.248750</td>\n", + " <td>27.203317</td>\n", + " <td>-57.292098</td>\n", + " <td>16.494128</td>\n", + " <td>14.669335</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>0</td>\n", + " <td>0</td>\n", + " <td>-10.738955</td>\n", + " <td>464.834864</td>\n", + " <td>163.544708</td>\n", + " <td>-97.795141</td>\n", + " <td>-236.564452</td>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>6</th>\n", + " <td>6</td>\n", + " <td>3</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>1</td>\n", + " <td>-12.987632</td>\n", + " <td>-144.288281</td>\n", + " <td>141.487290</td>\n", + " <td>135.029870</td>\n", + " <td>95.422477</td>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>2</td>\n", + " <td>1</td>\n", + " <td>3</td>\n", + " <td>-891.319221</td>\n", + " <td>-379.038651</td>\n", + " <td>-209.431202</td>\n", + " <td>-196.246050</td>\n", + " <td>-60.440237</td>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " Spine_image L1_grade ... principal component 5 y\n", + "12 12 1 ... -112.833504 1\n", + "4 4 1 ... 14.669335 0\n", + "1 1 0 ... -236.564452 0\n", + "6 6 3 ... 95.422477 1\n", + "2 2 1 ... -60.440237 0\n", + "\n", + "[5 rows x 17 columns]" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 26 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "Lj4R6Yr7ZOhF", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 55 + }, + "outputId": "0211a6bd-9414-4aeb-95ac-0e1dab7fb32a" + }, + "source": [ + "model.nodes()" + ], + "execution_count": 27, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "NodeView(('L1_grade', 'principal component 1', 'L2_grade', 'principal component 2', 'L3_grade', 'principal component 3', 'L4_grade', 'principal component 4', 'L5_grade', 'principal component 5', 'Spine_image', 'y'))" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 27 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "BVBmMl996NF_", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 55 + }, + "outputId": "37dc1f56-f666-4cbc-85a1-6496f66d6e0a" + }, + "source": [ + "model.edges()" + ], + "execution_count": 29, + "outputs": [ + { + "output_type": "execute_result", + "data": { + "text/plain": [ + "OutEdgeView([('L1_grade', 'principal component 1'), ('principal component 1', 'y'), ('L2_grade', 'principal component 2'), ('principal component 2', 'y'), ('L3_grade', 'principal component 3'), ('principal component 3', 'y'), ('L4_grade', 'principal component 4'), ('principal component 4', 'y'), ('L5_grade', 'principal component 5'), ('principal component 5', 'y'), ('Spine_image', 'L1_grade'), ('Spine_image', 'L2_grade'), ('Spine_image', 'L3_grade'), ('Spine_image', 'L4_grade'), ('Spine_image', 'L5_grade')])" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 29 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "TwEn201X62G_", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 319 + }, + "outputId": "89a3a593-84b0-46ee-8716-8adee8b23375" + }, + "source": [ + "import networkx as nx\n", + "import pylab as plt\n", + "nx.draw(model, with_labels=True)\n", + "plt.show()" + ], + "execution_count": 32, + "outputs": [ + { + "output_type": "display_data", + "data": { + "image/png": "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\n", + "text/plain": [ + "<Figure size 432x288 with 1 Axes>" + ] + }, + "metadata": { + "tags": [] + } + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "7f8aL3PLh9M5", + "colab_type": "code", + "colab": { + "base_uri": "https://localhost:8080/", + "height": 219 + }, + "outputId": "6e45749a-2e55-47bb-9a9a-cbfc7f5e79df" + }, + "source": [ + "model.predict(df2_test.drop(['y','L1_case','L2_case','L3_case','L4_case','L5_case'],axis=1))" + ], + "execution_count": 28, + "outputs": [ + { + "output_type": "stream", + "text": [ + "100%|██████████| 5/5 [00:03<00:00, 1.46it/s]\n" + ], + "name": "stderr" + }, + { + "output_type": "execute_result", + "data": { + "text/html": [ + "<div>\n", + "<style scoped>\n", + " .dataframe tbody tr th:only-of-type {\n", + " vertical-align: middle;\n", + " }\n", + "\n", + " .dataframe tbody tr th {\n", + " vertical-align: top;\n", + " }\n", + "\n", + " .dataframe thead th {\n", + " text-align: right;\n", + " }\n", + "</style>\n", + "<table border=\"1\" class=\"dataframe\">\n", + " <thead>\n", + " <tr style=\"text-align: right;\">\n", + " <th></th>\n", + " <th>y</th>\n", + " </tr>\n", + " </thead>\n", + " <tbody>\n", + " <tr>\n", + " <th>0</th>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>1</th>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>2</th>\n", + " <td>0</td>\n", + " </tr>\n", + " <tr>\n", + " <th>3</th>\n", + " <td>1</td>\n", + " </tr>\n", + " <tr>\n", + " <th>4</th>\n", + " <td>0</td>\n", + " </tr>\n", + " </tbody>\n", + "</table>\n", + "</div>" + ], + "text/plain": [ + " y\n", + "0 1\n", + "1 0\n", + "2 0\n", + "3 1\n", + "4 0" + ] + }, + "metadata": { + "tags": [] + }, + "execution_count": 28 + } + ] + }, + { + "cell_type": "code", + "metadata": { + "id": "DaevF4hVmN5p", + "colab_type": "code", + "colab": {} + }, + "source": [ + "" + ], + "execution_count": null, + "outputs": [] + } + ] +} \ No newline at end of file diff --git a/image_03.png b/image_03.png new file mode 100644 index 0000000000000000000000000000000000000000..24b7ff348138ed78c18f36253e50d2ebd004fae7 Binary files /dev/null and b/image_03.png differ diff --git a/image_04.png b/image_04.png new file mode 100644 index 0000000000000000000000000000000000000000..9fd0db9b7c401e2530175f3f302cf375185e3e60 Binary files /dev/null and b/image_04.png differ diff --git a/image_05.png b/image_05.png new file mode 100644 index 0000000000000000000000000000000000000000..30423af00379ab0ef96aa57fabaa6af899726a29 Binary files /dev/null and b/image_05.png differ