├── LICENSE ├── .gitignore ├── README.md ├── simple-logreg.ipynb └── inference-45-55-600-epochs-tuned-effnet-b5-30-ep.ipynb /LICENSE: -------------------------------------------------------------------------------- 1 | This is free and unencumbered software released into the public domain. 2 | 3 | Anyone is free to copy, modify, publish, use, compile, sell, or 4 | distribute this software, either in source code form or as a compiled 5 | binary, for any purpose, commercial or non-commercial, and by any 6 | means. 7 | 8 | In jurisdictions that recognize copyright laws, the author or authors 9 | of this software dedicate any and all copyright interest in the 10 | software to the public domain. We make this dedication for the benefit 11 | of the public at large and to the detriment of our heirs and 12 | successors. We intend this dedication to be an overt act of 13 | relinquishment in perpetuity of all present and future rights to this 14 | software under copyright law. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 19 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 | OTHER DEALINGS IN THE SOFTWARE. 23 | 24 | For more information, please refer to 25 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | build/ 12 | develop-eggs/ 13 | dist/ 14 | downloads/ 15 | eggs/ 16 | .eggs/ 17 | lib/ 18 | lib64/ 19 | parts/ 20 | sdist/ 21 | var/ 22 | wheels/ 23 | pip-wheel-metadata/ 24 | share/python-wheels/ 25 | *.egg-info/ 26 | .installed.cfg 27 | *.egg 28 | MANIFEST 29 | 30 | # PyInstaller 31 | # Usually these files are written by a python script from a template 32 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 33 | *.manifest 34 | *.spec 35 | 36 | # Installer logs 37 | pip-log.txt 38 | pip-delete-this-directory.txt 39 | 40 | # Unit test / coverage reports 41 | htmlcov/ 42 | .tox/ 43 | .nox/ 44 | .coverage 45 | .coverage.* 46 | .cache 47 | nosetests.xml 48 | coverage.xml 49 | *.cover 50 | *.py,cover 51 | .hypothesis/ 52 | .pytest_cache/ 53 | 54 | # Translations 55 | *.mo 56 | *.pot 57 | 58 | # Django stuff: 59 | *.log 60 | local_settings.py 61 | db.sqlite3 62 | db.sqlite3-journal 63 | 64 | # Flask stuff: 65 | instance/ 66 | .webassets-cache 67 | 68 | # Scrapy stuff: 69 | .scrapy 70 | 71 | # Sphinx documentation 72 | docs/_build/ 73 | 74 | # PyBuilder 75 | target/ 76 | 77 | # Jupyter Notebook 78 | .ipynb_checkpoints 79 | 80 | # IPython 81 | profile_default/ 82 | ipython_config.py 83 | 84 | # pyenv 85 | .python-version 86 | 87 | # pipenv 88 | # According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. 89 | # However, in case of collaboration, if having platform-specific dependencies or dependencies 90 | # having no cross-platform support, pipenv may install dependencies that don't work, or not 91 | # install all needed dependencies. 92 | #Pipfile.lock 93 | 94 | # PEP 582; used by e.g. github.com/David-OConnor/pyflow 95 | __pypackages__/ 96 | 97 | # Celery stuff 98 | celerybeat-schedule 99 | celerybeat.pid 100 | 101 | # SageMath parsed files 102 | *.sage.py 103 | 104 | # Environments 105 | .env 106 | .venv 107 | env/ 108 | venv/ 109 | ENV/ 110 | env.bak/ 111 | venv.bak/ 112 | 113 | # Spyder project settings 114 | .spyderproject 115 | .spyproject 116 | 117 | # Rope project settings 118 | .ropeproject 119 | 120 | # mkdocs documentation 121 | /site 122 | 123 | # mypy 124 | .mypy_cache/ 125 | .dmypy.json 126 | dmypy.json 127 | 128 | # Pyre type checker 129 | .pyre/ 130 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # OSIC Pulmonary Fibrosis Progression 1st place solution 2 | 3 | ## Introduction 4 | 5 | During the [OSIC Pulmonary Fibrosis Progression](https://www.kaggle.com/c/osic-pulmonary-fibrosis-progression) the competitors were asked to predict a patient’s severity of the decline in lung function based on a CT scan of their lungs and some additional tabular data fields. The challenge was to use machine learning techniques to make a prediction with the image, metadata, and baseline FVC as input. The task wasn't simple. Due to the rather low amount of data available, it was not easy to use traditional Computer Vision approaches to model the dependency between CT scans and patient FVC values. Moreover, the public leaderboard score was based only on 15% of test data and didn't correlate with the validation at all, which made it really hard to select the best models for final submission. 6 | 7 | In general, it is really hard to explain all the subtle points of the competition here, so I recommend to visit the competition link above and read about it yourself if you are really interested! 8 | 9 | ## Training, models and final solution 10 | 11 | I have tried a lot of things, but ironically the backbone to my best solution turned out to be this [kernel](https://www.kaggle.com/khoongweihao/efficientnets-quantile-regression-inference) :) 12 | 13 | Speaking about my final solution, here is what I have done to achieve this score. Firstly, I trained both models (Quantile Regression + EfficientNet b5) from scratch. For both models, I lowered the number of epochs. For effnet I decided to train for 30 epochs and for quantile regression for 600 epochs. Then, I changed the architecture of Quantile Regression a bit, because on validation my architecture worked a bit better. Apart from that, I removed all the "Percent" related features for both models, it turned out that it gave a huge boost on private lb for me. The hardest decision was how to choose the weights for the blend. Well, I just decided to give a slightly higher weight to Quantile Regression because for me it seemed to work better. Finally, I did some more improvements for the backbone notebook, for example, there was a part with the quantile selection based on the best loglikelihood score for the EfficientNet models. This part took ages to finish and moreover, for me, it looked like not a good decision, so I have just set the quantile to 0.5 and didn't select anything, this allowed my Inference notebooks to run in just 3 minutes total. 14 | 15 | ## How to run 16 | 17 | `effnet_b5_training_30_epochs.ipynb` - contains training pipeline for the best EfficientNet b5 model

18 | `inference-45-55-600-epochs-tuned-effnet-b5-30-ep.ipynb` - contains inference part for the kernel with the highest lb score

19 | `simple-logreg.ipynb` - contains naive approach which turned out to be in the bronze zone

20 | 21 | ## Final words 22 | 23 | Below I will attach links to my final submission notebooks, along with Medium and Kaggle writeups. 24 | 25 | [1st Place notebook](https://www.kaggle.com/artkulak/inference-45-55-600-epochs-tuned-effnet-b5-30-ep) 26 | 27 | [Bronze zone very simple solution](https://www.kaggle.com/artkulak/simple-logreg) 28 | 29 | [Kaggle writeup](https://www.kaggle.com/c/osic-pulmonary-fibrosis-progression/discussion/189346) 30 | 31 | [Medium writeup](https://medium.com/@artkulakov/how-i-achieved-the-1st-place-in-kaggle-osic-pulmonary-fibrosis-progression-competition-e410962c4edc) 32 | -------------------------------------------------------------------------------- /simple-logreg.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "code", 5 | "execution_count": 1, 6 | "metadata": { 7 | "_cell_guid": "b1076dfc-b9ad-4769-8c92-a6c4dae69d19", 8 | "_uuid": "8f2839f25d086af736a60e9eeb907d3b93b6e0e5", 9 | "execution": { 10 | "iopub.execute_input": "2020-10-05T12:23:51.286614Z", 11 | "iopub.status.busy": "2020-10-05T12:23:51.285687Z", 12 | "iopub.status.idle": "2020-10-05T12:23:52.299003Z", 13 | "shell.execute_reply": "2020-10-05T12:23:52.298169Z" 14 | }, 15 | "papermill": { 16 | "duration": 1.030385, 17 | "end_time": "2020-10-05T12:23:52.299142", 18 | "exception": false, 19 | "start_time": "2020-10-05T12:23:51.268757", 20 | "status": "completed" 21 | }, 22 | "tags": [] 23 | }, 24 | "outputs": [], 25 | "source": [ 26 | "import numpy as np\n", 27 | "import pandas as pd\n", 28 | "from sklearn.preprocessing import LabelEncoder\n", 29 | "import matplotlib.pyplot as plt\n", 30 | "import os\n", 31 | "from pathlib import Path\n", 32 | "from sklearn.model_selection import KFold\n", 33 | "from sklearn.metrics import mean_absolute_error\n", 34 | "\n", 35 | "le = LabelEncoder()\n", 36 | "ROOT = Path(\"../input/osic-pulmonary-fibrosis-progression\")" 37 | ] 38 | }, 39 | { 40 | "cell_type": "code", 41 | "execution_count": 2, 42 | "metadata": { 43 | "execution": { 44 | "iopub.execute_input": "2020-10-05T12:23:52.326476Z", 45 | "iopub.status.busy": "2020-10-05T12:23:52.325571Z", 46 | "iopub.status.idle": "2020-10-05T12:23:52.350858Z", 47 | "shell.execute_reply": "2020-10-05T12:23:52.350079Z" 48 | }, 49 | "papermill": { 50 | "duration": 0.041858, 51 | "end_time": "2020-10-05T12:23:52.350977", 52 | "exception": false, 53 | "start_time": "2020-10-05T12:23:52.309119", 54 | "status": "completed" 55 | }, 56 | "tags": [] 57 | }, 58 | "outputs": [], 59 | "source": [ 60 | "train = pd.read_csv(ROOT / 'train.csv')\n", 61 | "test = pd.read_csv(ROOT / 'test.csv')\n", 62 | "sub = pd.read_csv(ROOT / 'sample_submission.csv')" 63 | ] 64 | }, 65 | { 66 | "cell_type": "code", 67 | "execution_count": 3, 68 | "metadata": { 69 | "execution": { 70 | "iopub.execute_input": "2020-10-05T12:23:52.431084Z", 71 | "iopub.status.busy": "2020-10-05T12:23:52.384694Z", 72 | "iopub.status.idle": "2020-10-05T12:23:52.715137Z", 73 | "shell.execute_reply": "2020-10-05T12:23:52.714377Z" 74 | }, 75 | "papermill": { 76 | "duration": 0.35549, 77 | "end_time": "2020-10-05T12:23:52.715260", 78 | "exception": false, 79 | "start_time": "2020-10-05T12:23:52.359770", 80 | "status": "completed" 81 | }, 82 | "tags": [] 83 | }, 84 | "outputs": [], 85 | "source": [ 86 | "# create training data\n", 87 | "\n", 88 | "trainData = []\n", 89 | "for p in train['Patient'].unique():\n", 90 | " patientData = train[train['Patient'] == p]\n", 91 | " firstMeasure = list(patientData.iloc[0, :].values)\n", 92 | " for i, week in enumerate(patientData['Weeks'].iloc[1:]):\n", 93 | " fvc = patientData.iloc[i, 2]\n", 94 | " trainDataPoint = firstMeasure + [week, fvc]\n", 95 | " trainData.append(trainDataPoint)\n", 96 | "trainData = pd.DataFrame(trainData)\n", 97 | "\n", 98 | "trainData.columns = ['PatientID', 'first_week', 'first_FVC', 'first_Percent', 'Age', 'Sex', 'SmokingStatus'] + ['target_week', 'target_FVC']\n", 99 | "trainData['delta_week'] = trainData['target_week'] - trainData['first_week']\n", 100 | "trainData.drop(columns = ['first_Percent', 'target_week', 'first_week'], inplace = True)" 101 | ] 102 | }, 103 | { 104 | "cell_type": "code", 105 | "execution_count": 4, 106 | "metadata": { 107 | "execution": { 108 | "iopub.execute_input": "2020-10-05T12:23:52.747748Z", 109 | "iopub.status.busy": "2020-10-05T12:23:52.746971Z", 110 | "iopub.status.idle": "2020-10-05T12:23:52.764432Z", 111 | "shell.execute_reply": "2020-10-05T12:23:52.764995Z" 112 | }, 113 | "papermill": { 114 | "duration": 0.040873, 115 | "end_time": "2020-10-05T12:23:52.765163", 116 | "exception": false, 117 | "start_time": "2020-10-05T12:23:52.724290", 118 | "status": "completed" 119 | }, 120 | "tags": [] 121 | }, 122 | "outputs": [], 123 | "source": [ 124 | "# create testing data\n", 125 | "subSplit = np.array(list(sub['Patient_Week'].apply(lambda x: x.split('_')).values))\n", 126 | "testData = []\n", 127 | "for p in np.unique(subSplit[:, 0]):\n", 128 | " patientData = test[test['Patient'] == p]\n", 129 | " firstMeasure = list(patientData.iloc[0, :].values)\n", 130 | " for week in subSplit[subSplit[:, 0] == p, 1]:\n", 131 | " testDataPoint = firstMeasure + [week]\n", 132 | " testData.append(testDataPoint)\n", 133 | "testData = pd.DataFrame(testData)\n", 134 | "testData.columns = ['PatientID', 'first_week', 'first_FVC', 'first_Percent', 'Age', 'Sex', 'SmokingStatus'] + ['target_week']\n", 135 | "\n", 136 | "testData['delta_week'] = testData['target_week'].map(int) - testData['first_week']\n", 137 | "testData.drop(columns = ['first_Percent', 'first_week'], inplace = True)" 138 | ] 139 | }, 140 | { 141 | "cell_type": "code", 142 | "execution_count": 5, 143 | "metadata": { 144 | "execution": { 145 | "iopub.execute_input": "2020-10-05T12:23:52.795129Z", 146 | "iopub.status.busy": "2020-10-05T12:23:52.794375Z", 147 | "iopub.status.idle": "2020-10-05T12:23:52.797644Z", 148 | "shell.execute_reply": "2020-10-05T12:23:52.797039Z" 149 | }, 150 | "papermill": { 151 | "duration": 0.023534, 152 | "end_time": "2020-10-05T12:23:52.797778", 153 | "exception": false, 154 | "start_time": "2020-10-05T12:23:52.774244", 155 | "status": "completed" 156 | }, 157 | "tags": [] 158 | }, 159 | "outputs": [], 160 | "source": [ 161 | "# fe engineering\n", 162 | "# trainData.drop(columns = ['PatientID'], inplace = True)\n", 163 | "# testData.drop(columns = ['PatientID'], inplace = True)\n", 164 | "\n", 165 | "trainData['Sex'] = le.fit_transform(trainData['Sex'])\n", 166 | "testData['Sex'] = le.transform(testData['Sex'])\n", 167 | "\n", 168 | "trainData['SmokingStatus'] = le.fit_transform(trainData['SmokingStatus'])\n", 169 | "testData['SmokingStatus'] = le.transform(testData['SmokingStatus'])" 170 | ] 171 | }, 172 | { 173 | "cell_type": "code", 174 | "execution_count": 6, 175 | "metadata": { 176 | "execution": { 177 | "iopub.execute_input": "2020-10-05T12:23:52.823763Z", 178 | "iopub.status.busy": "2020-10-05T12:23:52.822949Z", 179 | "iopub.status.idle": "2020-10-05T12:23:53.066779Z", 180 | "shell.execute_reply": "2020-10-05T12:23:53.066038Z" 181 | }, 182 | "papermill": { 183 | "duration": 0.259927, 184 | "end_time": "2020-10-05T12:23:53.066920", 185 | "exception": false, 186 | "start_time": "2020-10-05T12:23:52.806993", 187 | "status": "completed" 188 | }, 189 | "tags": [] 190 | }, 191 | "outputs": [], 192 | "source": [ 193 | "from sklearn.linear_model import LinearRegression\n", 194 | "from sklearn.neighbors import KNeighborsRegressor\n", 195 | "\n", 196 | "model = LinearRegression()\n", 197 | "model.fit(trainData.drop(columns = ['PatientID', 'target_FVC']), trainData['target_FVC'])\n", 198 | "prediction = model.predict(testData.drop(columns = ['PatientID', 'target_week']))" 199 | ] 200 | }, 201 | { 202 | "cell_type": "code", 203 | "execution_count": 7, 204 | "metadata": { 205 | "execution": { 206 | "iopub.execute_input": "2020-10-05T12:23:53.122787Z", 207 | "iopub.status.busy": "2020-10-05T12:23:53.107111Z", 208 | "iopub.status.idle": "2020-10-05T12:23:53.129995Z", 209 | "shell.execute_reply": "2020-10-05T12:23:53.129169Z" 210 | }, 211 | "papermill": { 212 | "duration": 0.053582, 213 | "end_time": "2020-10-05T12:23:53.130154", 214 | "exception": false, 215 | "start_time": "2020-10-05T12:23:53.076572", 216 | "status": "completed" 217 | }, 218 | "tags": [] 219 | }, 220 | "outputs": [], 221 | "source": [ 222 | "sub = []\n", 223 | "for i in range(testData.shape[0]):\n", 224 | " patient, week, pred = testData.loc[i, 'PatientID'], testData.loc[i, 'target_week'], prediction[i]\n", 225 | " confidence = 225\n", 226 | " sub.append([patient + '_' + str(week), pred, confidence])\n", 227 | "sub = pd.DataFrame(sub)\n", 228 | "sub.columns = ['Patient_Week', 'FVC', 'Confidence']" 229 | ] 230 | }, 231 | { 232 | "cell_type": "code", 233 | "execution_count": 8, 234 | "metadata": { 235 | "execution": { 236 | "iopub.execute_input": "2020-10-05T12:23:53.157395Z", 237 | "iopub.status.busy": "2020-10-05T12:23:53.156434Z", 238 | "iopub.status.idle": "2020-10-05T12:23:53.555078Z", 239 | "shell.execute_reply": "2020-10-05T12:23:53.554261Z" 240 | }, 241 | "papermill": { 242 | "duration": 0.413318, 243 | "end_time": "2020-10-05T12:23:53.555215", 244 | "exception": false, 245 | "start_time": "2020-10-05T12:23:53.141897", 246 | "status": "completed" 247 | }, 248 | "tags": [] 249 | }, 250 | "outputs": [], 251 | "source": [ 252 | "sub.to_csv('submission.csv', index=False)" 253 | ] 254 | }, 255 | { 256 | "cell_type": "code", 257 | "execution_count": null, 258 | "metadata": { 259 | "papermill": { 260 | "duration": 0.009311, 261 | "end_time": "2020-10-05T12:23:53.574285", 262 | "exception": false, 263 | "start_time": "2020-10-05T12:23:53.564974", 264 | "status": "completed" 265 | }, 266 | "tags": [] 267 | }, 268 | "outputs": [], 269 | "source": [] 270 | } 271 | ], 272 | "metadata": { 273 | "kernelspec": { 274 | "display_name": "Python 3", 275 | "language": "python", 276 | "name": "python3" 277 | }, 278 | "language_info": { 279 | "codemirror_mode": { 280 | "name": "ipython", 281 | "version": 3 282 | }, 283 | "file_extension": ".py", 284 | "mimetype": "text/x-python", 285 | "name": "python", 286 | "nbconvert_exporter": "python", 287 | "pygments_lexer": "ipython3", 288 | "version": "3.7.6" 289 | }, 290 | "papermill": { 291 | "duration": 7.463196, 292 | "end_time": "2020-10-05T12:23:53.692046", 293 | "environment_variables": {}, 294 | "exception": null, 295 | "input_path": "__notebook__.ipynb", 296 | "output_path": "__notebook__.ipynb", 297 | "parameters": {}, 298 | "start_time": "2020-10-05T12:23:46.228850", 299 | "version": "2.1.0" 300 | } 301 | }, 302 | "nbformat": 4, 303 | "nbformat_minor": 4 304 | } 305 | -------------------------------------------------------------------------------- /inference-45-55-600-epochs-tuned-effnet-b5-30-ep.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": { 6 | "papermill": { 7 | "duration": 0.045308, 8 | "end_time": "2020-10-05T09:02:17.066605", 9 | "exception": false, 10 | "start_time": "2020-10-05T09:02:17.021297", 11 | "status": "completed" 12 | }, 13 | "tags": [] 14 | }, 15 | "source": [ 16 | "# Imports" 17 | ] 18 | }, 19 | { 20 | "cell_type": "code", 21 | "execution_count": 1, 22 | "metadata": { 23 | "_kg_hide-output": true, 24 | "execution": { 25 | "iopub.execute_input": "2020-10-05T09:02:17.151799Z", 26 | "iopub.status.busy": "2020-10-05T09:02:17.150974Z", 27 | "iopub.status.idle": "2020-10-05T09:02:35.085064Z", 28 | "shell.execute_reply": "2020-10-05T09:02:35.083972Z" 29 | }, 30 | "papermill": { 31 | "duration": 17.973228, 32 | "end_time": "2020-10-05T09:02:35.085201", 33 | "exception": false, 34 | "start_time": "2020-10-05T09:02:17.111973", 35 | "status": "completed" 36 | }, 37 | "tags": [] 38 | }, 39 | "outputs": [ 40 | { 41 | "name": "stdout", 42 | "output_type": "stream", 43 | "text": [ 44 | "Looking in links: ./\r\n", 45 | "Processing /kaggle/input/kerasapplications/keras-team-keras-applications-3b180cb\r\n", 46 | "Requirement already satisfied: numpy>=1.9.1 in /opt/conda/lib/python3.7/site-packages (from Keras-Applications==1.0.8) (1.18.5)\r\n", 47 | "Requirement already satisfied: h5py in /opt/conda/lib/python3.7/site-packages (from Keras-Applications==1.0.8) (2.10.0)\r\n", 48 | "Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from h5py->Keras-Applications==1.0.8) (1.14.0)\r\n", 49 | "Building wheels for collected packages: Keras-Applications\r\n", 50 | " Building wheel for Keras-Applications (setup.py) ... \u001b[?25l-\b \b\\\b \b|\b \bdone\r\n", 51 | "\u001b[?25h Created wheel for Keras-Applications: filename=Keras_Applications-1.0.8-py3-none-any.whl size=50704 sha256=eb52f40d2c2029861b51bb8858eff96f384a865e21addd19c57a4bafcc28794d\r\n", 52 | " Stored in directory: /root/.cache/pip/wheels/f4/96/13/eccdd9391bd8df958d78851b98ec4dc207ba05b67b011eb70a\r\n", 53 | "Successfully built Keras-Applications\r\n", 54 | "Installing collected packages: Keras-Applications\r\n", 55 | "Successfully installed Keras-Applications-1.0.8\r\n", 56 | "Looking in links: ./\r\n", 57 | "Processing /kaggle/input/efficientnet/efficientnet-1.1.0\r\n", 58 | "Requirement already satisfied: keras_applications<=1.0.8,>=1.0.7 in /opt/conda/lib/python3.7/site-packages (from efficientnet==1.1.0) (1.0.8)\r\n", 59 | "Requirement already satisfied: scikit-image in /opt/conda/lib/python3.7/site-packages (from efficientnet==1.1.0) (0.16.2)\r\n", 60 | "Requirement already satisfied: h5py in /opt/conda/lib/python3.7/site-packages (from keras_applications<=1.0.8,>=1.0.7->efficientnet==1.1.0) (2.10.0)\r\n", 61 | "Requirement already satisfied: numpy>=1.9.1 in /opt/conda/lib/python3.7/site-packages (from keras_applications<=1.0.8,>=1.0.7->efficientnet==1.1.0) (1.18.5)\r\n", 62 | "Requirement already satisfied: scipy>=0.19.0 in /opt/conda/lib/python3.7/site-packages (from scikit-image->efficientnet==1.1.0) (1.4.1)\r\n", 63 | "Requirement already satisfied: matplotlib!=3.0.0,>=2.0.0 in /opt/conda/lib/python3.7/site-packages (from scikit-image->efficientnet==1.1.0) (3.2.1)\r\n", 64 | "Requirement already satisfied: networkx>=2.0 in /opt/conda/lib/python3.7/site-packages (from scikit-image->efficientnet==1.1.0) (2.4)\r\n", 65 | "Requirement already satisfied: pillow>=4.3.0 in /opt/conda/lib/python3.7/site-packages (from scikit-image->efficientnet==1.1.0) (7.2.0)\r\n", 66 | "Requirement already satisfied: imageio>=2.3.0 in /opt/conda/lib/python3.7/site-packages (from scikit-image->efficientnet==1.1.0) (2.8.0)\r\n", 67 | "Requirement already satisfied: PyWavelets>=0.4.0 in /opt/conda/lib/python3.7/site-packages (from scikit-image->efficientnet==1.1.0) (1.1.1)\r\n", 68 | "Requirement already satisfied: six in /opt/conda/lib/python3.7/site-packages (from h5py->keras_applications<=1.0.8,>=1.0.7->efficientnet==1.1.0) (1.14.0)\r\n", 69 | "Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.7/site-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->efficientnet==1.1.0) (0.10.0)\r\n", 70 | "Requirement already satisfied: kiwisolver>=1.0.1 in /opt/conda/lib/python3.7/site-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->efficientnet==1.1.0) (1.2.0)\r\n", 71 | "Requirement already satisfied: pyparsing!=2.0.4,!=2.1.2,!=2.1.6,>=2.0.1 in /opt/conda/lib/python3.7/site-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->efficientnet==1.1.0) (2.4.7)\r\n", 72 | "Requirement already satisfied: python-dateutil>=2.1 in /opt/conda/lib/python3.7/site-packages (from matplotlib!=3.0.0,>=2.0.0->scikit-image->efficientnet==1.1.0) (2.8.1)\r\n", 73 | "Requirement already satisfied: decorator>=4.3.0 in /opt/conda/lib/python3.7/site-packages (from networkx>=2.0->scikit-image->efficientnet==1.1.0) (4.4.2)\r\n", 74 | "Building wheels for collected packages: efficientnet\r\n", 75 | " Building wheel for efficientnet (setup.py) ... \u001b[?25l-\b \b\\\b \bdone\r\n", 76 | "\u001b[?25h Created wheel for efficientnet: filename=efficientnet-1.1.0-py3-none-any.whl size=14141 sha256=8e595e4c423f4523eed3a875b4096d29947a6f6a2adf4575d0870f0a3c30e205\r\n", 77 | " Stored in directory: /root/.cache/pip/wheels/24/f5/31/3cc20871288fe532128224a3f5af7b4d67efb9835bd5683522\r\n", 78 | "Successfully built efficientnet\r\n", 79 | "Installing collected packages: efficientnet\r\n", 80 | "Successfully installed efficientnet-1.1.0\r\n" 81 | ] 82 | } 83 | ], 84 | "source": [ 85 | "!pip install ../input/kerasapplications/keras-team-keras-applications-3b180cb -f ./ --no-index\n", 86 | "!pip install ../input/efficientnet/efficientnet-1.1.0/ -f ./ --no-index" 87 | ] 88 | }, 89 | { 90 | "cell_type": "code", 91 | "execution_count": 2, 92 | "metadata": { 93 | "_cell_guid": "79c7e3d0-c299-4dcb-8224-4455121ee9b0", 94 | "_uuid": "d629ff2d2480ee46fbb7e2d37f6b5fab8052498a", 95 | "execution": { 96 | "iopub.execute_input": "2020-10-05T09:02:35.177202Z", 97 | "iopub.status.busy": "2020-10-05T09:02:35.176215Z", 98 | "iopub.status.idle": "2020-10-05T09:02:41.410549Z", 99 | "shell.execute_reply": "2020-10-05T09:02:41.409905Z" 100 | }, 101 | "papermill": { 102 | "duration": 6.283714, 103 | "end_time": "2020-10-05T09:02:41.410703", 104 | "exception": false, 105 | "start_time": "2020-10-05T09:02:35.126989", 106 | "status": "completed" 107 | }, 108 | "tags": [] 109 | }, 110 | "outputs": [], 111 | "source": [ 112 | "import os\n", 113 | "import cv2\n", 114 | "import pydicom\n", 115 | "import pandas as pd\n", 116 | "import numpy as np \n", 117 | "import tensorflow as tf \n", 118 | "import matplotlib.pyplot as plt \n", 119 | "import random\n", 120 | "from tqdm.notebook import tqdm \n", 121 | "from sklearn.model_selection import train_test_split, KFold\n", 122 | "from sklearn.metrics import mean_absolute_error\n", 123 | "from tensorflow_addons.optimizers import RectifiedAdam\n", 124 | "from tensorflow.keras import Model\n", 125 | "import tensorflow.keras.backend as K\n", 126 | "import tensorflow.keras.layers as L\n", 127 | "import tensorflow.keras.models as M\n", 128 | "from tensorflow.keras.optimizers import Nadam\n", 129 | "import seaborn as sns\n", 130 | "from PIL import Image\n", 131 | "\n", 132 | "def seed_everything(seed=2020):\n", 133 | " random.seed(seed)\n", 134 | " os.environ['PYTHONHASHSEED'] = str(seed)\n", 135 | " np.random.seed(seed)\n", 136 | " tf.random.set_seed(seed)\n", 137 | " \n", 138 | "seed_everything(42)" 139 | ] 140 | }, 141 | { 142 | "cell_type": "code", 143 | "execution_count": 3, 144 | "metadata": { 145 | "execution": { 146 | "iopub.execute_input": "2020-10-05T09:02:41.492318Z", 147 | "iopub.status.busy": "2020-10-05T09:02:41.491628Z", 148 | "iopub.status.idle": "2020-10-05T09:02:44.419043Z", 149 | "shell.execute_reply": "2020-10-05T09:02:44.418491Z" 150 | }, 151 | "papermill": { 152 | "duration": 2.970052, 153 | "end_time": "2020-10-05T09:02:44.419163", 154 | "exception": false, 155 | "start_time": "2020-10-05T09:02:41.449111", 156 | "status": "completed" 157 | }, 158 | "tags": [] 159 | }, 160 | "outputs": [], 161 | "source": [ 162 | "config = tf.compat.v1.ConfigProto()\n", 163 | "config.gpu_options.allow_growth = True\n", 164 | "session = tf.compat.v1.Session(config=config)" 165 | ] 166 | }, 167 | { 168 | "cell_type": "code", 169 | "execution_count": 4, 170 | "metadata": { 171 | "execution": { 172 | "iopub.execute_input": "2020-10-05T09:02:44.503733Z", 173 | "iopub.status.busy": "2020-10-05T09:02:44.502875Z", 174 | "iopub.status.idle": "2020-10-05T09:02:44.513556Z", 175 | "shell.execute_reply": "2020-10-05T09:02:44.514224Z" 176 | }, 177 | "papermill": { 178 | "duration": 0.056481, 179 | "end_time": "2020-10-05T09:02:44.514363", 180 | "exception": false, 181 | "start_time": "2020-10-05T09:02:44.457882", 182 | "status": "completed" 183 | }, 184 | "tags": [] 185 | }, 186 | "outputs": [], 187 | "source": [ 188 | "train = pd.read_csv('../input/osic-pulmonary-fibrosis-progression/train.csv') " 189 | ] 190 | }, 191 | { 192 | "cell_type": "markdown", 193 | "metadata": { 194 | "papermill": { 195 | "duration": 0.038625, 196 | "end_time": "2020-10-05T09:02:44.591792", 197 | "exception": false, 198 | "start_time": "2020-10-05T09:02:44.553167", 199 | "status": "completed" 200 | }, 201 | "tags": [] 202 | }, 203 | "source": [ 204 | "# Linear Decay (based on EfficientNets)" 205 | ] 206 | }, 207 | { 208 | "cell_type": "code", 209 | "execution_count": 5, 210 | "metadata": { 211 | "execution": { 212 | "iopub.execute_input": "2020-10-05T09:02:44.679512Z", 213 | "iopub.status.busy": "2020-10-05T09:02:44.677685Z", 214 | "iopub.status.idle": "2020-10-05T09:02:44.680178Z", 215 | "shell.execute_reply": "2020-10-05T09:02:44.680652Z" 216 | }, 217 | "papermill": { 218 | "duration": 0.050531, 219 | "end_time": "2020-10-05T09:02:44.680778", 220 | "exception": false, 221 | "start_time": "2020-10-05T09:02:44.630247", 222 | "status": "completed" 223 | }, 224 | "tags": [] 225 | }, 226 | "outputs": [], 227 | "source": [ 228 | "def get_tab(df):\n", 229 | " vector = [(df.Age.values[0] - 30) / 30] \n", 230 | " \n", 231 | " if df.Sex.values[0] == 'male':\n", 232 | " vector.append(0)\n", 233 | " else:\n", 234 | " vector.append(1)\n", 235 | " \n", 236 | " if df.SmokingStatus.values[0] == 'Never smoked':\n", 237 | " vector.extend([0,0])\n", 238 | " elif df.SmokingStatus.values[0] == 'Ex-smoker':\n", 239 | " vector.extend([1,1])\n", 240 | " elif df.SmokingStatus.values[0] == 'Currently smokes':\n", 241 | " vector.extend([0,1])\n", 242 | " else:\n", 243 | " vector.extend([1,0])\n", 244 | " return np.array(vector) " 245 | ] 246 | }, 247 | { 248 | "cell_type": "code", 249 | "execution_count": 6, 250 | "metadata": { 251 | "execution": { 252 | "iopub.execute_input": "2020-10-05T09:02:44.770445Z", 253 | "iopub.status.busy": "2020-10-05T09:02:44.769873Z", 254 | "iopub.status.idle": "2020-10-05T09:02:45.142054Z", 255 | "shell.execute_reply": "2020-10-05T09:02:45.141188Z" 256 | }, 257 | "papermill": { 258 | "duration": 0.422925, 259 | "end_time": "2020-10-05T09:02:45.142210", 260 | "exception": false, 261 | "start_time": "2020-10-05T09:02:44.719285", 262 | "status": "completed" 263 | }, 264 | "tags": [] 265 | }, 266 | "outputs": [ 267 | { 268 | "data": { 269 | "application/vnd.jupyter.widget-view+json": { 270 | "model_id": "f30423f9d7cf4780a01f51dde8ae36e3", 271 | "version_major": 2, 272 | "version_minor": 0 273 | }, 274 | "text/plain": [ 275 | "HBox(children=(FloatProgress(value=1.0, bar_style='info', max=1.0), HTML(value='')))" 276 | ] 277 | }, 278 | "metadata": {}, 279 | "output_type": "display_data" 280 | }, 281 | { 282 | "name": "stderr", 283 | "output_type": "stream", 284 | "text": [ 285 | "/opt/conda/lib/python3.7/site-packages/ipykernel_launcher.py:9: FutureWarning: `rcond` parameter will change to the default of machine precision times ``max(M, N)`` where M and N are the input matrix dimensions.\n", 286 | "To use the future default and silence this warning we advise to pass `rcond=None`, to keep using the old, explicitly pass `rcond=-1`.\n", 287 | " if __name__ == '__main__':\n" 288 | ] 289 | }, 290 | { 291 | "name": "stdout", 292 | "output_type": "stream", 293 | "text": [ 294 | "\n" 295 | ] 296 | } 297 | ], 298 | "source": [ 299 | "A = {} \n", 300 | "TAB = {} \n", 301 | "P = [] \n", 302 | "for i, p in tqdm(enumerate(train.Patient.unique())):\n", 303 | " sub = train.loc[train.Patient == p, :] \n", 304 | " fvc = sub.FVC.values\n", 305 | " weeks = sub.Weeks.values\n", 306 | " c = np.vstack([weeks, np.ones(len(weeks))]).T\n", 307 | " a, b = np.linalg.lstsq(c, fvc)[0]\n", 308 | " \n", 309 | " A[p] = a\n", 310 | " TAB[p] = get_tab(sub)\n", 311 | " P.append(p)" 312 | ] 313 | }, 314 | { 315 | "cell_type": "markdown", 316 | "metadata": { 317 | "papermill": { 318 | "duration": 0.041692, 319 | "end_time": "2020-10-05T09:02:45.238864", 320 | "exception": false, 321 | "start_time": "2020-10-05T09:02:45.197172", 322 | "status": "completed" 323 | }, 324 | "tags": [] 325 | }, 326 | "source": [ 327 | "## CNN for coeff prediction" 328 | ] 329 | }, 330 | { 331 | "cell_type": "code", 332 | "execution_count": 7, 333 | "metadata": { 334 | "execution": { 335 | "iopub.execute_input": "2020-10-05T09:02:45.325087Z", 336 | "iopub.status.busy": "2020-10-05T09:02:45.324310Z", 337 | "iopub.status.idle": "2020-10-05T09:02:45.328316Z", 338 | "shell.execute_reply": "2020-10-05T09:02:45.327833Z" 339 | }, 340 | "papermill": { 341 | "duration": 0.049175, 342 | "end_time": "2020-10-05T09:02:45.328416", 343 | "exception": false, 344 | "start_time": "2020-10-05T09:02:45.279241", 345 | "status": "completed" 346 | }, 347 | "tags": [] 348 | }, 349 | "outputs": [], 350 | "source": [ 351 | "def get_img(path):\n", 352 | " d = pydicom.dcmread(path)\n", 353 | " return cv2.resize(d.pixel_array / 2**11, (512, 512))" 354 | ] 355 | }, 356 | { 357 | "cell_type": "code", 358 | "execution_count": 8, 359 | "metadata": { 360 | "execution": { 361 | "iopub.execute_input": "2020-10-05T09:02:45.423416Z", 362 | "iopub.status.busy": "2020-10-05T09:02:45.422727Z", 363 | "iopub.status.idle": "2020-10-05T09:02:45.426079Z", 364 | "shell.execute_reply": "2020-10-05T09:02:45.426606Z" 365 | }, 366 | "papermill": { 367 | "duration": 0.058362, 368 | "end_time": "2020-10-05T09:02:45.426765", 369 | "exception": false, 370 | "start_time": "2020-10-05T09:02:45.368403", 371 | "status": "completed" 372 | }, 373 | "tags": [] 374 | }, 375 | "outputs": [], 376 | "source": [ 377 | "from tensorflow.keras.utils import Sequence\n", 378 | "\n", 379 | "class IGenerator(Sequence):\n", 380 | " BAD_ID = ['ID00011637202177653955184', 'ID00052637202186188008618']\n", 381 | " def __init__(self, keys, a, tab, batch_size=32):\n", 382 | " self.keys = [k for k in keys if k not in self.BAD_ID]\n", 383 | " self.a = a\n", 384 | " self.tab = tab\n", 385 | " self.batch_size = batch_size\n", 386 | " \n", 387 | " self.train_data = {}\n", 388 | " for p in train.Patient.values:\n", 389 | " self.train_data[p] = os.listdir(f'../input/osic-pulmonary-fibrosis-progression/train/{p}/')\n", 390 | " \n", 391 | " def __len__(self):\n", 392 | " return 1000\n", 393 | " \n", 394 | " def __getitem__(self, idx):\n", 395 | " x = []\n", 396 | " a, tab = [], [] \n", 397 | " keys = np.random.choice(self.keys, size = self.batch_size)\n", 398 | " for k in keys:\n", 399 | " try:\n", 400 | " i = np.random.choice(self.train_data[k], size=1)[0]\n", 401 | " img = get_img(f'../input/osic-pulmonary-fibrosis-progression/train/{k}/{i}')\n", 402 | " x.append(img)\n", 403 | " a.append(self.a[k])\n", 404 | " tab.append(self.tab[k])\n", 405 | " except:\n", 406 | " print(k, i)\n", 407 | " \n", 408 | " x,a,tab = np.array(x), np.array(a), np.array(tab)\n", 409 | " x = np.expand_dims(x, axis=-1)\n", 410 | " return [x, tab] , a" 411 | ] 412 | }, 413 | { 414 | "cell_type": "code", 415 | "execution_count": 9, 416 | "metadata": { 417 | "execution": { 418 | "iopub.execute_input": "2020-10-05T09:02:45.527243Z", 419 | "iopub.status.busy": "2020-10-05T09:02:45.521989Z", 420 | "iopub.status.idle": "2020-10-05T09:03:41.144478Z", 421 | "shell.execute_reply": "2020-10-05T09:03:41.145102Z" 422 | }, 423 | "papermill": { 424 | "duration": 55.671746, 425 | "end_time": "2020-10-05T09:03:41.145253", 426 | "exception": false, 427 | "start_time": "2020-10-05T09:02:45.473507", 428 | "status": "completed" 429 | }, 430 | "tags": [] 431 | }, 432 | "outputs": [ 433 | { 434 | "name": "stdout", 435 | "output_type": "stream", 436 | "text": [ 437 | "Number of models: 1\n" 438 | ] 439 | } 440 | ], 441 | "source": [ 442 | "from tensorflow.keras.layers import (\n", 443 | " Dense, Dropout, Activation, Flatten, Input, BatchNormalization, GlobalAveragePooling2D, Add, Conv2D, AveragePooling2D, \n", 444 | " LeakyReLU, Concatenate \n", 445 | ")\n", 446 | "import efficientnet.tfkeras as efn\n", 447 | "\n", 448 | "def get_efficientnet(model, shape):\n", 449 | " models_dict = {\n", 450 | " 'b0': efn.EfficientNetB0(input_shape=shape,weights=None,include_top=False),\n", 451 | " 'b1': efn.EfficientNetB1(input_shape=shape,weights=None,include_top=False),\n", 452 | " 'b2': efn.EfficientNetB2(input_shape=shape,weights=None,include_top=False),\n", 453 | " 'b3': efn.EfficientNetB3(input_shape=shape,weights=None,include_top=False),\n", 454 | " 'b4': efn.EfficientNetB4(input_shape=shape,weights=None,include_top=False),\n", 455 | " 'b5': efn.EfficientNetB5(input_shape=shape,weights=None,include_top=False),\n", 456 | " 'b6': efn.EfficientNetB6(input_shape=shape,weights=None,include_top=False),\n", 457 | " 'b7': efn.EfficientNetB7(input_shape=shape,weights=None,include_top=False)\n", 458 | " }\n", 459 | " return models_dict[model]\n", 460 | "\n", 461 | "def build_model(shape=(512, 512, 1), model_class=None):\n", 462 | " inp = Input(shape=shape)\n", 463 | " base = get_efficientnet(model_class, shape)\n", 464 | " x = base(inp)\n", 465 | " x = GlobalAveragePooling2D()(x)\n", 466 | " inp2 = Input(shape=(4,))\n", 467 | " x2 = tf.keras.layers.GaussianNoise(0.2)(inp2)\n", 468 | " x = Concatenate()([x, x2]) \n", 469 | " x = Dropout(0.5)(x) \n", 470 | " x = Dense(1)(x)\n", 471 | " model = Model([inp, inp2] , x)\n", 472 | " \n", 473 | " weights = [w for w in os.listdir('../input/osic-model-weights') if model_class in w][0]\n", 474 | "# model.load_weights('../input/osic-model-weights/' + weights)\n", 475 | " model.load_weights('../input/effnet-b5-30epochs-1/effnet_30.h5')\n", 476 | " return model\n", 477 | "\n", 478 | "model_classes = ['b5'] #['b0','b1','b2','b3',b4','b5','b6','b7']\n", 479 | "models = [build_model(shape=(512, 512, 1), model_class=m) for m in model_classes]\n", 480 | "print('Number of models: ' + str(len(models)))" 481 | ] 482 | }, 483 | { 484 | "cell_type": "code", 485 | "execution_count": 10, 486 | "metadata": { 487 | "execution": { 488 | "iopub.execute_input": "2020-10-05T09:03:41.232814Z", 489 | "iopub.status.busy": "2020-10-05T09:03:41.231923Z", 490 | "iopub.status.idle": "2020-10-05T09:03:41.234172Z", 491 | "shell.execute_reply": "2020-10-05T09:03:41.234637Z" 492 | }, 493 | "papermill": { 494 | "duration": 0.0489, 495 | "end_time": "2020-10-05T09:03:41.234770", 496 | "exception": false, 497 | "start_time": "2020-10-05T09:03:41.185870", 498 | "status": "completed" 499 | }, 500 | "tags": [] 501 | }, 502 | "outputs": [], 503 | "source": [ 504 | "from sklearn.model_selection import train_test_split \n", 505 | "\n", 506 | "tr_p, vl_p = train_test_split(P, \n", 507 | " shuffle=True, \n", 508 | " train_size= 1) " 509 | ] 510 | }, 511 | { 512 | "cell_type": "code", 513 | "execution_count": 11, 514 | "metadata": { 515 | "execution": { 516 | "iopub.execute_input": "2020-10-05T09:03:41.320375Z", 517 | "iopub.status.busy": "2020-10-05T09:03:41.319770Z", 518 | "iopub.status.idle": "2020-10-05T09:03:41.507834Z", 519 | "shell.execute_reply": "2020-10-05T09:03:41.508365Z" 520 | }, 521 | "papermill": { 522 | "duration": 0.233191, 523 | "end_time": "2020-10-05T09:03:41.508496", 524 | "exception": false, 525 | "start_time": "2020-10-05T09:03:41.275305", 526 | "status": "completed" 527 | }, 528 | "tags": [] 529 | }, 530 | "outputs": [ 531 | { 532 | "data": { 533 | "image/png": "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\n", 534 | "text/plain": [ 535 | "
" 536 | ] 537 | }, 538 | "metadata": { 539 | "needs_background": "light" 540 | }, 541 | "output_type": "display_data" 542 | } 543 | ], 544 | "source": [ 545 | "sns.distplot(list(A.values()));" 546 | ] 547 | }, 548 | { 549 | "cell_type": "code", 550 | "execution_count": 12, 551 | "metadata": { 552 | "execution": { 553 | "iopub.execute_input": "2020-10-05T09:03:41.601132Z", 554 | "iopub.status.busy": "2020-10-05T09:03:41.600409Z", 555 | "iopub.status.idle": "2020-10-05T09:03:41.604055Z", 556 | "shell.execute_reply": "2020-10-05T09:03:41.603560Z" 557 | }, 558 | "papermill": { 559 | "duration": 0.050863, 560 | "end_time": "2020-10-05T09:03:41.604153", 561 | "exception": false, 562 | "start_time": "2020-10-05T09:03:41.553290", 563 | "status": "completed" 564 | }, 565 | "tags": [] 566 | }, 567 | "outputs": [], 568 | "source": [ 569 | "def score(fvc_true, fvc_pred, sigma):\n", 570 | " sigma_clip = np.maximum(sigma, 70) # changed from 70, trie 66.7 too\n", 571 | " delta = np.abs(fvc_true - fvc_pred)\n", 572 | " delta = np.minimum(delta, 1000)\n", 573 | " sq2 = np.sqrt(2)\n", 574 | " metric = (delta / sigma_clip)*sq2 + np.log(sigma_clip* sq2)\n", 575 | " return np.mean(metric)" 576 | ] 577 | }, 578 | { 579 | "cell_type": "code", 580 | "execution_count": 13, 581 | "metadata": { 582 | "execution": { 583 | "iopub.execute_input": "2020-10-05T09:03:41.707784Z", 584 | "iopub.status.busy": "2020-10-05T09:03:41.707072Z", 585 | "iopub.status.idle": "2020-10-05T09:04:25.837165Z", 586 | "shell.execute_reply": "2020-10-05T09:04:25.836620Z" 587 | }, 588 | "papermill": { 589 | "duration": 44.190109, 590 | "end_time": "2020-10-05T09:04:25.837283", 591 | "exception": false, 592 | "start_time": "2020-10-05T09:03:41.647174", 593 | "status": "completed" 594 | }, 595 | "tags": [] 596 | }, 597 | "outputs": [], 598 | "source": [ 599 | "subs = []\n", 600 | "for model in models:\n", 601 | "\n", 602 | " q = 0.5\n", 603 | "\n", 604 | " sub = pd.read_csv('../input/osic-pulmonary-fibrosis-progression/sample_submission.csv') \n", 605 | " test = pd.read_csv('../input/osic-pulmonary-fibrosis-progression/test.csv') \n", 606 | " A_test, B_test, P_test,W, FVC= {}, {}, {},{},{} \n", 607 | " STD, WEEK = {}, {} \n", 608 | " for p in test.Patient.unique():\n", 609 | " x = [] \n", 610 | " tab = [] \n", 611 | " ldir = os.listdir(f'../input/osic-pulmonary-fibrosis-progression/test/{p}/')\n", 612 | " for i in ldir:\n", 613 | " if int(i[:-4]) / len(ldir) < 1.1 and int(i[:-4]) / len(ldir) > -0.1:\n", 614 | " x.append(get_img(f'../input/osic-pulmonary-fibrosis-progression/test/{p}/{i}')) \n", 615 | " tab.append(get_tab(test.loc[test.Patient == p, :])) \n", 616 | " if len(x) <= 1:\n", 617 | " continue\n", 618 | " tab = np.array(tab) \n", 619 | "\n", 620 | " x = np.expand_dims(x, axis=-1) \n", 621 | " _a = model.predict([x, tab]) \n", 622 | " a = np.quantile(_a, q)\n", 623 | " A_test[p] = a\n", 624 | " B_test[p] = test.FVC.values[test.Patient == p] - a*test.Weeks.values[test.Patient == p]\n", 625 | " P_test[p] = test.Percent.values[test.Patient == p] \n", 626 | " WEEK[p] = test.Weeks.values[test.Patient == p]\n", 627 | "\n", 628 | " for k in sub.Patient_Week.values:\n", 629 | " p, w = k.split('_')\n", 630 | " w = int(w) \n", 631 | "\n", 632 | " fvc = A_test[p] * w + B_test[p]\n", 633 | " sub.loc[sub.Patient_Week == k, 'FVC'] = fvc\n", 634 | " sub.loc[sub.Patient_Week == k, 'Confidence'] = (\n", 635 | " P_test[p] - A_test[p] * abs(WEEK[p] - w) \n", 636 | " ) \n", 637 | "\n", 638 | " _sub = sub[[\"Patient_Week\",\"FVC\",\"Confidence\"]].copy()\n", 639 | " subs.append(_sub)" 640 | ] 641 | }, 642 | { 643 | "cell_type": "markdown", 644 | "metadata": { 645 | "papermill": { 646 | "duration": 0.041647, 647 | "end_time": "2020-10-05T09:04:25.921062", 648 | "exception": false, 649 | "start_time": "2020-10-05T09:04:25.879415", 650 | "status": "completed" 651 | }, 652 | "tags": [] 653 | }, 654 | "source": [ 655 | "## Averaging Predictions" 656 | ] 657 | }, 658 | { 659 | "cell_type": "code", 660 | "execution_count": 14, 661 | "metadata": { 662 | "execution": { 663 | "iopub.execute_input": "2020-10-05T09:04:26.012723Z", 664 | "iopub.status.busy": "2020-10-05T09:04:26.011917Z", 665 | "iopub.status.idle": "2020-10-05T09:04:26.032006Z", 666 | "shell.execute_reply": "2020-10-05T09:04:26.031484Z" 667 | }, 668 | "papermill": { 669 | "duration": 0.069391, 670 | "end_time": "2020-10-05T09:04:26.032114", 671 | "exception": false, 672 | "start_time": "2020-10-05T09:04:25.962723", 673 | "status": "completed" 674 | }, 675 | "tags": [] 676 | }, 677 | "outputs": [], 678 | "source": [ 679 | "N = len(subs)\n", 680 | "sub = subs[0].copy() # ref\n", 681 | "sub[\"FVC\"] = 0\n", 682 | "sub[\"Confidence\"] = 0\n", 683 | "for i in range(N):\n", 684 | " sub[\"FVC\"] += subs[0][\"FVC\"] * (1/N)\n", 685 | " sub[\"Confidence\"] += subs[0][\"Confidence\"] * (1/N)" 686 | ] 687 | }, 688 | { 689 | "cell_type": "code", 690 | "execution_count": 15, 691 | "metadata": { 692 | "execution": { 693 | "iopub.execute_input": "2020-10-05T09:04:26.123341Z", 694 | "iopub.status.busy": "2020-10-05T09:04:26.122702Z", 695 | "iopub.status.idle": "2020-10-05T09:04:26.132073Z", 696 | "shell.execute_reply": "2020-10-05T09:04:26.131603Z" 697 | }, 698 | "papermill": { 699 | "duration": 0.058087, 700 | "end_time": "2020-10-05T09:04:26.132165", 701 | "exception": false, 702 | "start_time": "2020-10-05T09:04:26.074078", 703 | "status": "completed" 704 | }, 705 | "tags": [] 706 | }, 707 | "outputs": [ 708 | { 709 | "data": { 710 | "text/html": [ 711 | "
\n", 712 | "\n", 725 | "\n", 726 | " \n", 727 | " \n", 728 | " \n", 729 | " \n", 730 | " \n", 731 | " \n", 732 | " \n", 733 | " \n", 734 | " \n", 735 | " \n", 736 | " \n", 737 | " \n", 738 | " \n", 739 | " \n", 740 | " \n", 741 | " \n", 742 | " \n", 743 | " \n", 744 | " \n", 745 | " \n", 746 | " \n", 747 | " \n", 748 | " \n", 749 | " \n", 750 | " \n", 751 | " \n", 752 | " \n", 753 | " \n", 754 | " \n", 755 | " \n", 756 | " \n", 757 | " \n", 758 | " \n", 759 | " \n", 760 | " \n", 761 | " \n", 762 | " \n", 763 | " \n", 764 | " \n", 765 | " \n", 766 | "
Patient_WeekFVCConfidence
0ID00419637202311204720264_-123089.912209140.099064
1ID00421637202311550012437_-122843.369867186.415158
2ID00422637202311677017371_-121999.601912146.274405
3ID00423637202312137826377_-123405.996907191.255810
4ID00426637202313170790466_-122967.838420114.663388
\n", 767 | "
" 768 | ], 769 | "text/plain": [ 770 | " Patient_Week FVC Confidence\n", 771 | "0 ID00419637202311204720264_-12 3089.912209 140.099064\n", 772 | "1 ID00421637202311550012437_-12 2843.369867 186.415158\n", 773 | "2 ID00422637202311677017371_-12 1999.601912 146.274405\n", 774 | "3 ID00423637202312137826377_-12 3405.996907 191.255810\n", 775 | "4 ID00426637202313170790466_-12 2967.838420 114.663388" 776 | ] 777 | }, 778 | "execution_count": 15, 779 | "metadata": {}, 780 | "output_type": "execute_result" 781 | } 782 | ], 783 | "source": [ 784 | "sub.head()" 785 | ] 786 | }, 787 | { 788 | "cell_type": "code", 789 | "execution_count": 16, 790 | "metadata": { 791 | "execution": { 792 | "iopub.execute_input": "2020-10-05T09:04:26.225603Z", 793 | "iopub.status.busy": "2020-10-05T09:04:26.224982Z", 794 | "iopub.status.idle": "2020-10-05T09:04:26.318096Z", 795 | "shell.execute_reply": "2020-10-05T09:04:26.317144Z" 796 | }, 797 | "papermill": { 798 | "duration": 0.141316, 799 | "end_time": "2020-10-05T09:04:26.318208", 800 | "exception": false, 801 | "start_time": "2020-10-05T09:04:26.176892", 802 | "status": "completed" 803 | }, 804 | "tags": [] 805 | }, 806 | "outputs": [], 807 | "source": [ 808 | "sub[[\"Patient_Week\",\"FVC\",\"Confidence\"]].to_csv(\"submission_img.csv\", index=False)" 809 | ] 810 | }, 811 | { 812 | "cell_type": "code", 813 | "execution_count": 17, 814 | "metadata": { 815 | "execution": { 816 | "iopub.execute_input": "2020-10-05T09:04:26.410304Z", 817 | "iopub.status.busy": "2020-10-05T09:04:26.409511Z", 818 | "iopub.status.idle": "2020-10-05T09:04:26.411851Z", 819 | "shell.execute_reply": "2020-10-05T09:04:26.412413Z" 820 | }, 821 | "papermill": { 822 | "duration": 0.05105, 823 | "end_time": "2020-10-05T09:04:26.412526", 824 | "exception": false, 825 | "start_time": "2020-10-05T09:04:26.361476", 826 | "status": "completed" 827 | }, 828 | "tags": [] 829 | }, 830 | "outputs": [], 831 | "source": [ 832 | "img_sub = sub[[\"Patient_Week\",\"FVC\",\"Confidence\"]].copy()" 833 | ] 834 | }, 835 | { 836 | "cell_type": "markdown", 837 | "metadata": { 838 | "papermill": { 839 | "duration": 0.042567, 840 | "end_time": "2020-10-05T09:04:26.497975", 841 | "exception": false, 842 | "start_time": "2020-10-05T09:04:26.455408", 843 | "status": "completed" 844 | }, 845 | "tags": [] 846 | }, 847 | "source": [ 848 | "# Osic-Multiple-Quantile-Regression" 849 | ] 850 | }, 851 | { 852 | "cell_type": "code", 853 | "execution_count": 18, 854 | "metadata": { 855 | "execution": { 856 | "iopub.execute_input": "2020-10-05T09:04:26.594894Z", 857 | "iopub.status.busy": "2020-10-05T09:04:26.594085Z", 858 | "iopub.status.idle": "2020-10-05T09:04:26.630770Z", 859 | "shell.execute_reply": "2020-10-05T09:04:26.631250Z" 860 | }, 861 | "papermill": { 862 | "duration": 0.090334, 863 | "end_time": "2020-10-05T09:04:26.631360", 864 | "exception": false, 865 | "start_time": "2020-10-05T09:04:26.541026", 866 | "status": "completed" 867 | }, 868 | "tags": [] 869 | }, 870 | "outputs": [ 871 | { 872 | "name": "stdout", 873 | "output_type": "stream", 874 | "text": [ 875 | "add infos\n" 876 | ] 877 | } 878 | ], 879 | "source": [ 880 | "ROOT = \"../input/osic-pulmonary-fibrosis-progression\"\n", 881 | "BATCH_SIZE=128\n", 882 | "\n", 883 | "tr = pd.read_csv(f\"{ROOT}/train.csv\")\n", 884 | "tr.drop_duplicates(keep=False, inplace=True, subset=['Patient','Weeks'])\n", 885 | "chunk = pd.read_csv(f\"{ROOT}/test.csv\")\n", 886 | "\n", 887 | "print(\"add infos\")\n", 888 | "sub = pd.read_csv(f\"{ROOT}/sample_submission.csv\")\n", 889 | "sub['Patient'] = sub['Patient_Week'].apply(lambda x:x.split('_')[0])\n", 890 | "sub['Weeks'] = sub['Patient_Week'].apply(lambda x: int(x.split('_')[-1]))\n", 891 | "sub = sub[['Patient','Weeks','Confidence','Patient_Week']]\n", 892 | "sub = sub.merge(chunk.drop('Weeks', axis=1), on=\"Patient\")" 893 | ] 894 | }, 895 | { 896 | "cell_type": "code", 897 | "execution_count": 19, 898 | "metadata": { 899 | "execution": { 900 | "iopub.execute_input": "2020-10-05T09:04:26.732054Z", 901 | "iopub.status.busy": "2020-10-05T09:04:26.731249Z", 902 | "iopub.status.idle": "2020-10-05T09:04:26.734099Z", 903 | "shell.execute_reply": "2020-10-05T09:04:26.734589Z" 904 | }, 905 | "papermill": { 906 | "duration": 0.059864, 907 | "end_time": "2020-10-05T09:04:26.734703", 908 | "exception": false, 909 | "start_time": "2020-10-05T09:04:26.674839", 910 | "status": "completed" 911 | }, 912 | "tags": [] 913 | }, 914 | "outputs": [], 915 | "source": [ 916 | "tr['WHERE'] = 'train'\n", 917 | "chunk['WHERE'] = 'val'\n", 918 | "sub['WHERE'] = 'test'\n", 919 | "data = tr.append([chunk, sub])" 920 | ] 921 | }, 922 | { 923 | "cell_type": "code", 924 | "execution_count": 20, 925 | "metadata": { 926 | "execution": { 927 | "iopub.execute_input": "2020-10-05T09:04:26.828284Z", 928 | "iopub.status.busy": "2020-10-05T09:04:26.827430Z", 929 | "iopub.status.idle": "2020-10-05T09:04:26.833477Z", 930 | "shell.execute_reply": "2020-10-05T09:04:26.833923Z" 931 | }, 932 | "papermill": { 933 | "duration": 0.055205, 934 | "end_time": "2020-10-05T09:04:26.834037", 935 | "exception": false, 936 | "start_time": "2020-10-05T09:04:26.778832", 937 | "status": "completed" 938 | }, 939 | "tags": [] 940 | }, 941 | "outputs": [ 942 | { 943 | "name": "stdout", 944 | "output_type": "stream", 945 | "text": [ 946 | "(1535, 8) (5, 8) (730, 10) (2270, 10)\n", 947 | "176 5 5 176\n" 948 | ] 949 | } 950 | ], 951 | "source": [ 952 | "print(tr.shape, chunk.shape, sub.shape, data.shape)\n", 953 | "print(tr.Patient.nunique(), chunk.Patient.nunique(), sub.Patient.nunique(), \n", 954 | " data.Patient.nunique())\n", 955 | "#" 956 | ] 957 | }, 958 | { 959 | "cell_type": "code", 960 | "execution_count": 21, 961 | "metadata": { 962 | "execution": { 963 | "iopub.execute_input": "2020-10-05T09:04:26.929964Z", 964 | "iopub.status.busy": "2020-10-05T09:04:26.929130Z", 965 | "iopub.status.idle": "2020-10-05T09:04:26.940627Z", 966 | "shell.execute_reply": "2020-10-05T09:04:26.940119Z" 967 | }, 968 | "papermill": { 969 | "duration": 0.062825, 970 | "end_time": "2020-10-05T09:04:26.940721", 971 | "exception": false, 972 | "start_time": "2020-10-05T09:04:26.877896", 973 | "status": "completed" 974 | }, 975 | "tags": [] 976 | }, 977 | "outputs": [], 978 | "source": [ 979 | "data['min_week'] = data['Weeks']\n", 980 | "data.loc[data.WHERE=='test','min_week'] = np.nan\n", 981 | "data['min_week'] = data.groupby('Patient')['min_week'].transform('min')" 982 | ] 983 | }, 984 | { 985 | "cell_type": "code", 986 | "execution_count": 22, 987 | "metadata": { 988 | "execution": { 989 | "iopub.execute_input": "2020-10-05T09:04:27.044644Z", 990 | "iopub.status.busy": "2020-10-05T09:04:27.043876Z", 991 | "iopub.status.idle": "2020-10-05T09:04:27.046933Z", 992 | "shell.execute_reply": "2020-10-05T09:04:27.046416Z" 993 | }, 994 | "papermill": { 995 | "duration": 0.062012, 996 | "end_time": "2020-10-05T09:04:27.047028", 997 | "exception": false, 998 | "start_time": "2020-10-05T09:04:26.985016", 999 | "status": "completed" 1000 | }, 1001 | "tags": [] 1002 | }, 1003 | "outputs": [], 1004 | "source": [ 1005 | "base = data.loc[data.Weeks == data.min_week]\n", 1006 | "base = base[['Patient','FVC']].copy()\n", 1007 | "base.columns = ['Patient','min_FVC']\n", 1008 | "base['nb'] = 1\n", 1009 | "base['nb'] = base.groupby('Patient')['nb'].transform('cumsum')\n", 1010 | "base = base[base.nb==1]\n", 1011 | "base.drop('nb', axis=1, inplace=True)" 1012 | ] 1013 | }, 1014 | { 1015 | "cell_type": "code", 1016 | "execution_count": 23, 1017 | "metadata": { 1018 | "execution": { 1019 | "iopub.execute_input": "2020-10-05T09:04:27.143987Z", 1020 | "iopub.status.busy": "2020-10-05T09:04:27.143130Z", 1021 | "iopub.status.idle": "2020-10-05T09:04:27.152004Z", 1022 | "shell.execute_reply": "2020-10-05T09:04:27.151508Z" 1023 | }, 1024 | "papermill": { 1025 | "duration": 0.060986, 1026 | "end_time": "2020-10-05T09:04:27.152098", 1027 | "exception": false, 1028 | "start_time": "2020-10-05T09:04:27.091112", 1029 | "status": "completed" 1030 | }, 1031 | "tags": [] 1032 | }, 1033 | "outputs": [], 1034 | "source": [ 1035 | "data = data.merge(base, on='Patient', how='left')\n", 1036 | "data['base_week'] = data['Weeks'] - data['min_week']\n", 1037 | "del base" 1038 | ] 1039 | }, 1040 | { 1041 | "cell_type": "code", 1042 | "execution_count": 24, 1043 | "metadata": { 1044 | "execution": { 1045 | "iopub.execute_input": "2020-10-05T09:04:27.250246Z", 1046 | "iopub.status.busy": "2020-10-05T09:04:27.249367Z", 1047 | "iopub.status.idle": "2020-10-05T09:04:27.256648Z", 1048 | "shell.execute_reply": "2020-10-05T09:04:27.256166Z" 1049 | }, 1050 | "papermill": { 1051 | "duration": 0.059698, 1052 | "end_time": "2020-10-05T09:04:27.256743", 1053 | "exception": false, 1054 | "start_time": "2020-10-05T09:04:27.197045", 1055 | "status": "completed" 1056 | }, 1057 | "tags": [] 1058 | }, 1059 | "outputs": [], 1060 | "source": [ 1061 | "COLS = ['Sex','SmokingStatus'] #,'Age'\n", 1062 | "FE = []\n", 1063 | "for col in COLS:\n", 1064 | " for mod in data[col].unique():\n", 1065 | " FE.append(mod)\n", 1066 | " data[mod] = (data[col] == mod).astype(int)" 1067 | ] 1068 | }, 1069 | { 1070 | "cell_type": "code", 1071 | "execution_count": 25, 1072 | "metadata": { 1073 | "execution": { 1074 | "iopub.execute_input": "2020-10-05T09:04:27.358079Z", 1075 | "iopub.status.busy": "2020-10-05T09:04:27.357262Z", 1076 | "iopub.status.idle": "2020-10-05T09:04:27.360070Z", 1077 | "shell.execute_reply": "2020-10-05T09:04:27.359560Z" 1078 | }, 1079 | "papermill": { 1080 | "duration": 0.058536, 1081 | "end_time": "2020-10-05T09:04:27.360168", 1082 | "exception": false, 1083 | "start_time": "2020-10-05T09:04:27.301632", 1084 | "status": "completed" 1085 | }, 1086 | "tags": [] 1087 | }, 1088 | "outputs": [], 1089 | "source": [ 1090 | "#\n", 1091 | "data['age'] = (data['Age'] - data['Age'].min() ) / ( data['Age'].max() - data['Age'].min() )\n", 1092 | "data['BASE'] = (data['min_FVC'] - data['min_FVC'].min() ) / ( data['min_FVC'].max() - data['min_FVC'].min() )\n", 1093 | "data['week'] = (data['base_week'] - data['base_week'].min() ) / ( data['base_week'].max() - data['base_week'].min() )\n", 1094 | "#data['percent'] = (data['Percent'] - data['Percent'].min() ) / ( data['Percent'].max() - data['Percent'].min() )\n", 1095 | "FE += ['age','week','BASE']" 1096 | ] 1097 | }, 1098 | { 1099 | "cell_type": "code", 1100 | "execution_count": 26, 1101 | "metadata": { 1102 | "execution": { 1103 | "iopub.execute_input": "2020-10-05T09:04:27.457101Z", 1104 | "iopub.status.busy": "2020-10-05T09:04:27.456211Z", 1105 | "iopub.status.idle": "2020-10-05T09:04:27.463453Z", 1106 | "shell.execute_reply": "2020-10-05T09:04:27.462971Z" 1107 | }, 1108 | "papermill": { 1109 | "duration": 0.058703, 1110 | "end_time": "2020-10-05T09:04:27.463553", 1111 | "exception": false, 1112 | "start_time": "2020-10-05T09:04:27.404850", 1113 | "status": "completed" 1114 | }, 1115 | "tags": [] 1116 | }, 1117 | "outputs": [], 1118 | "source": [ 1119 | "tr = data.loc[data.WHERE=='train']\n", 1120 | "chunk = data.loc[data.WHERE=='val']\n", 1121 | "sub = data.loc[data.WHERE=='test']\n", 1122 | "del data" 1123 | ] 1124 | }, 1125 | { 1126 | "cell_type": "code", 1127 | "execution_count": 27, 1128 | "metadata": { 1129 | "execution": { 1130 | "iopub.execute_input": "2020-10-05T09:04:27.558320Z", 1131 | "iopub.status.busy": "2020-10-05T09:04:27.557490Z", 1132 | "iopub.status.idle": "2020-10-05T09:04:27.561353Z", 1133 | "shell.execute_reply": "2020-10-05T09:04:27.560819Z" 1134 | }, 1135 | "papermill": { 1136 | "duration": 0.053164, 1137 | "end_time": "2020-10-05T09:04:27.561454", 1138 | "exception": false, 1139 | "start_time": "2020-10-05T09:04:27.508290", 1140 | "status": "completed" 1141 | }, 1142 | "tags": [] 1143 | }, 1144 | "outputs": [ 1145 | { 1146 | "data": { 1147 | "text/plain": [ 1148 | "((1535, 21), (5, 21), (730, 21))" 1149 | ] 1150 | }, 1151 | "execution_count": 27, 1152 | "metadata": {}, 1153 | "output_type": "execute_result" 1154 | } 1155 | ], 1156 | "source": [ 1157 | "tr.shape, chunk.shape, sub.shape" 1158 | ] 1159 | }, 1160 | { 1161 | "cell_type": "code", 1162 | "execution_count": 28, 1163 | "metadata": { 1164 | "execution": { 1165 | "iopub.execute_input": "2020-10-05T09:04:27.672021Z", 1166 | "iopub.status.busy": "2020-10-05T09:04:27.664694Z", 1167 | "iopub.status.idle": "2020-10-05T09:04:27.674846Z", 1168 | "shell.execute_reply": "2020-10-05T09:04:27.674335Z" 1169 | }, 1170 | "papermill": { 1171 | "duration": 0.06829, 1172 | "end_time": "2020-10-05T09:04:27.674937", 1173 | "exception": false, 1174 | "start_time": "2020-10-05T09:04:27.606647", 1175 | "status": "completed" 1176 | }, 1177 | "tags": [] 1178 | }, 1179 | "outputs": [], 1180 | "source": [ 1181 | "C1, C2 = tf.constant(70, dtype='float32'), tf.constant(1000, dtype=\"float32\")\n", 1182 | "\n", 1183 | "def score(y_true, y_pred):\n", 1184 | " tf.dtypes.cast(y_true, tf.float32)\n", 1185 | " tf.dtypes.cast(y_pred, tf.float32)\n", 1186 | " sigma = y_pred[:, 2] - y_pred[:, 0]\n", 1187 | " fvc_pred = y_pred[:, 1]\n", 1188 | " \n", 1189 | " #sigma_clip = sigma + C1\n", 1190 | " sigma_clip = tf.maximum(sigma, C1)\n", 1191 | " delta = tf.abs(y_true[:, 0] - fvc_pred)\n", 1192 | " delta = tf.minimum(delta, C2)\n", 1193 | " sq2 = tf.sqrt( tf.dtypes.cast(2, dtype=tf.float32) )\n", 1194 | " metric = (delta / sigma_clip)*sq2 + tf.math.log(sigma_clip* sq2)\n", 1195 | " return K.mean(metric)\n", 1196 | "\n", 1197 | "def qloss(y_true, y_pred):\n", 1198 | " # Pinball loss for multiple quantiles\n", 1199 | " qs = [0.2, 0.50, 0.8]\n", 1200 | " q = tf.constant(np.array([qs]), dtype=tf.float32)\n", 1201 | " e = y_true - y_pred\n", 1202 | " v = tf.maximum(q*e, (q-1)*e)\n", 1203 | " return K.mean(v)\n", 1204 | "\n", 1205 | "def mloss(_lambda):\n", 1206 | " def loss(y_true, y_pred):\n", 1207 | " return _lambda * qloss(y_true, y_pred) + (1 - _lambda)*score(y_true, y_pred)\n", 1208 | " return loss\n", 1209 | "\n", 1210 | "def make_model(nh):\n", 1211 | " z = L.Input((nh,), name=\"Patient\")\n", 1212 | " x = L.Dense(100, activation=\"relu\", name=\"d1\")(z)\n", 1213 | " x = L.Dense(100, activation=\"relu\", name=\"d2\")(x)\n", 1214 | " #x = L.Dense(100, activation=\"relu\", name=\"d3\")(x)\n", 1215 | " p1 = L.Dense(3, activation=\"linear\", name=\"p1\")(x)\n", 1216 | " p2 = L.Dense(3, activation=\"relu\", name=\"p2\")(x)\n", 1217 | " preds = L.Lambda(lambda x: x[0] + tf.cumsum(x[1], axis=1), \n", 1218 | " name=\"preds\")([p1, p2])\n", 1219 | " \n", 1220 | " model = M.Model(z, preds, name=\"CNN\")\n", 1221 | " #model.compile(loss=qloss, optimizer=\"adam\", metrics=[score])\n", 1222 | " model.compile(loss=mloss(0.8), optimizer=tf.keras.optimizers.Adam(lr=0.1, beta_1=0.9, beta_2=0.999, epsilon=None, decay=0.01, amsgrad=False), metrics=[score])\n", 1223 | " return model" 1224 | ] 1225 | }, 1226 | { 1227 | "cell_type": "code", 1228 | "execution_count": 29, 1229 | "metadata": { 1230 | "execution": { 1231 | "iopub.execute_input": "2020-10-05T09:04:27.777357Z", 1232 | "iopub.status.busy": "2020-10-05T09:04:27.776419Z", 1233 | "iopub.status.idle": "2020-10-05T09:04:27.778805Z", 1234 | "shell.execute_reply": "2020-10-05T09:04:27.779292Z" 1235 | }, 1236 | "papermill": { 1237 | "duration": 0.058762, 1238 | "end_time": "2020-10-05T09:04:27.779417", 1239 | "exception": false, 1240 | "start_time": "2020-10-05T09:04:27.720655", 1241 | "status": "completed" 1242 | }, 1243 | "tags": [] 1244 | }, 1245 | "outputs": [], 1246 | "source": [ 1247 | "y = tr['FVC'].values\n", 1248 | "z = tr[FE].values\n", 1249 | "ze = sub[FE].values\n", 1250 | "nh = z.shape[1]\n", 1251 | "pe = np.zeros((ze.shape[0], 3))\n", 1252 | "pred = np.zeros((z.shape[0], 3))" 1253 | ] 1254 | }, 1255 | { 1256 | "cell_type": "code", 1257 | "execution_count": 30, 1258 | "metadata": { 1259 | "execution": { 1260 | "iopub.execute_input": "2020-10-05T09:04:27.877350Z", 1261 | "iopub.status.busy": "2020-10-05T09:04:27.876491Z", 1262 | "iopub.status.idle": "2020-10-05T09:04:27.956928Z", 1263 | "shell.execute_reply": "2020-10-05T09:04:27.956106Z" 1264 | }, 1265 | "papermill": { 1266 | "duration": 0.131912, 1267 | "end_time": "2020-10-05T09:04:27.957045", 1268 | "exception": false, 1269 | "start_time": "2020-10-05T09:04:27.825133", 1270 | "status": "completed" 1271 | }, 1272 | "tags": [] 1273 | }, 1274 | "outputs": [ 1275 | { 1276 | "name": "stdout", 1277 | "output_type": "stream", 1278 | "text": [ 1279 | "Model: \"CNN\"\n", 1280 | "__________________________________________________________________________________________________\n", 1281 | "Layer (type) Output Shape Param # Connected to \n", 1282 | "==================================================================================================\n", 1283 | "Patient (InputLayer) [(None, 8)] 0 \n", 1284 | "__________________________________________________________________________________________________\n", 1285 | "d1 (Dense) (None, 100) 900 Patient[0][0] \n", 1286 | "__________________________________________________________________________________________________\n", 1287 | "d2 (Dense) (None, 100) 10100 d1[0][0] \n", 1288 | "__________________________________________________________________________________________________\n", 1289 | "p1 (Dense) (None, 3) 303 d2[0][0] \n", 1290 | "__________________________________________________________________________________________________\n", 1291 | "p2 (Dense) (None, 3) 303 d2[0][0] \n", 1292 | "__________________________________________________________________________________________________\n", 1293 | "preds (Lambda) (None, 3) 0 p1[0][0] \n", 1294 | " p2[0][0] \n", 1295 | "==================================================================================================\n", 1296 | "Total params: 11,606\n", 1297 | "Trainable params: 11,606\n", 1298 | "Non-trainable params: 0\n", 1299 | "__________________________________________________________________________________________________\n", 1300 | "None\n", 1301 | "11606\n" 1302 | ] 1303 | } 1304 | ], 1305 | "source": [ 1306 | "net = make_model(nh)\n", 1307 | "print(net.summary())\n", 1308 | "print(net.count_params())" 1309 | ] 1310 | }, 1311 | { 1312 | "cell_type": "code", 1313 | "execution_count": 31, 1314 | "metadata": { 1315 | "execution": { 1316 | "iopub.execute_input": "2020-10-05T09:04:28.055428Z", 1317 | "iopub.status.busy": "2020-10-05T09:04:28.054683Z", 1318 | "iopub.status.idle": "2020-10-05T09:04:28.057776Z", 1319 | "shell.execute_reply": "2020-10-05T09:04:28.057183Z" 1320 | }, 1321 | "papermill": { 1322 | "duration": 0.054006, 1323 | "end_time": "2020-10-05T09:04:28.057873", 1324 | "exception": false, 1325 | "start_time": "2020-10-05T09:04:28.003867", 1326 | "status": "completed" 1327 | }, 1328 | "tags": [] 1329 | }, 1330 | "outputs": [], 1331 | "source": [ 1332 | "NFOLD = 2 # originally 5\n", 1333 | "kf = KFold(n_splits=NFOLD)" 1334 | ] 1335 | }, 1336 | { 1337 | "cell_type": "code", 1338 | "execution_count": 32, 1339 | "metadata": { 1340 | "execution": { 1341 | "iopub.execute_input": "2020-10-05T09:04:28.160715Z", 1342 | "iopub.status.busy": "2020-10-05T09:04:28.159798Z", 1343 | "iopub.status.idle": "2020-10-05T09:05:25.385796Z", 1344 | "shell.execute_reply": "2020-10-05T09:05:25.386648Z" 1345 | }, 1346 | "papermill": { 1347 | "duration": 57.282521, 1348 | "end_time": "2020-10-05T09:05:25.386855", 1349 | "exception": false, 1350 | "start_time": "2020-10-05T09:04:28.104334", 1351 | "status": "completed" 1352 | }, 1353 | "tags": [] 1354 | }, 1355 | "outputs": [ 1356 | { 1357 | "name": "stdout", 1358 | "output_type": "stream", 1359 | "text": [ 1360 | "FOLD 1\n", 1361 | "train [45.55668258666992, 6.585787296295166]\n", 1362 | "val [57.895904541015625, 6.83064603805542]\n", 1363 | "predict val...\n", 1364 | "predict test...\n", 1365 | "FOLD 2\n", 1366 | "train [49.8366813659668, 6.653332233428955]\n", 1367 | "val [50.33049392700195, 6.696572780609131]\n", 1368 | "predict val...\n", 1369 | "predict test...\n", 1370 | "CPU times: user 1min 1s, sys: 3.56 s, total: 1min 5s\n", 1371 | "Wall time: 57.2 s\n" 1372 | ] 1373 | } 1374 | ], 1375 | "source": [ 1376 | "%%time\n", 1377 | "cnt = 0\n", 1378 | "EPOCHS = 600\n", 1379 | "for tr_idx, val_idx in kf.split(z):\n", 1380 | " cnt += 1\n", 1381 | " print(f\"FOLD {cnt}\")\n", 1382 | " net = make_model(nh)\n", 1383 | " net.fit(z[tr_idx], y[tr_idx], batch_size=BATCH_SIZE, epochs=EPOCHS, \n", 1384 | " validation_data=(z[val_idx], y[val_idx]), verbose=0) #\n", 1385 | " print(\"train\", net.evaluate(z[tr_idx], y[tr_idx], verbose=0, batch_size=BATCH_SIZE))\n", 1386 | " print(\"val\", net.evaluate(z[val_idx], y[val_idx], verbose=0, batch_size=BATCH_SIZE))\n", 1387 | " print(\"predict val...\")\n", 1388 | " pred[val_idx] = net.predict(z[val_idx], batch_size=BATCH_SIZE, verbose=0)\n", 1389 | " print(\"predict test...\")\n", 1390 | " pe += net.predict(ze, batch_size=BATCH_SIZE, verbose=0) / NFOLD" 1391 | ] 1392 | }, 1393 | { 1394 | "cell_type": "code", 1395 | "execution_count": 33, 1396 | "metadata": { 1397 | "execution": { 1398 | "iopub.execute_input": "2020-10-05T09:05:25.490113Z", 1399 | "iopub.status.busy": "2020-10-05T09:05:25.489309Z", 1400 | "iopub.status.idle": "2020-10-05T09:05:25.492946Z", 1401 | "shell.execute_reply": "2020-10-05T09:05:25.493432Z" 1402 | }, 1403 | "papermill": { 1404 | "duration": 0.057826, 1405 | "end_time": "2020-10-05T09:05:25.493544", 1406 | "exception": false, 1407 | "start_time": "2020-10-05T09:05:25.435718", 1408 | "status": "completed" 1409 | }, 1410 | "tags": [] 1411 | }, 1412 | "outputs": [ 1413 | { 1414 | "name": "stdout", 1415 | "output_type": "stream", 1416 | "text": [ 1417 | "156.29871337095378 260.86731060413274\n" 1418 | ] 1419 | } 1420 | ], 1421 | "source": [ 1422 | "sigma_opt = mean_absolute_error(y, pred[:, 1])\n", 1423 | "unc = pred[:,2] - pred[:, 0]\n", 1424 | "sigma_mean = np.mean(unc)\n", 1425 | "print(sigma_opt, sigma_mean)" 1426 | ] 1427 | }, 1428 | { 1429 | "cell_type": "code", 1430 | "execution_count": 34, 1431 | "metadata": { 1432 | "execution": { 1433 | "iopub.execute_input": "2020-10-05T09:05:25.605603Z", 1434 | "iopub.status.busy": "2020-10-05T09:05:25.599658Z", 1435 | "iopub.status.idle": "2020-10-05T09:05:25.789798Z", 1436 | "shell.execute_reply": "2020-10-05T09:05:25.789284Z" 1437 | }, 1438 | "papermill": { 1439 | "duration": 0.24657, 1440 | "end_time": "2020-10-05T09:05:25.789903", 1441 | "exception": false, 1442 | "start_time": "2020-10-05T09:05:25.543333", 1443 | "status": "completed" 1444 | }, 1445 | "tags": [] 1446 | }, 1447 | "outputs": [ 1448 | { 1449 | "data": { 1450 | "image/png": "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\n", 1451 | "text/plain": [ 1452 | "
" 1453 | ] 1454 | }, 1455 | "metadata": { 1456 | "needs_background": "light" 1457 | }, 1458 | "output_type": "display_data" 1459 | } 1460 | ], 1461 | "source": [ 1462 | "idxs = np.random.randint(0, y.shape[0], 100)\n", 1463 | "plt.plot(y[idxs], label=\"ground truth\")\n", 1464 | "plt.plot(pred[idxs, 0], label=\"q25\")\n", 1465 | "plt.plot(pred[idxs, 1], label=\"q50\")\n", 1466 | "plt.plot(pred[idxs, 2], label=\"q75\")\n", 1467 | "plt.legend(loc=\"best\")\n", 1468 | "plt.show()" 1469 | ] 1470 | }, 1471 | { 1472 | "cell_type": "code", 1473 | "execution_count": 35, 1474 | "metadata": { 1475 | "execution": { 1476 | "iopub.execute_input": "2020-10-05T09:05:25.897149Z", 1477 | "iopub.status.busy": "2020-10-05T09:05:25.895304Z", 1478 | "iopub.status.idle": "2020-10-05T09:05:25.900144Z", 1479 | "shell.execute_reply": "2020-10-05T09:05:25.899440Z" 1480 | }, 1481 | "papermill": { 1482 | "duration": 0.060561, 1483 | "end_time": "2020-10-05T09:05:25.900266", 1484 | "exception": false, 1485 | "start_time": "2020-10-05T09:05:25.839705", 1486 | "status": "completed" 1487 | }, 1488 | "tags": [] 1489 | }, 1490 | "outputs": [ 1491 | { 1492 | "name": "stdout", 1493 | "output_type": "stream", 1494 | "text": [ 1495 | "77.932861328125 260.86731060413274 453.388671875 1.0\n" 1496 | ] 1497 | } 1498 | ], 1499 | "source": [ 1500 | "print(unc.min(), unc.mean(), unc.max(), (unc>=0).mean())" 1501 | ] 1502 | }, 1503 | { 1504 | "cell_type": "code", 1505 | "execution_count": 36, 1506 | "metadata": { 1507 | "execution": { 1508 | "iopub.execute_input": "2020-10-05T09:05:26.014854Z", 1509 | "iopub.status.busy": "2020-10-05T09:05:26.012723Z", 1510 | "iopub.status.idle": "2020-10-05T09:05:26.177835Z", 1511 | "shell.execute_reply": "2020-10-05T09:05:26.177336Z" 1512 | }, 1513 | "papermill": { 1514 | "duration": 0.225937, 1515 | "end_time": "2020-10-05T09:05:26.177936", 1516 | "exception": false, 1517 | "start_time": "2020-10-05T09:05:25.951999", 1518 | "status": "completed" 1519 | }, 1520 | "tags": [] 1521 | }, 1522 | "outputs": [ 1523 | { 1524 | "data": { 1525 | "image/png": "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\n", 1526 | "text/plain": [ 1527 | "
" 1528 | ] 1529 | }, 1530 | "metadata": { 1531 | "needs_background": "light" 1532 | }, 1533 | "output_type": "display_data" 1534 | } 1535 | ], 1536 | "source": [ 1537 | "plt.hist(unc)\n", 1538 | "plt.title(\"uncertainty in prediction\")\n", 1539 | "plt.show()" 1540 | ] 1541 | }, 1542 | { 1543 | "cell_type": "code", 1544 | "execution_count": 37, 1545 | "metadata": { 1546 | "execution": { 1547 | "iopub.execute_input": "2020-10-05T09:05:26.303619Z", 1548 | "iopub.status.busy": "2020-10-05T09:05:26.291722Z", 1549 | "iopub.status.idle": "2020-10-05T09:05:26.316703Z", 1550 | "shell.execute_reply": "2020-10-05T09:05:26.317190Z" 1551 | }, 1552 | "papermill": { 1553 | "duration": 0.086982, 1554 | "end_time": "2020-10-05T09:05:26.317302", 1555 | "exception": false, 1556 | "start_time": "2020-10-05T09:05:26.230320", 1557 | "status": "completed" 1558 | }, 1559 | "tags": [] 1560 | }, 1561 | "outputs": [ 1562 | { 1563 | "data": { 1564 | "text/html": [ 1565 | "
\n", 1566 | "\n", 1579 | "\n", 1580 | " \n", 1581 | " \n", 1582 | " \n", 1583 | " \n", 1584 | " \n", 1585 | " \n", 1586 | " \n", 1587 | " \n", 1588 | " \n", 1589 | " \n", 1590 | " \n", 1591 | " \n", 1592 | " \n", 1593 | " \n", 1594 | " \n", 1595 | " \n", 1596 | " \n", 1597 | " \n", 1598 | " \n", 1599 | " \n", 1600 | " \n", 1601 | " \n", 1602 | " \n", 1603 | " \n", 1604 | " \n", 1605 | " \n", 1606 | " \n", 1607 | " \n", 1608 | " \n", 1609 | " \n", 1610 | " \n", 1611 | " \n", 1612 | " \n", 1613 | " \n", 1614 | " \n", 1615 | " \n", 1616 | " \n", 1617 | " \n", 1618 | " \n", 1619 | " \n", 1620 | " \n", 1621 | " \n", 1622 | " \n", 1623 | " \n", 1624 | " \n", 1625 | " \n", 1626 | " \n", 1627 | " \n", 1628 | " \n", 1629 | " \n", 1630 | " \n", 1631 | " \n", 1632 | " \n", 1633 | " \n", 1634 | " \n", 1635 | " \n", 1636 | " \n", 1637 | " \n", 1638 | " \n", 1639 | " \n", 1640 | " \n", 1641 | " \n", 1642 | " \n", 1643 | " \n", 1644 | " \n", 1645 | " \n", 1646 | " \n", 1647 | " \n", 1648 | " \n", 1649 | " \n", 1650 | " \n", 1651 | " \n", 1652 | " \n", 1653 | " \n", 1654 | " \n", 1655 | " \n", 1656 | " \n", 1657 | " \n", 1658 | " \n", 1659 | " \n", 1660 | " \n", 1661 | " \n", 1662 | " \n", 1663 | " \n", 1664 | " \n", 1665 | " \n", 1666 | " \n", 1667 | " \n", 1668 | " \n", 1669 | " \n", 1670 | " \n", 1671 | " \n", 1672 | " \n", 1673 | " \n", 1674 | " \n", 1675 | " \n", 1676 | " \n", 1677 | " \n", 1678 | " \n", 1679 | " \n", 1680 | " \n", 1681 | " \n", 1682 | " \n", 1683 | " \n", 1684 | " \n", 1685 | " \n", 1686 | " \n", 1687 | " \n", 1688 | " \n", 1689 | " \n", 1690 | " \n", 1691 | " \n", 1692 | " \n", 1693 | " \n", 1694 | " \n", 1695 | " \n", 1696 | " \n", 1697 | " \n", 1698 | " \n", 1699 | " \n", 1700 | " \n", 1701 | " \n", 1702 | " \n", 1703 | " \n", 1704 | " \n", 1705 | " \n", 1706 | " \n", 1707 | " \n", 1708 | " \n", 1709 | " \n", 1710 | " \n", 1711 | " \n", 1712 | " \n", 1713 | " \n", 1714 | " \n", 1715 | " \n", 1716 | " \n", 1717 | " \n", 1718 | " \n", 1719 | " \n", 1720 | " \n", 1721 | " \n", 1722 | " \n", 1723 | " \n", 1724 | " \n", 1725 | " \n", 1726 | " \n", 1727 | " \n", 1728 | "
PatientWeeksFVCPercentAgeSexSmokingStatusWHEREConfidencePatient_Week...min_FVCbase_weekMaleFemaleEx-smokerNever smokedCurrently smokesageBASEweek
1540ID00419637202311204720264-12302070.18685573MaleEx-smokertest100.0ID00419637202311204720264_-12...3020-18.0101000.6153850.37240.067901
1541ID00419637202311204720264-11302070.18685573MaleEx-smokertest100.0ID00419637202311204720264_-11...3020-17.0101000.6153850.37240.074074
1542ID00419637202311204720264-10302070.18685573MaleEx-smokertest100.0ID00419637202311204720264_-10...3020-16.0101000.6153850.37240.080247
1543ID00419637202311204720264-9302070.18685573MaleEx-smokertest100.0ID00419637202311204720264_-9...3020-15.0101000.6153850.37240.086420
1544ID00419637202311204720264-8302070.18685573MaleEx-smokertest100.0ID00419637202311204720264_-8...3020-14.0101000.6153850.37240.092593
\n", 1729 | "

5 rows × 21 columns

\n", 1730 | "
" 1731 | ], 1732 | "text/plain": [ 1733 | " Patient Weeks FVC Percent Age Sex \\\n", 1734 | "1540 ID00419637202311204720264 -12 3020 70.186855 73 Male \n", 1735 | "1541 ID00419637202311204720264 -11 3020 70.186855 73 Male \n", 1736 | "1542 ID00419637202311204720264 -10 3020 70.186855 73 Male \n", 1737 | "1543 ID00419637202311204720264 -9 3020 70.186855 73 Male \n", 1738 | "1544 ID00419637202311204720264 -8 3020 70.186855 73 Male \n", 1739 | "\n", 1740 | " SmokingStatus WHERE Confidence Patient_Week ... \\\n", 1741 | "1540 Ex-smoker test 100.0 ID00419637202311204720264_-12 ... \n", 1742 | "1541 Ex-smoker test 100.0 ID00419637202311204720264_-11 ... \n", 1743 | "1542 Ex-smoker test 100.0 ID00419637202311204720264_-10 ... \n", 1744 | "1543 Ex-smoker test 100.0 ID00419637202311204720264_-9 ... \n", 1745 | "1544 Ex-smoker test 100.0 ID00419637202311204720264_-8 ... \n", 1746 | "\n", 1747 | " min_FVC base_week Male Female Ex-smoker Never smoked \\\n", 1748 | "1540 3020 -18.0 1 0 1 0 \n", 1749 | "1541 3020 -17.0 1 0 1 0 \n", 1750 | "1542 3020 -16.0 1 0 1 0 \n", 1751 | "1543 3020 -15.0 1 0 1 0 \n", 1752 | "1544 3020 -14.0 1 0 1 0 \n", 1753 | "\n", 1754 | " Currently smokes age BASE week \n", 1755 | "1540 0 0.615385 0.3724 0.067901 \n", 1756 | "1541 0 0.615385 0.3724 0.074074 \n", 1757 | "1542 0 0.615385 0.3724 0.080247 \n", 1758 | "1543 0 0.615385 0.3724 0.086420 \n", 1759 | "1544 0 0.615385 0.3724 0.092593 \n", 1760 | "\n", 1761 | "[5 rows x 21 columns]" 1762 | ] 1763 | }, 1764 | "execution_count": 37, 1765 | "metadata": {}, 1766 | "output_type": "execute_result" 1767 | } 1768 | ], 1769 | "source": [ 1770 | "sub.head()" 1771 | ] 1772 | }, 1773 | { 1774 | "cell_type": "code", 1775 | "execution_count": 38, 1776 | "metadata": { 1777 | "execution": { 1778 | "iopub.execute_input": "2020-10-05T09:05:26.434984Z", 1779 | "iopub.status.busy": "2020-10-05T09:05:26.433750Z", 1780 | "iopub.status.idle": "2020-10-05T09:05:26.449190Z", 1781 | "shell.execute_reply": "2020-10-05T09:05:26.448719Z" 1782 | }, 1783 | "papermill": { 1784 | "duration": 0.078273, 1785 | "end_time": "2020-10-05T09:05:26.449311", 1786 | "exception": false, 1787 | "start_time": "2020-10-05T09:05:26.371038", 1788 | "status": "completed" 1789 | }, 1790 | "tags": [] 1791 | }, 1792 | "outputs": [ 1793 | { 1794 | "data": { 1795 | "text/html": [ 1796 | "
\n", 1797 | "\n", 1810 | "\n", 1811 | " \n", 1812 | " \n", 1813 | " \n", 1814 | " \n", 1815 | " \n", 1816 | " \n", 1817 | " \n", 1818 | " \n", 1819 | " \n", 1820 | " \n", 1821 | " \n", 1822 | " \n", 1823 | " \n", 1824 | " \n", 1825 | " \n", 1826 | " \n", 1827 | " \n", 1828 | " \n", 1829 | " \n", 1830 | " \n", 1831 | " \n", 1832 | " \n", 1833 | " \n", 1834 | " \n", 1835 | " \n", 1836 | " \n", 1837 | " \n", 1838 | " \n", 1839 | " \n", 1840 | " \n", 1841 | " \n", 1842 | " \n", 1843 | " \n", 1844 | " \n", 1845 | " \n", 1846 | " \n", 1847 | " \n", 1848 | " \n", 1849 | " \n", 1850 | " \n", 1851 | " \n", 1852 | " \n", 1853 | " \n", 1854 | " \n", 1855 | " \n", 1856 | " \n", 1857 | " \n", 1858 | " \n", 1859 | " \n", 1860 | " \n", 1861 | " \n", 1862 | " \n", 1863 | " \n", 1864 | " \n", 1865 | " \n", 1866 | " \n", 1867 | " \n", 1868 | " \n", 1869 | " \n", 1870 | " \n", 1871 | " \n", 1872 | " \n", 1873 | " \n", 1874 | " \n", 1875 | " \n", 1876 | " \n", 1877 | " \n", 1878 | " \n", 1879 | " \n", 1880 | " \n", 1881 | " \n", 1882 | " \n", 1883 | " \n", 1884 | " \n", 1885 | " \n", 1886 | " \n", 1887 | " \n", 1888 | " \n", 1889 | " \n", 1890 | " \n", 1891 | " \n", 1892 | " \n", 1893 | " \n", 1894 | " \n", 1895 | " \n", 1896 | " \n", 1897 | " \n", 1898 | " \n", 1899 | " \n", 1900 | " \n", 1901 | " \n", 1902 | " \n", 1903 | "
Patient_WeekFVCConfidenceFVC1Confidence1
1540ID00419637202311204720264_-123020100.03041.346558222.091309
1541ID00419637202311204720264_-113020100.03037.395996224.152710
1542ID00419637202311204720264_-103020100.03033.445312226.214111
1543ID00419637202311204720264_-93020100.03029.494751228.275513
1544ID00419637202311204720264_-83020100.03025.544189230.336670
1545ID00419637202311204720264_-73020100.03021.593384232.398193
1546ID00419637202311204720264_-63020100.03017.642822234.459473
1547ID00419637202311204720264_-53020100.03013.692383236.520996
1548ID00419637202311204720264_-43020100.03009.741699238.582153
1549ID00419637202311204720264_-33020100.03005.791260240.643677
\n", 1904 | "
" 1905 | ], 1906 | "text/plain": [ 1907 | " Patient_Week FVC Confidence FVC1 \\\n", 1908 | "1540 ID00419637202311204720264_-12 3020 100.0 3041.346558 \n", 1909 | "1541 ID00419637202311204720264_-11 3020 100.0 3037.395996 \n", 1910 | "1542 ID00419637202311204720264_-10 3020 100.0 3033.445312 \n", 1911 | "1543 ID00419637202311204720264_-9 3020 100.0 3029.494751 \n", 1912 | "1544 ID00419637202311204720264_-8 3020 100.0 3025.544189 \n", 1913 | "1545 ID00419637202311204720264_-7 3020 100.0 3021.593384 \n", 1914 | "1546 ID00419637202311204720264_-6 3020 100.0 3017.642822 \n", 1915 | "1547 ID00419637202311204720264_-5 3020 100.0 3013.692383 \n", 1916 | "1548 ID00419637202311204720264_-4 3020 100.0 3009.741699 \n", 1917 | "1549 ID00419637202311204720264_-3 3020 100.0 3005.791260 \n", 1918 | "\n", 1919 | " Confidence1 \n", 1920 | "1540 222.091309 \n", 1921 | "1541 224.152710 \n", 1922 | "1542 226.214111 \n", 1923 | "1543 228.275513 \n", 1924 | "1544 230.336670 \n", 1925 | "1545 232.398193 \n", 1926 | "1546 234.459473 \n", 1927 | "1547 236.520996 \n", 1928 | "1548 238.582153 \n", 1929 | "1549 240.643677 " 1930 | ] 1931 | }, 1932 | "execution_count": 38, 1933 | "metadata": {}, 1934 | "output_type": "execute_result" 1935 | } 1936 | ], 1937 | "source": [ 1938 | "# PREDICTION\n", 1939 | "sub['FVC1'] = 1.*pe[:, 1]\n", 1940 | "sub['Confidence1'] = pe[:, 2] - pe[:, 0]\n", 1941 | "subm = sub[['Patient_Week','FVC','Confidence','FVC1','Confidence1']].copy()\n", 1942 | "subm.loc[~subm.FVC1.isnull()].head(10)" 1943 | ] 1944 | }, 1945 | { 1946 | "cell_type": "code", 1947 | "execution_count": 39, 1948 | "metadata": { 1949 | "execution": { 1950 | "iopub.execute_input": "2020-10-05T09:05:26.568502Z", 1951 | "iopub.status.busy": "2020-10-05T09:05:26.567657Z", 1952 | "iopub.status.idle": "2020-10-05T09:05:26.574331Z", 1953 | "shell.execute_reply": "2020-10-05T09:05:26.573860Z" 1954 | }, 1955 | "papermill": { 1956 | "duration": 0.070024, 1957 | "end_time": "2020-10-05T09:05:26.574425", 1958 | "exception": false, 1959 | "start_time": "2020-10-05T09:05:26.504401", 1960 | "status": "completed" 1961 | }, 1962 | "tags": [] 1963 | }, 1964 | "outputs": [], 1965 | "source": [ 1966 | "subm.loc[~subm.FVC1.isnull(),'FVC'] = subm.loc[~subm.FVC1.isnull(),'FVC1']\n", 1967 | "sigma_mean = 60\n", 1968 | "if sigma_mean\n", 1998 | "\n", 2011 | "\n", 2012 | " \n", 2013 | " \n", 2014 | " \n", 2015 | " \n", 2016 | " \n", 2017 | " \n", 2018 | " \n", 2019 | " \n", 2020 | " \n", 2021 | " \n", 2022 | " \n", 2023 | " \n", 2024 | " \n", 2025 | " \n", 2026 | " \n", 2027 | " \n", 2028 | " \n", 2029 | " \n", 2030 | " \n", 2031 | " \n", 2032 | " \n", 2033 | " \n", 2034 | " \n", 2035 | " \n", 2036 | " \n", 2037 | " \n", 2038 | " \n", 2039 | " \n", 2040 | " \n", 2041 | " \n", 2042 | " \n", 2043 | " \n", 2044 | " \n", 2045 | " \n", 2046 | " \n", 2047 | " \n", 2048 | " \n", 2049 | " \n", 2050 | " \n", 2051 | " \n", 2052 | " \n", 2053 | " \n", 2054 | " \n", 2055 | " \n", 2056 | " \n", 2057 | " \n", 2058 | " \n", 2059 | " \n", 2060 | " \n", 2061 | " \n", 2062 | " \n", 2063 | " \n", 2064 | "
Patient_WeekFVCConfidenceFVC1Confidence1
1540ID00419637202311204720264_-123041.346558222.0913093041.346558222.091309
1541ID00419637202311204720264_-113037.395996224.1527103037.395996224.152710
1542ID00419637202311204720264_-103033.445312226.2141113033.445312226.214111
1543ID00419637202311204720264_-93029.494751228.2755133029.494751228.275513
1544ID00419637202311204720264_-83025.544189230.3366703025.544189230.336670
\n", 2065 | "" 2066 | ], 2067 | "text/plain": [ 2068 | " Patient_Week FVC Confidence FVC1 \\\n", 2069 | "1540 ID00419637202311204720264_-12 3041.346558 222.091309 3041.346558 \n", 2070 | "1541 ID00419637202311204720264_-11 3037.395996 224.152710 3037.395996 \n", 2071 | "1542 ID00419637202311204720264_-10 3033.445312 226.214111 3033.445312 \n", 2072 | "1543 ID00419637202311204720264_-9 3029.494751 228.275513 3029.494751 \n", 2073 | "1544 ID00419637202311204720264_-8 3025.544189 230.336670 3025.544189 \n", 2074 | "\n", 2075 | " Confidence1 \n", 2076 | "1540 222.091309 \n", 2077 | "1541 224.152710 \n", 2078 | "1542 226.214111 \n", 2079 | "1543 228.275513 \n", 2080 | "1544 230.336670 " 2081 | ] 2082 | }, 2083 | "execution_count": 40, 2084 | "metadata": {}, 2085 | "output_type": "execute_result" 2086 | } 2087 | ], 2088 | "source": [ 2089 | "subm.head()" 2090 | ] 2091 | }, 2092 | { 2093 | "cell_type": "code", 2094 | "execution_count": 41, 2095 | "metadata": { 2096 | "execution": { 2097 | "iopub.execute_input": "2020-10-05T09:05:26.834992Z", 2098 | "iopub.status.busy": "2020-10-05T09:05:26.834274Z", 2099 | "iopub.status.idle": "2020-10-05T09:05:26.857156Z", 2100 | "shell.execute_reply": "2020-10-05T09:05:26.857656Z" 2101 | }, 2102 | "papermill": { 2103 | "duration": 0.086668, 2104 | "end_time": "2020-10-05T09:05:26.857775", 2105 | "exception": false, 2106 | "start_time": "2020-10-05T09:05:26.771107", 2107 | "status": "completed" 2108 | }, 2109 | "tags": [] 2110 | }, 2111 | "outputs": [ 2112 | { 2113 | "data": { 2114 | "text/html": [ 2115 | "
\n", 2116 | "\n", 2129 | "\n", 2130 | " \n", 2131 | " \n", 2132 | " \n", 2133 | " \n", 2134 | " \n", 2135 | " \n", 2136 | " \n", 2137 | " \n", 2138 | " \n", 2139 | " \n", 2140 | " \n", 2141 | " \n", 2142 | " \n", 2143 | " \n", 2144 | " \n", 2145 | " \n", 2146 | " \n", 2147 | " \n", 2148 | " \n", 2149 | " \n", 2150 | " \n", 2151 | " \n", 2152 | " \n", 2153 | " \n", 2154 | " \n", 2155 | " \n", 2156 | " \n", 2157 | " \n", 2158 | " \n", 2159 | " \n", 2160 | " \n", 2161 | " \n", 2162 | " \n", 2163 | " \n", 2164 | " \n", 2165 | " \n", 2166 | " \n", 2167 | " \n", 2168 | " \n", 2169 | " \n", 2170 | " \n", 2171 | " \n", 2172 | " \n", 2173 | " \n", 2174 | " \n", 2175 | " \n", 2176 | " \n", 2177 | " \n", 2178 | " \n", 2179 | " \n", 2180 | " \n", 2181 | " \n", 2182 | " \n", 2183 | " \n", 2184 | " \n", 2185 | " \n", 2186 | " \n", 2187 | " \n", 2188 | " \n", 2189 | "
countmeanstdmin25%50%75%max
FVC730.02579.475721434.0976461671.2131962423.7149662649.1751712871.4500123359.120605
Confidence730.0319.17770157.769768193.531860278.825699315.067993371.083679417.567139
FVC1730.02579.475721434.0976461671.2131962423.7149662649.1751712871.4500123359.120605
Confidence1730.0319.17770157.769768193.531860278.825699315.067993371.083679417.567139
\n", 2190 | "
" 2191 | ], 2192 | "text/plain": [ 2193 | " count mean std min 25% \\\n", 2194 | "FVC 730.0 2579.475721 434.097646 1671.213196 2423.714966 \n", 2195 | "Confidence 730.0 319.177701 57.769768 193.531860 278.825699 \n", 2196 | "FVC1 730.0 2579.475721 434.097646 1671.213196 2423.714966 \n", 2197 | "Confidence1 730.0 319.177701 57.769768 193.531860 278.825699 \n", 2198 | "\n", 2199 | " 50% 75% max \n", 2200 | "FVC 2649.175171 2871.450012 3359.120605 \n", 2201 | "Confidence 315.067993 371.083679 417.567139 \n", 2202 | "FVC1 2649.175171 2871.450012 3359.120605 \n", 2203 | "Confidence1 315.067993 371.083679 417.567139 " 2204 | ] 2205 | }, 2206 | "execution_count": 41, 2207 | "metadata": {}, 2208 | "output_type": "execute_result" 2209 | } 2210 | ], 2211 | "source": [ 2212 | "subm.describe().T" 2213 | ] 2214 | }, 2215 | { 2216 | "cell_type": "code", 2217 | "execution_count": 42, 2218 | "metadata": { 2219 | "execution": { 2220 | "iopub.execute_input": "2020-10-05T09:05:27.004978Z", 2221 | "iopub.status.busy": "2020-10-05T09:05:27.004268Z", 2222 | "iopub.status.idle": "2020-10-05T09:05:27.007670Z", 2223 | "shell.execute_reply": "2020-10-05T09:05:27.008110Z" 2224 | }, 2225 | "papermill": { 2226 | "duration": 0.093123, 2227 | "end_time": "2020-10-05T09:05:27.008227", 2228 | "exception": false, 2229 | "start_time": "2020-10-05T09:05:26.915104", 2230 | "status": "completed" 2231 | }, 2232 | "tags": [] 2233 | }, 2234 | "outputs": [], 2235 | "source": [ 2236 | "otest = pd.read_csv('../input/osic-pulmonary-fibrosis-progression/test.csv')\n", 2237 | "for i in range(len(otest)):\n", 2238 | " subm.loc[subm['Patient_Week']==otest.Patient[i]+'_'+str(otest.Weeks[i]), 'FVC'] = otest.FVC[i]\n", 2239 | " subm.loc[subm['Patient_Week']==otest.Patient[i]+'_'+str(otest.Weeks[i]), 'Confidence'] = 0.1" 2240 | ] 2241 | }, 2242 | { 2243 | "cell_type": "code", 2244 | "execution_count": 43, 2245 | "metadata": { 2246 | "execution": { 2247 | "iopub.execute_input": "2020-10-05T09:05:27.125110Z", 2248 | "iopub.status.busy": "2020-10-05T09:05:27.124289Z", 2249 | "iopub.status.idle": "2020-10-05T09:05:27.133221Z", 2250 | "shell.execute_reply": "2020-10-05T09:05:27.132704Z" 2251 | }, 2252 | "papermill": { 2253 | "duration": 0.069817, 2254 | "end_time": "2020-10-05T09:05:27.133353", 2255 | "exception": false, 2256 | "start_time": "2020-10-05T09:05:27.063536", 2257 | "status": "completed" 2258 | }, 2259 | "tags": [] 2260 | }, 2261 | "outputs": [], 2262 | "source": [ 2263 | "subm[[\"Patient_Week\",\"FVC\",\"Confidence\"]].to_csv(\"submission_regression.csv\", index=False)" 2264 | ] 2265 | }, 2266 | { 2267 | "cell_type": "code", 2268 | "execution_count": 44, 2269 | "metadata": { 2270 | "execution": { 2271 | "iopub.execute_input": "2020-10-05T09:05:27.250401Z", 2272 | "iopub.status.busy": "2020-10-05T09:05:27.249764Z", 2273 | "iopub.status.idle": "2020-10-05T09:05:27.253289Z", 2274 | "shell.execute_reply": "2020-10-05T09:05:27.252789Z" 2275 | }, 2276 | "papermill": { 2277 | "duration": 0.064003, 2278 | "end_time": "2020-10-05T09:05:27.253381", 2279 | "exception": false, 2280 | "start_time": "2020-10-05T09:05:27.189378", 2281 | "status": "completed" 2282 | }, 2283 | "tags": [] 2284 | }, 2285 | "outputs": [], 2286 | "source": [ 2287 | "reg_sub = subm[[\"Patient_Week\",\"FVC\",\"Confidence\"]].copy()" 2288 | ] 2289 | }, 2290 | { 2291 | "cell_type": "markdown", 2292 | "metadata": { 2293 | "papermill": { 2294 | "duration": 0.055012, 2295 | "end_time": "2020-10-05T09:05:27.363446", 2296 | "exception": false, 2297 | "start_time": "2020-10-05T09:05:27.308434", 2298 | "status": "completed" 2299 | }, 2300 | "tags": [] 2301 | }, 2302 | "source": [ 2303 | "# Ensemble (Simple Blend)" 2304 | ] 2305 | }, 2306 | { 2307 | "cell_type": "code", 2308 | "execution_count": 45, 2309 | "metadata": { 2310 | "execution": { 2311 | "iopub.execute_input": "2020-10-05T09:05:27.483201Z", 2312 | "iopub.status.busy": "2020-10-05T09:05:27.480256Z", 2313 | "iopub.status.idle": "2020-10-05T09:05:27.486668Z", 2314 | "shell.execute_reply": "2020-10-05T09:05:27.486160Z" 2315 | }, 2316 | "papermill": { 2317 | "duration": 0.068733, 2318 | "end_time": "2020-10-05T09:05:27.486769", 2319 | "exception": false, 2320 | "start_time": "2020-10-05T09:05:27.418036", 2321 | "status": "completed" 2322 | }, 2323 | "tags": [] 2324 | }, 2325 | "outputs": [], 2326 | "source": [ 2327 | "df1 = img_sub.sort_values(by=['Patient_Week'], ascending=True).reset_index(drop=True)\n", 2328 | "df2 = reg_sub.sort_values(by=['Patient_Week'], ascending=True).reset_index(drop=True)" 2329 | ] 2330 | }, 2331 | { 2332 | "cell_type": "code", 2333 | "execution_count": 46, 2334 | "metadata": { 2335 | "execution": { 2336 | "iopub.execute_input": "2020-10-05T09:05:27.615760Z", 2337 | "iopub.status.busy": "2020-10-05T09:05:27.614874Z", 2338 | "iopub.status.idle": "2020-10-05T09:05:27.618554Z", 2339 | "shell.execute_reply": "2020-10-05T09:05:27.619188Z" 2340 | }, 2341 | "papermill": { 2342 | "duration": 0.076792, 2343 | "end_time": "2020-10-05T09:05:27.619344", 2344 | "exception": false, 2345 | "start_time": "2020-10-05T09:05:27.542552", 2346 | "status": "completed" 2347 | }, 2348 | "tags": [] 2349 | }, 2350 | "outputs": [ 2351 | { 2352 | "data": { 2353 | "text/html": [ 2354 | "
\n", 2355 | "\n", 2368 | "\n", 2369 | " \n", 2370 | " \n", 2371 | " \n", 2372 | " \n", 2373 | " \n", 2374 | " \n", 2375 | " \n", 2376 | " \n", 2377 | " \n", 2378 | " \n", 2379 | " \n", 2380 | " \n", 2381 | " \n", 2382 | " \n", 2383 | " \n", 2384 | " \n", 2385 | " \n", 2386 | " \n", 2387 | " \n", 2388 | " \n", 2389 | " \n", 2390 | " \n", 2391 | " \n", 2392 | " \n", 2393 | " \n", 2394 | " \n", 2395 | " \n", 2396 | " \n", 2397 | " \n", 2398 | " \n", 2399 | " \n", 2400 | " \n", 2401 | " \n", 2402 | " \n", 2403 | " \n", 2404 | " \n", 2405 | " \n", 2406 | " \n", 2407 | " \n", 2408 | " \n", 2409 | "
Patient_WeekFVCConfidence
0ID00419637202311204720264_-13020.074010178.440218
1ID00419637202311204720264_-103055.359806183.966730
2ID00419637202311204720264_-113059.280487184.580764
3ID00419637202311204720264_-123063.201101185.194799
4ID00419637202311204720264_-23023.994692179.054252
\n", 2410 | "
" 2411 | ], 2412 | "text/plain": [ 2413 | " Patient_Week FVC Confidence\n", 2414 | "0 ID00419637202311204720264_-1 3020.074010 178.440218\n", 2415 | "1 ID00419637202311204720264_-10 3055.359806 183.966730\n", 2416 | "2 ID00419637202311204720264_-11 3059.280487 184.580764\n", 2417 | "3 ID00419637202311204720264_-12 3063.201101 185.194799\n", 2418 | "4 ID00419637202311204720264_-2 3023.994692 179.054252" 2419 | ] 2420 | }, 2421 | "execution_count": 46, 2422 | "metadata": {}, 2423 | "output_type": "execute_result" 2424 | } 2425 | ], 2426 | "source": [ 2427 | "df = df1[['Patient_Week']].copy()\n", 2428 | "df['FVC'] = (0.45*df1['FVC'] + 0.55*df2['FVC'])\n", 2429 | "df['Confidence'] = (0.45*df1['Confidence'] + 0.55*df2['Confidence'])\n", 2430 | "df.head()" 2431 | ] 2432 | }, 2433 | { 2434 | "cell_type": "code", 2435 | "execution_count": 47, 2436 | "metadata": { 2437 | "execution": { 2438 | "iopub.execute_input": "2020-10-05T09:05:27.740282Z", 2439 | "iopub.status.busy": "2020-10-05T09:05:27.739353Z", 2440 | "iopub.status.idle": "2020-10-05T09:05:27.748555Z", 2441 | "shell.execute_reply": "2020-10-05T09:05:27.749079Z" 2442 | }, 2443 | "papermill": { 2444 | "duration": 0.071238, 2445 | "end_time": "2020-10-05T09:05:27.749193", 2446 | "exception": false, 2447 | "start_time": "2020-10-05T09:05:27.677955", 2448 | "status": "completed" 2449 | }, 2450 | "tags": [] 2451 | }, 2452 | "outputs": [], 2453 | "source": [ 2454 | "df.to_csv('submission.csv', index=False)" 2455 | ] 2456 | } 2457 | ], 2458 | "metadata": { 2459 | "kernelspec": { 2460 | "display_name": "Python 3", 2461 | "language": "python", 2462 | "name": "python3" 2463 | }, 2464 | "language_info": { 2465 | "codemirror_mode": { 2466 | "name": "ipython", 2467 | "version": 3 2468 | }, 2469 | "file_extension": ".py", 2470 | "mimetype": "text/x-python", 2471 | "name": "python", 2472 | "nbconvert_exporter": "python", 2473 | "pygments_lexer": "ipython3", 2474 | "version": "3.7.6" 2475 | }, 2476 | "papermill": { 2477 | "duration": 196.958096, 2478 | "end_time": "2020-10-05T09:05:29.577830", 2479 | "environment_variables": {}, 2480 | "exception": null, 2481 | "input_path": "__notebook__.ipynb", 2482 | "output_path": "__notebook__.ipynb", 2483 | "parameters": {}, 2484 | "start_time": "2020-10-05T09:02:12.619734", 2485 | "version": "2.1.0" 2486 | }, 2487 | "widgets": { 2488 | "application/vnd.jupyter.widget-state+json": { 2489 | "state": { 2490 | "18a39542417944fe997f2604989c82fd": { 2491 | "model_module": "@jupyter-widgets/controls", 2492 | "model_module_version": "1.5.0", 2493 | "model_name": "DescriptionStyleModel", 2494 | "state": { 2495 | "_model_module": "@jupyter-widgets/controls", 2496 | "_model_module_version": "1.5.0", 2497 | "_model_name": "DescriptionStyleModel", 2498 | "_view_count": null, 2499 | "_view_module": "@jupyter-widgets/base", 2500 | "_view_module_version": "1.2.0", 2501 | "_view_name": "StyleView", 2502 | "description_width": "" 2503 | } 2504 | }, 2505 | "366e2485b939417c948814b0a3ff2139": { 2506 | "model_module": "@jupyter-widgets/controls", 2507 | "model_module_version": "1.5.0", 2508 | "model_name": "FloatProgressModel", 2509 | "state": { 2510 | "_dom_classes": [], 2511 | "_model_module": "@jupyter-widgets/controls", 2512 | "_model_module_version": "1.5.0", 2513 | "_model_name": "FloatProgressModel", 2514 | "_view_count": null, 2515 | "_view_module": "@jupyter-widgets/controls", 2516 | "_view_module_version": "1.5.0", 2517 | "_view_name": "ProgressView", 2518 | "bar_style": "success", 2519 | "description": "", 2520 | "description_tooltip": null, 2521 | "layout": "IPY_MODEL_63acf496e7b14fce855c7c4856d31be2", 2522 | "max": 1.0, 2523 | "min": 0.0, 2524 | "orientation": "horizontal", 2525 | "style": "IPY_MODEL_bedb7932c35f4112948fe4823bac7d25", 2526 | "value": 1.0 2527 | } 2528 | }, 2529 | "63acf496e7b14fce855c7c4856d31be2": { 2530 | "model_module": "@jupyter-widgets/base", 2531 | "model_module_version": "1.2.0", 2532 | "model_name": "LayoutModel", 2533 | "state": { 2534 | "_model_module": "@jupyter-widgets/base", 2535 | "_model_module_version": "1.2.0", 2536 | "_model_name": "LayoutModel", 2537 | "_view_count": null, 2538 | "_view_module": "@jupyter-widgets/base", 2539 | "_view_module_version": "1.2.0", 2540 | "_view_name": "LayoutView", 2541 | "align_content": null, 2542 | "align_items": null, 2543 | "align_self": null, 2544 | "border": null, 2545 | "bottom": null, 2546 | "display": null, 2547 | "flex": null, 2548 | "flex_flow": null, 2549 | "grid_area": null, 2550 | "grid_auto_columns": null, 2551 | "grid_auto_flow": null, 2552 | "grid_auto_rows": null, 2553 | "grid_column": null, 2554 | "grid_gap": null, 2555 | "grid_row": null, 2556 | "grid_template_areas": null, 2557 | "grid_template_columns": null, 2558 | "grid_template_rows": null, 2559 | "height": null, 2560 | "justify_content": null, 2561 | "justify_items": null, 2562 | "left": null, 2563 | "margin": null, 2564 | "max_height": null, 2565 | "max_width": null, 2566 | "min_height": null, 2567 | "min_width": null, 2568 | "object_fit": null, 2569 | "object_position": null, 2570 | "order": null, 2571 | "overflow": null, 2572 | "overflow_x": null, 2573 | "overflow_y": null, 2574 | "padding": null, 2575 | "right": null, 2576 | "top": null, 2577 | "visibility": null, 2578 | "width": null 2579 | } 2580 | }, 2581 | "94ffc2800d05426e858c1dc67fe9c342": { 2582 | "model_module": "@jupyter-widgets/controls", 2583 | "model_module_version": "1.5.0", 2584 | "model_name": "HTMLModel", 2585 | "state": { 2586 | "_dom_classes": [], 2587 | "_model_module": "@jupyter-widgets/controls", 2588 | "_model_module_version": "1.5.0", 2589 | "_model_name": "HTMLModel", 2590 | "_view_count": null, 2591 | "_view_module": "@jupyter-widgets/controls", 2592 | "_view_module_version": "1.5.0", 2593 | "_view_name": "HTMLView", 2594 | "description": "", 2595 | "description_tooltip": null, 2596 | "layout": "IPY_MODEL_fefedecca76c4931a85df5962b88e751", 2597 | "placeholder": "​", 2598 | "style": "IPY_MODEL_18a39542417944fe997f2604989c82fd", 2599 | "value": " 176/? [00:00<00:00, 202.96it/s]" 2600 | } 2601 | }, 2602 | "bedb7932c35f4112948fe4823bac7d25": { 2603 | "model_module": "@jupyter-widgets/controls", 2604 | "model_module_version": "1.5.0", 2605 | "model_name": "ProgressStyleModel", 2606 | "state": { 2607 | "_model_module": "@jupyter-widgets/controls", 2608 | "_model_module_version": "1.5.0", 2609 | "_model_name": "ProgressStyleModel", 2610 | "_view_count": null, 2611 | "_view_module": "@jupyter-widgets/base", 2612 | "_view_module_version": "1.2.0", 2613 | "_view_name": "StyleView", 2614 | "bar_color": null, 2615 | "description_width": "initial" 2616 | } 2617 | }, 2618 | "d8beae9411ec4c2588cb183dadacf987": { 2619 | "model_module": "@jupyter-widgets/base", 2620 | "model_module_version": "1.2.0", 2621 | "model_name": "LayoutModel", 2622 | "state": { 2623 | "_model_module": "@jupyter-widgets/base", 2624 | "_model_module_version": "1.2.0", 2625 | "_model_name": "LayoutModel", 2626 | "_view_count": null, 2627 | "_view_module": "@jupyter-widgets/base", 2628 | "_view_module_version": "1.2.0", 2629 | "_view_name": "LayoutView", 2630 | "align_content": null, 2631 | "align_items": null, 2632 | "align_self": null, 2633 | "border": null, 2634 | "bottom": null, 2635 | "display": null, 2636 | "flex": null, 2637 | "flex_flow": null, 2638 | "grid_area": null, 2639 | "grid_auto_columns": null, 2640 | "grid_auto_flow": null, 2641 | "grid_auto_rows": null, 2642 | "grid_column": null, 2643 | "grid_gap": null, 2644 | "grid_row": null, 2645 | "grid_template_areas": null, 2646 | "grid_template_columns": null, 2647 | "grid_template_rows": null, 2648 | "height": null, 2649 | "justify_content": null, 2650 | "justify_items": null, 2651 | "left": null, 2652 | "margin": null, 2653 | "max_height": null, 2654 | "max_width": null, 2655 | "min_height": null, 2656 | "min_width": null, 2657 | "object_fit": null, 2658 | "object_position": null, 2659 | "order": null, 2660 | "overflow": null, 2661 | "overflow_x": null, 2662 | "overflow_y": null, 2663 | "padding": null, 2664 | "right": null, 2665 | "top": null, 2666 | "visibility": null, 2667 | "width": null 2668 | } 2669 | }, 2670 | "f30423f9d7cf4780a01f51dde8ae36e3": { 2671 | "model_module": "@jupyter-widgets/controls", 2672 | "model_module_version": "1.5.0", 2673 | "model_name": "HBoxModel", 2674 | "state": { 2675 | "_dom_classes": [], 2676 | "_model_module": "@jupyter-widgets/controls", 2677 | "_model_module_version": "1.5.0", 2678 | "_model_name": "HBoxModel", 2679 | "_view_count": null, 2680 | "_view_module": "@jupyter-widgets/controls", 2681 | "_view_module_version": "1.5.0", 2682 | "_view_name": "HBoxView", 2683 | "box_style": "", 2684 | "children": [ 2685 | "IPY_MODEL_366e2485b939417c948814b0a3ff2139", 2686 | "IPY_MODEL_94ffc2800d05426e858c1dc67fe9c342" 2687 | ], 2688 | "layout": "IPY_MODEL_d8beae9411ec4c2588cb183dadacf987" 2689 | } 2690 | }, 2691 | "fefedecca76c4931a85df5962b88e751": { 2692 | "model_module": "@jupyter-widgets/base", 2693 | "model_module_version": "1.2.0", 2694 | "model_name": "LayoutModel", 2695 | "state": { 2696 | "_model_module": "@jupyter-widgets/base", 2697 | "_model_module_version": "1.2.0", 2698 | "_model_name": "LayoutModel", 2699 | "_view_count": null, 2700 | "_view_module": "@jupyter-widgets/base", 2701 | "_view_module_version": "1.2.0", 2702 | "_view_name": "LayoutView", 2703 | "align_content": null, 2704 | "align_items": null, 2705 | "align_self": null, 2706 | "border": null, 2707 | "bottom": null, 2708 | "display": null, 2709 | "flex": null, 2710 | "flex_flow": null, 2711 | "grid_area": null, 2712 | "grid_auto_columns": null, 2713 | "grid_auto_flow": null, 2714 | "grid_auto_rows": null, 2715 | "grid_column": null, 2716 | "grid_gap": null, 2717 | "grid_row": null, 2718 | "grid_template_areas": null, 2719 | "grid_template_columns": null, 2720 | "grid_template_rows": null, 2721 | "height": null, 2722 | "justify_content": null, 2723 | "justify_items": null, 2724 | "left": null, 2725 | "margin": null, 2726 | "max_height": null, 2727 | "max_width": null, 2728 | "min_height": null, 2729 | "min_width": null, 2730 | "object_fit": null, 2731 | "object_position": null, 2732 | "order": null, 2733 | "overflow": null, 2734 | "overflow_x": null, 2735 | "overflow_y": null, 2736 | "padding": null, 2737 | "right": null, 2738 | "top": null, 2739 | "visibility": null, 2740 | "width": null 2741 | } 2742 | } 2743 | }, 2744 | "version_major": 2, 2745 | "version_minor": 0 2746 | } 2747 | } 2748 | }, 2749 | "nbformat": 4, 2750 | "nbformat_minor": 4 2751 | } 2752 | --------------------------------------------------------------------------------