{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "import numpy as np\n", "import tensorflow as tf\n", "import pandas as pd\n", "from sklearn import preprocessing\n", "from sklearn.datasets import make_classification\n", "from matplotlib import pyplot\n", "from sklearn.metrics import roc_curve\n", "from sklearn.metrics import roc_auc_score\n", "import tensorflow.keras.backend \n", "import shap" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "df = pd.read_csv(r'C:\\Users\\joyce\\Desktop\\Data\\predict_icu\\final_predict_icu_blood_tests82320.csv')" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Subject_IDdispositionicu_upgradein_icuALTVALUEASTVALUEBNPVALUECRPVALUECRTVALUEDDIMVALUEFERRVALUELDHVALUELYMPHVALUEPROCALVALUETNTVALUEWBCVALUE
0S100463NaN1307.0410.0NaN36.40.7NaNNaNNaN51.40NaN0.015.3
1S101713NaN154.053.0101.034.91.015991.01185.0934.06.900.20.014.8
2S106003NaN116.022.0338.016.20.51769.0276.6189.03.500.60.211.4
3S106013NaN173.054.0NaN20.71.81153.0287.2261.012.004.70.020.3
4S108933NaN115.017.0NaN24.31.7319.0117.6219.021.400.10.04.9
...................................................
2505S1097120.0027.031.0NaN1.70.8301.0270.3368.021.850.1NaN4.7
2506S1122320.0069.061.0NaN8.00.6212.01757.0258.06.000.2NaN6.1
2507S1125920.00NaNNaNNaN0.70.9NaNNaNNaN38.700.1NaN4.8
2508S1163920.0016.024.0NaN7.70.5259.0529.9302.025.900.1NaN3.1
2509S1546120.009.014.0NaN5.90.73260.0205.7207.019.100.1NaN7.7
\n", "

2510 rows × 16 columns

\n", "
" ], "text/plain": [ " Subject_ID disposition icu_upgrade in_icu ALTVALUE ASTVALUE \\\n", "0 S10046 3 NaN 1 307.0 410.0 \n", "1 S10171 3 NaN 1 54.0 53.0 \n", "2 S10600 3 NaN 1 16.0 22.0 \n", "3 S10601 3 NaN 1 73.0 54.0 \n", "4 S10893 3 NaN 1 15.0 17.0 \n", "... ... ... ... ... ... ... \n", "2505 S10971 2 0.0 0 27.0 31.0 \n", "2506 S11223 2 0.0 0 69.0 61.0 \n", "2507 S11259 2 0.0 0 NaN NaN \n", "2508 S11639 2 0.0 0 16.0 24.0 \n", "2509 S15461 2 0.0 0 9.0 14.0 \n", "\n", " BNPVALUE CRPVALUE CRTVALUE DDIMVALUE FERRVALUE LDHVALUE \\\n", "0 NaN 36.4 0.7 NaN NaN NaN \n", "1 101.0 34.9 1.0 15991.0 1185.0 934.0 \n", "2 338.0 16.2 0.5 1769.0 276.6 189.0 \n", "3 NaN 20.7 1.8 1153.0 287.2 261.0 \n", "4 NaN 24.3 1.7 319.0 117.6 219.0 \n", "... ... ... ... ... ... ... \n", "2505 NaN 1.7 0.8 301.0 270.3 368.0 \n", "2506 NaN 8.0 0.6 212.0 1757.0 258.0 \n", "2507 NaN 0.7 0.9 NaN NaN NaN \n", "2508 NaN 7.7 0.5 259.0 529.9 302.0 \n", "2509 NaN 5.9 0.7 3260.0 205.7 207.0 \n", "\n", " LYMPHVALUE PROCALVALUE TNTVALUE WBCVALUE \n", "0 51.40 NaN 0.0 15.3 \n", "1 6.90 0.2 0.0 14.8 \n", "2 3.50 0.6 0.2 11.4 \n", "3 12.00 4.7 0.0 20.3 \n", "4 21.40 0.1 0.0 4.9 \n", "... ... ... ... ... \n", "2505 21.85 0.1 NaN 4.7 \n", "2506 6.00 0.2 NaN 6.1 \n", "2507 38.70 0.1 NaN 4.8 \n", "2508 25.90 0.1 NaN 3.1 \n", "2509 19.10 0.1 NaN 7.7 \n", "\n", "[2510 rows x 16 columns]" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dispositionicu_upgradein_icuALTVALUEASTVALUEBNPVALUECRPVALUECRTVALUEDDIMVALUEFERRVALUELDHVALUELYMPHVALUEPROCALVALUETNTVALUEWBCVALUE
count2510.0000002406.0000002510.0000002466.0000002466.0000001762.0000002387.0000002494.0000002277.0000002228.0000002364.0000002494.0000002285.000000303.0000002494.000000
mean2.0414340.1862010.13067746.83901156.9261293107.9018169.6668622.4918351024.4678671052.509448375.52686116.0646151.0529390.1815407.942744
std0.1993320.3893500.337114100.460681132.60109720510.0975218.86604211.7252543389.0434031313.741837177.31455110.4560137.6285010.3533115.463725
min2.0000000.0000000.0000005.0000007.0000005.0000000.1000000.200000150.0000005.300000109.0000000.1000000.0500000.0000000.900000
25%2.0000000.0000000.00000018.00000026.00000053.0000003.0000000.700000225.000000312.400000254.0000008.5000000.1000000.0333335.100000
50%2.0000000.0000000.00000029.00000038.000000193.0000007.1000000.900000365.000000659.400000334.00000014.0000000.2000000.1000006.800000
75%2.0000000.0000000.00000052.00000058.000000849.50000013.5500001.200000679.0000001328.000000452.00000021.5000000.3000000.1000009.200000
max3.0000001.0000001.0000002909.0000004162.000000350000.00000056.600000328.50000063670.00000016291.0000001804.00000092.000000193.5000003.000000115.300000
\n", "
" ], "text/plain": [ " disposition icu_upgrade in_icu ALTVALUE ASTVALUE \\\n", "count 2510.000000 2406.000000 2510.000000 2466.000000 2466.000000 \n", "mean 2.041434 0.186201 0.130677 46.839011 56.926129 \n", "std 0.199332 0.389350 0.337114 100.460681 132.601097 \n", "min 2.000000 0.000000 0.000000 5.000000 7.000000 \n", "25% 2.000000 0.000000 0.000000 18.000000 26.000000 \n", "50% 2.000000 0.000000 0.000000 29.000000 38.000000 \n", "75% 2.000000 0.000000 0.000000 52.000000 58.000000 \n", "max 3.000000 1.000000 1.000000 2909.000000 4162.000000 \n", "\n", " BNPVALUE CRPVALUE CRTVALUE DDIMVALUE FERRVALUE \\\n", "count 1762.000000 2387.000000 2494.000000 2277.000000 2228.000000 \n", "mean 3107.901816 9.666862 2.491835 1024.467867 1052.509448 \n", "std 20510.097521 8.866042 11.725254 3389.043403 1313.741837 \n", "min 5.000000 0.100000 0.200000 150.000000 5.300000 \n", "25% 53.000000 3.000000 0.700000 225.000000 312.400000 \n", "50% 193.000000 7.100000 0.900000 365.000000 659.400000 \n", "75% 849.500000 13.550000 1.200000 679.000000 1328.000000 \n", "max 350000.000000 56.600000 328.500000 63670.000000 16291.000000 \n", "\n", " LDHVALUE LYMPHVALUE PROCALVALUE TNTVALUE WBCVALUE \n", "count 2364.000000 2494.000000 2285.000000 303.000000 2494.000000 \n", "mean 375.526861 16.064615 1.052939 0.181540 7.942744 \n", "std 177.314551 10.456013 7.628501 0.353311 5.463725 \n", "min 109.000000 0.100000 0.050000 0.000000 0.900000 \n", "25% 254.000000 8.500000 0.100000 0.033333 5.100000 \n", "50% 334.000000 14.000000 0.200000 0.100000 6.800000 \n", "75% 452.000000 21.500000 0.300000 0.100000 9.200000 \n", "max 1804.000000 92.000000 193.500000 3.000000 115.300000 " ] }, "execution_count": 4, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2510, 16)" ] }, "execution_count": 5, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "df.drop(['Subject_ID','disposition','icu_upgrade','TNTVALUE'], axis=1, inplace=True)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
in_icuALTVALUEASTVALUEBNPVALUECRPVALUECRTVALUEDDIMVALUEFERRVALUELDHVALUELYMPHVALUEPROCALVALUEWBCVALUE
01307.0410.0NaN36.40.7NaNNaNNaN51.4NaN15.3
1154.053.0101.034.91.015991.01185.0934.06.90.214.8
2116.022.0338.016.20.51769.0276.6189.03.50.611.4
3173.054.0NaN20.71.81153.0287.2261.012.04.720.3
4115.017.0NaN24.31.7319.0117.6219.021.40.14.9
\n", "
" ], "text/plain": [ " in_icu ALTVALUE ASTVALUE BNPVALUE CRPVALUE CRTVALUE DDIMVALUE \\\n", "0 1 307.0 410.0 NaN 36.4 0.7 NaN \n", "1 1 54.0 53.0 101.0 34.9 1.0 15991.0 \n", "2 1 16.0 22.0 338.0 16.2 0.5 1769.0 \n", "3 1 73.0 54.0 NaN 20.7 1.8 1153.0 \n", "4 1 15.0 17.0 NaN 24.3 1.7 319.0 \n", "\n", " FERRVALUE LDHVALUE LYMPHVALUE PROCALVALUE WBCVALUE \n", "0 NaN NaN 51.4 NaN 15.3 \n", "1 1185.0 934.0 6.9 0.2 14.8 \n", "2 276.6 189.0 3.5 0.6 11.4 \n", "3 287.2 261.0 12.0 4.7 20.3 \n", "4 117.6 219.0 21.4 0.1 4.9 " ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.head()" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2510, 12)" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.shape" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "0" ] }, "execution_count": 9, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df['in_icu'].isnull().sum()" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [], "source": [ "for col in df.columns: # replace NaN with mean\n", " if col not in ['in_icu']:\n", " means = df.groupby('in_icu')[col].mean()\n", " for i in df[df[col].isnull()].index:\n", " df.loc[i, col] = means[df.loc[i].in_icu]" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "in_icu 0\n", "ALTVALUE 0\n", "ASTVALUE 0\n", "BNPVALUE 0\n", "CRPVALUE 0\n", "CRTVALUE 0\n", "DDIMVALUE 0\n", "FERRVALUE 0\n", "LDHVALUE 0\n", "LYMPHVALUE 0\n", "PROCALVALUE 0\n", "WBCVALUE 0\n", "dtype: int64" ] }, "execution_count": 11, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.isnull().sum()" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [], "source": [ "X = df.drop(['in_icu'],axis=1, inplace=False) #set X\n", "X = X.values" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([[3.07000000e+02, 4.10000000e+02, 2.23209252e+03, ...,\n", " 5.14000000e+01, 2.54726688e+00, 1.53000000e+01],\n", " [5.40000000e+01, 5.30000000e+01, 1.01000000e+02, ...,\n", " 6.90000000e+00, 2.00000000e-01, 1.48000000e+01],\n", " [1.60000000e+01, 2.20000000e+01, 3.38000000e+02, ...,\n", " 3.50000000e+00, 6.00000000e-01, 1.14000000e+01],\n", " ...,\n", " [4.44024732e+01, 5.08961736e+01, 3.25541877e+03, ...,\n", " 3.87000000e+01, 1.00000000e-01, 4.80000000e+00],\n", " [1.60000000e+01, 2.40000000e+01, 3.25541877e+03, ...,\n", " 2.59000000e+01, 1.00000000e-01, 3.10000000e+00],\n", " [9.00000000e+00, 1.40000000e+01, 3.25541877e+03, ...,\n", " 1.91000000e+01, 1.00000000e-01, 7.70000000e+00]])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X" ] }, { "cell_type": "code", "execution_count": 14, "metadata": {}, "outputs": [], "source": [ "y = df['in_icu'].values #set y" ] }, { "cell_type": "code", "execution_count": 15, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([1, 1, 1, ..., 0, 0, 0], dtype=int64)" ] }, "execution_count": 15, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y" ] }, { "cell_type": "code", "execution_count": 16, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "328" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y.sum()" ] }, { "cell_type": "code", "execution_count": 17, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/plain": [ "array([[3.07000000e+02, 4.10000000e+02, 2.23209252e+03, ...,\n", " 5.14000000e+01, 2.54726688e+00, 1.53000000e+01],\n", " [5.40000000e+01, 5.30000000e+01, 1.01000000e+02, ...,\n", " 6.90000000e+00, 2.00000000e-01, 1.48000000e+01],\n", " [1.60000000e+01, 2.20000000e+01, 3.38000000e+02, ...,\n", " 3.50000000e+00, 6.00000000e-01, 1.14000000e+01],\n", " ...,\n", " [4.44024732e+01, 5.08961736e+01, 3.25541877e+03, ...,\n", " 3.87000000e+01, 1.00000000e-01, 4.80000000e+00],\n", " [1.60000000e+01, 2.40000000e+01, 3.25541877e+03, ...,\n", " 2.59000000e+01, 1.00000000e-01, 3.10000000e+00],\n", " [9.00000000e+00, 1.40000000e+01, 3.25541877e+03, ...,\n", " 1.91000000e+01, 1.00000000e-01, 7.70000000e+00]])" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [], "source": [ "indices = np.arange(X.shape[0]) #shuffle indices\n", "np.random.shuffle(indices)\n", "X = X[indices]\n", "y = y[indices]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2510, 11)" ] }, "execution_count": 19, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X.shape" ] }, { "cell_type": "code", "execution_count": 20, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2510,)" ] }, "execution_count": 20, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y.shape" ] }, { "cell_type": "code", "execution_count": 21, "metadata": {}, "outputs": [], "source": [ "num_one_targets = int(np.sum(y))\n", "num_zero_targets = len(y) - int(np.sum(y))\n", "cutoff1 = int(num_one_targets * .8)\n", "cutoff2 = int(num_zero_targets * .8)\n", "zero_targets_counter = 0 #split\n", "one_targets_counter = 0\n", "indices_train = []\n", "indices_test = []\n", "\n", "for i in range(y.shape[0]):\n", " if y[i]==1:\n", " one_targets_counter +=1\n", " if one_targets_counter <=cutoff1:\n", " indices_train.append(i)\n", " else:\n", " indices_test.append(i)\n", "\n", " if y[i]==0:\n", " zero_targets_counter +=1\n", " if zero_targets_counter <=cutoff2:\n", " indices_train.append(i)\n", " else:\n", " indices_test.append(i)\n", " " ] }, { "cell_type": "code", "execution_count": 22, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "2007" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(indices_train)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "503" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(indices_test)" ] }, { "cell_type": "code", "execution_count": 24, "metadata": {}, "outputs": [], "source": [ "X_train = X[indices_train]\n", "y_train = y[indices_train]\n", "\n", "X_test = X[indices_test]\n", "y_test = y[indices_test]\n" ] }, { "cell_type": "code", "execution_count": 25, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(503,)" ] }, "execution_count": 25, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_test.shape" ] }, { "cell_type": "code", "execution_count": 26, "metadata": {}, "outputs": [], "source": [ "X_train = preprocessing.scale(X_train) #normalize\n", "X_test = preprocessing.scale(X_test)" ] }, { "cell_type": "code", "execution_count": 27, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2007,)" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_train.shape" ] }, { "cell_type": "code", "execution_count": 28, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(503,)" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_test.shape" ] }, { "cell_type": "code", "execution_count": 29, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(2007, 11)" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_train.shape" ] }, { "cell_type": "code", "execution_count": 30, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "(503, 11)" ] }, "execution_count": 30, "metadata": {}, "output_type": "execute_result" } ], "source": [ "X_test.shape" ] }, { "cell_type": "code", "execution_count": 31, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "262" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_train.sum()" ] }, { "cell_type": "code", "execution_count": 32, "metadata": {}, "outputs": [], "source": [ "indices = np.arange(X_train.shape[0]) #shuffle train\n", "np.random.shuffle(indices)\n", "X_train = X_train[indices]\n", "y_train = y_train[indices]" ] }, { "cell_type": "code", "execution_count": 33, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([0, 0, 1, ..., 0, 0, 1], dtype=int64)" ] }, "execution_count": 33, "metadata": {}, "output_type": "execute_result" } ], "source": [ "y_train" ] }, { "cell_type": "code", "execution_count": 34, "metadata": {}, "outputs": [], "source": [ "X_train = X_train.astype('float64') #must convert to int32\n", "y_train = y_train.astype('int32')\n", "X_test = X_test.astype('float64')\n", "y_test = y_test.astype('int32')" ] }, { "cell_type": "code", "execution_count": 35, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Train on 2007 samples, validate on 503 samples\n", "Epoch 1/50\n", "2007/2007 [==============================] - 1s 747us/sample - loss: 0.4113 - accuracy: 0.8515 - val_loss: 0.3665 - val_accuracy: 0.8688\n", "Epoch 2/50\n", "2007/2007 [==============================] - 1s 513us/sample - loss: 0.3538 - accuracy: 0.8700 - val_loss: 0.3536 - val_accuracy: 0.8688\n", "Epoch 3/50\n", "2007/2007 [==============================] - 1s 510us/sample - loss: 0.3452 - accuracy: 0.8705 - val_loss: 0.3455 - val_accuracy: 0.8688\n", "Epoch 4/50\n", "2007/2007 [==============================] - 1s 476us/sample - loss: 0.3399 - accuracy: 0.8705 - val_loss: 0.3400 - val_accuracy: 0.8688\n", "Epoch 5/50\n", "2007/2007 [==============================] - 1s 483us/sample - loss: 0.3353 - accuracy: 0.8700 - val_loss: 0.3352 - val_accuracy: 0.8688\n", "Epoch 6/50\n", "2007/2007 [==============================] - 1s 465us/sample - loss: 0.3313 - accuracy: 0.8700 - val_loss: 0.3317 - val_accuracy: 0.8688\n", "Epoch 7/50\n", "2007/2007 [==============================] - ETA: 0s - loss: 0.3299 - accuracy: 0.86 - 1s 469us/sample - loss: 0.3271 - accuracy: 0.8700 - val_loss: 0.3288 - val_accuracy: 0.8688\n", "Epoch 8/50\n", "2007/2007 [==============================] - 1s 615us/sample - loss: 0.3242 - accuracy: 0.8705 - val_loss: 0.3254 - val_accuracy: 0.8708\n", "Epoch 9/50\n", "2007/2007 [==============================] - 1s 529us/sample - loss: 0.3220 - accuracy: 0.8714 - val_loss: 0.3237 - val_accuracy: 0.8688\n", "Epoch 10/50\n", "2007/2007 [==============================] - 1s 483us/sample - loss: 0.3209 - accuracy: 0.8690 - val_loss: 0.3224 - val_accuracy: 0.8688\n", "Epoch 11/50\n", "2007/2007 [==============================] - 1s 568us/sample - loss: 0.3193 - accuracy: 0.8719 - val_loss: 0.3215 - val_accuracy: 0.8588\n", "Epoch 12/50\n", "2007/2007 [==============================] - 1s 595us/sample - loss: 0.3188 - accuracy: 0.8705 - val_loss: 0.3217 - val_accuracy: 0.8588\n", "Epoch 13/50\n", "2007/2007 [==============================] - 1s 600us/sample - loss: 0.3184 - accuracy: 0.8710 - val_loss: 0.3209 - val_accuracy: 0.8608\n", "Epoch 14/50\n", "2007/2007 [==============================] - 1s 535us/sample - loss: 0.3177 - accuracy: 0.8729 - val_loss: 0.3204 - val_accuracy: 0.8608\n", "Epoch 15/50\n", "2007/2007 [==============================] - 1s 464us/sample - loss: 0.3171 - accuracy: 0.8729 - val_loss: 0.3206 - val_accuracy: 0.8648\n", "Epoch 16/50\n", "2007/2007 [==============================] - 1s 518us/sample - loss: 0.3166 - accuracy: 0.8724 - val_loss: 0.3212 - val_accuracy: 0.8628\n", "Epoch 17/50\n", "2007/2007 [==============================] - 1s 521us/sample - loss: 0.3160 - accuracy: 0.8739 - val_loss: 0.3214 - val_accuracy: 0.8608\n", "Epoch 18/50\n", "2007/2007 [==============================] - 1s 510us/sample - loss: 0.3157 - accuracy: 0.8729 - val_loss: 0.3207 - val_accuracy: 0.8608\n", "Epoch 19/50\n", "2007/2007 [==============================] - 1s 523us/sample - loss: 0.3152 - accuracy: 0.8719 - val_loss: 0.3211 - val_accuracy: 0.8668\n", "Epoch 20/50\n", "2007/2007 [==============================] - 1s 543us/sample - loss: 0.3151 - accuracy: 0.8739 - val_loss: 0.3213 - val_accuracy: 0.8668\n", "Epoch 21/50\n", "2007/2007 [==============================] - 1s 551us/sample - loss: 0.3145 - accuracy: 0.8719 - val_loss: 0.3220 - val_accuracy: 0.8628\n", "Epoch 22/50\n", "2007/2007 [==============================] - 1s 525us/sample - loss: 0.3145 - accuracy: 0.8734 - val_loss: 0.3218 - val_accuracy: 0.8628\n", "Epoch 23/50\n", "2007/2007 [==============================] - 1s 606us/sample - loss: 0.3142 - accuracy: 0.8729 - val_loss: 0.3220 - val_accuracy: 0.8608\n", "Epoch 24/50\n", "2007/2007 [==============================] - 1s 555us/sample - loss: 0.3140 - accuracy: 0.8729 - val_loss: 0.3224 - val_accuracy: 0.8608\n", "Epoch 25/50\n", "2007/2007 [==============================] - 1s 519us/sample - loss: 0.3138 - accuracy: 0.8729 - val_loss: 0.3227 - val_accuracy: 0.8668\n", "Epoch 26/50\n", "2007/2007 [==============================] - 1s 537us/sample - loss: 0.3138 - accuracy: 0.8719 - val_loss: 0.3228 - val_accuracy: 0.8648\n", "Epoch 27/50\n", "2007/2007 [==============================] - 1s 563us/sample - loss: 0.3132 - accuracy: 0.8714 - val_loss: 0.3233 - val_accuracy: 0.8628\n", "Epoch 28/50\n", "2007/2007 [==============================] - 1s 532us/sample - loss: 0.3130 - accuracy: 0.8739 - val_loss: 0.3244 - val_accuracy: 0.8648\n", "Epoch 29/50\n", "2007/2007 [==============================] - 1s 517us/sample - loss: 0.3129 - accuracy: 0.8719 - val_loss: 0.3245 - val_accuracy: 0.8588\n", "Epoch 30/50\n", "2007/2007 [==============================] - 1s 532us/sample - loss: 0.3126 - accuracy: 0.8714 - val_loss: 0.3250 - val_accuracy: 0.8588\n", "Epoch 31/50\n", "2007/2007 [==============================] - 1s 518us/sample - loss: 0.3123 - accuracy: 0.8734 - val_loss: 0.3251 - val_accuracy: 0.8608\n", "Epoch 32/50\n", "2007/2007 [==============================] - 1s 509us/sample - loss: 0.3122 - accuracy: 0.8710 - val_loss: 0.3256 - val_accuracy: 0.8608\n", "Epoch 33/50\n", "2007/2007 [==============================] - 1s 529us/sample - loss: 0.3118 - accuracy: 0.8749 - val_loss: 0.3271 - val_accuracy: 0.8688\n", "Epoch 34/50\n", "2007/2007 [==============================] - 1s 563us/sample - loss: 0.3123 - accuracy: 0.8724 - val_loss: 0.3270 - val_accuracy: 0.8628\n", "Epoch 35/50\n", "2007/2007 [==============================] - 1s 548us/sample - loss: 0.3118 - accuracy: 0.8749 - val_loss: 0.3280 - val_accuracy: 0.8648\n", "Epoch 36/50\n", "2007/2007 [==============================] - 1s 491us/sample - loss: 0.3119 - accuracy: 0.8729 - val_loss: 0.3294 - val_accuracy: 0.8648\n", "Epoch 37/50\n", "2007/2007 [==============================] - 1s 519us/sample - loss: 0.3115 - accuracy: 0.8739 - val_loss: 0.3295 - val_accuracy: 0.8668\n", "Epoch 38/50\n", "2007/2007 [==============================] - 1s 540us/sample - loss: 0.3110 - accuracy: 0.8759 - val_loss: 0.3292 - val_accuracy: 0.8668\n", "Epoch 39/50\n", "2007/2007 [==============================] - 1s 516us/sample - loss: 0.3106 - accuracy: 0.8729 - val_loss: 0.3312 - val_accuracy: 0.8648\n", "Epoch 40/50\n", "2007/2007 [==============================] - 1s 546us/sample - loss: 0.3108 - accuracy: 0.8749 - val_loss: 0.3309 - val_accuracy: 0.8688\n", "Epoch 41/50\n", "2007/2007 [==============================] - 1s 539us/sample - loss: 0.3106 - accuracy: 0.8744 - val_loss: 0.3301 - val_accuracy: 0.8648\n", "Epoch 42/50\n", "2007/2007 [==============================] - 1s 513us/sample - loss: 0.3101 - accuracy: 0.8729 - val_loss: 0.3310 - val_accuracy: 0.8668\n", "Epoch 43/50\n", "2007/2007 [==============================] - 1s 530us/sample - loss: 0.3100 - accuracy: 0.8739 - val_loss: 0.3305 - val_accuracy: 0.8668\n", "Epoch 44/50\n", "2007/2007 [==============================] - 1s 570us/sample - loss: 0.3103 - accuracy: 0.8749 - val_loss: 0.3316 - val_accuracy: 0.8668\n", "Epoch 45/50\n", "2007/2007 [==============================] - 1s 489us/sample - loss: 0.3099 - accuracy: 0.8734 - val_loss: 0.3323 - val_accuracy: 0.8668\n", "Epoch 46/50\n", "2007/2007 [==============================] - 1s 514us/sample - loss: 0.3094 - accuracy: 0.8739 - val_loss: 0.3326 - val_accuracy: 0.8648\n", "Epoch 47/50\n", "2007/2007 [==============================] - 1s 551us/sample - loss: 0.3094 - accuracy: 0.8744 - val_loss: 0.3336 - val_accuracy: 0.8628\n", "Epoch 48/50\n", "2007/2007 [==============================] - 1s 555us/sample - loss: 0.3095 - accuracy: 0.8749 - val_loss: 0.3344 - val_accuracy: 0.8588\n", "Epoch 49/50\n", "2007/2007 [==============================] - 1s 531us/sample - loss: 0.3093 - accuracy: 0.8759 - val_loss: 0.3334 - val_accuracy: 0.8628\n", "Epoch 50/50\n", "2007/2007 [==============================] - 1s 517us/sample - loss: 0.3092 - accuracy: 0.8719 - val_loss: 0.3327 - val_accuracy: 0.8648\n" ] } ], "source": [ "#early_stopping=tf.keras.callbacks.EarlyStopping(patience=2)\n", "\n", "model = tf.keras.Sequential([\n", " tf.keras.layers.Dense(4, activation='relu'),\n", " tf.keras.layers.Dense(3, activation='relu'),\n", " # tf.keras.layers.Dropout(0.4),\n", " tf.keras.layers.Dense(2, activation='softmax')\n", " ])\n", "model.compile(tf.keras.optimizers.Adam(lr=0.001),loss='sparse_categorical_crossentropy',metrics=['accuracy'])\n", "\n", "hist = model.fit(X_train,\n", " y_train,\n", " validation_data=(X_test,y_test),\n", " epochs=50,batch_size=4,verbose=1)\n", "\n", "\n", "#10, 6, 2, lr=.0006" ] }, { "cell_type": "code", "execution_count": 36, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "No handles with labels found to put in legend.\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "No Skill: ROC AUC=0.500\n", "Logistic: ROC AUC=0.788\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "\n", "\n", "ns_probs = [0 for _ in range(len(y_test))]\n", "lr_probs = model.predict_proba(X_test)\n", "# keep probabilities for the positive outcome only\n", "lr_probs = lr_probs[:, 1]\n", "# calculate scores\n", "ns_auc = roc_auc_score(y_test, ns_probs)\n", "lr_auc = roc_auc_score(y_test, lr_probs)\n", "# summarize scores\n", "print('No Skill: ROC AUC=%.3f' % (ns_auc))\n", "print('Logistic: ROC AUC=%.3f' % (lr_auc))\n", "# calculate roc curves\n", "ns_fpr, ns_tpr, _ = roc_curve(y_test, ns_probs)\n", "lr_fpr, lr_tpr, _ = roc_curve(y_test, lr_probs)\n", "# plot the roc curve for the model\n", "pyplot.plot(lr_fpr, lr_tpr, marker='.')\n", "# axis labels\n", "pyplot.xlabel('False Positive Rate')\n", "pyplot.ylabel('True Positive Rate')\n", "# show the legend\n", "pyplot.legend()\n", "# show the plot\n", "pyplot.show()" ] }, { "cell_type": "code", "execution_count": 37, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Saved model to disk\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ "Using TensorFlow backend.\n" ] } ], "source": [ "from keras.models import model_from_json\n", "model_json = model.to_json()\n", "with open(\"icu_bloodtests.json\", \"w\") as json_file:\n", " json_file.write(model_json)\n", "# serialize weights to HDF5\n", "model.save_weights(\"icu_bloodtests_weights.h5\")\n", "print(\"Saved model to disk\")" ] }, { "cell_type": "code", "execution_count": 450, "metadata": { "scrolled": false }, "outputs": [ { "data": { "image/png": "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gwAK1g4hInIyUoIAYtF9roV6mlpE5GSkBEGoYgLIqAghIjJACYLcKiYlCBGRfkoQ5CSIbJEDERGZQpQgCM9BwNQoQVRVVQHQ1NTE9ddfn3ebyy+/nOG38w5366230tHRMfBe3YeLyPFSgmBqVjHNnTuXu+++e8L7D08Q6j5cRI6XEgSFbaS++eabh4wH8cUvfpEvfelLXHnllaxcuZLzzjuP++67b8R+O3fuZNmyZQB0dnaydu1ali9fzvve974hfTHdeOONrFq1iqVLl/KFL3wBCB0ANjU1ccUVV3DFFVcAofvwgwcPAvD1r3+dZcuWsWzZMm699daB7zv33HP52Mc+xtKlS7nqqqvU55NIiSutrjYevAX2PjNicQJncXeGZCIG8ePMmbPPg2u+MurqtWvX8ulPf5pPfOITAPzoRz/ipz/9KX/xF39BTU0NBw8e5JJLLuHtb3/7qOM9f+tb36KyspItW7awZcsWVq5cObDu7/7u75g2bRqZTIYrr7ySLVu28Od//ud8/etf55FHHqGhoWHIZ23atInvfve7PPHEE7g7F198MX/wB39AfX29uhUXkSFUgiiwCy64gP3799PU1MTTTz9NfX09c+bM4bOf/SzLly/nzW9+M7t372bfvn2jfsZjjz02cKJevnw5y5cvH1j3ox/9iJUrV3LBBRfw7LPPsm3btjHj+fWvf8073/lO0uk0VVVVvOtd7+JXv/oVoG7FRWSo0ipBjHKlb8DO3UeYlk4yt27yR2q7/vrrufvuu9m7dy9r167lzjvv5MCBA2zatImysjIWLlyYt5vvITHmKV288sorfO1rX2PDhg3U19dzww03HPNzxupORN2Ki0gulSAisQKOS7127Vruuusu7r77bq6//nqOHDnCzJkzKSsr45FHHuHVV18dc//LLruMO++8E4CtW7eyZcsWAI4ePUo6naa2tpZ9+/bx4IMPDuwzWjfjl112Gffeey8dHR20t7ezfv163vjGN07iTysip4rSKkGMIW6Few5i6dKltLa2Mm/ePObMmcMHP/hB3va2t7Fq1SpWrFjBOeecM+b+N954Ix/5yEdYvnw5K1asYPXq1QCcf/75XHDBBSxdupTFixezZs2agX3WrVvHNddcw5w5c3jkkUcGlq9cuZIbbrhh4DP+5E/+hAsuuEDVSSIygrr7jry0r5WyeIyFDelj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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "from matplotlib import pyplot as plt\n", "plt.plot(hist.history['loss'])\n", "plt.plot(hist.history['val_loss'])\n", "plt.title('Loss')\n", "plt.ylabel('loss')\n", "plt.xlabel('epoch')\n", "plt.legend(['train', 'validation'], loc='upper left')\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 451, "metadata": {}, "outputs": [], "source": [ "X_train_summary = shap.kmeans(X_train, 5)" ] }, { "cell_type": "code", "execution_count": 452, "metadata": { "scrolled": false }, "outputs": [], "source": [ "explainer = shap.KernelExplainer(model.predict, X_train_summary)" ] }, { "cell_type": "code", "execution_count": 453, "metadata": { "scrolled": true }, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "9766deb943dc4b6f88d0400f08e33656", "version_major": 2, "version_minor": 0 }, "text/plain": [ "HBox(children=(FloatProgress(value=0.0, max=2007.0), HTML(value='')))" ] }, "metadata": {}, "output_type": "display_data" }, { "name": "stderr", "output_type": "stream", "text": [ "l1_reg=\"auto\" is deprecated and in the next version (v0.29) the behavior will change from a conditional use of AIC to simply \"num_features(10)\"!\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "\n" ] } ], "source": [ "shap_values = explainer.shap_values(X_train)" ] }, { "cell_type": "code", "execution_count": 454, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhkAAAFxCAYAAADeVbohAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nO3df5xV9X3n8dcXBqORAKbKWiJmMCAtNWLCJ924YopGja2ZrEnqqlGiofiju65ulSyrRKSAIjaWll3TGKqgiUDUolWjaIziSnbX5lOVJKUalV9KQoXIGBUSQc7+8f1OOHO9d+bO3HNmHOb9fDzmMff8+H7P95x77r2f+/1+zj0hyzJEREREijagtxsgIiIi+yYFGSIiIlIKBRkiIiJSCgUZIiIiUgoFGSIiIlIKBRkiIiJSiqbebsC+5v77789aWlp6uxkiIiI9KVSbqZ4MERERKYWCDBERESmFggwREREphYIMERERKYWCDBERESmFggwREREphYIMERERKYWCDBERESmFggwREREphYIMERERKYWCDBERESmFggwREREphYIMERERKYWCDBERESmFggwREREphYIMERERKUXIsqy327BPCV/frQMqIiLvSdm0prKqDtVmqidDRERESqEgQ0REREqhIENERERKoSBDRERESqEgQ0RERErRcJqpma0CjgV25WYvd/epDdbbDKwHRrr7K43U1Y1tjwVuA8YAg4BXgL9x92/1ZDtERET6sqKuZZnj7nMLqqtQZjbI3Xd1vmY7W4DJwDp3f8fMjgYeNbMN7v5I8a0UERHZ95R2wSyAmR0F3AhMAHYAdwAz2z70zWwxcBIwDHgZmOvuS1PxNen/82aWAfPdfU56fLy7r051TAIedfemNL0KeBZoBk4ErgOuN7MLgMuAkcA6YHqtgMHdXwdez83K0t9YQEGGiIhIHUrLyTCz4cATwApgBHFI5WTgytxqq4FjiEHGbGCJmY1Ly8an/2PdfbC7z+nC5qcAC4GhwEIzuxCYDpwDHATMAFaY2ehO9uHHZvYb4MfAq8CyLrRBRESkXyuqJ2OGmU3LTZ8KTATWuPvNad5mM5sHzCcGFLj7Lbkyy1Mdk4C1Dbbnbnd/LD3eYWaXArPdva135EEzexw4C6g5zOPuR5vZIOBT6e+tBtslIiLSbxQVZFxb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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "shap.summary_plot(shap_values[0], X_train, plot_type=\"bar\")" ] }, { "cell_type": "code", "execution_count": 196, "metadata": {}, "outputs": [], "source": [ "pd.set_option('max_columns',None)" ] }, { "cell_type": "code", "execution_count": 197, "metadata": { "scrolled": true }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
in_icuALTVALUEASTVALUEBNPVALUECRPVALUECRTVALUEDDIMVALUEFERRVALUELDHVALUELYMPHVALUEPROCALVALUETNTVALUEWBCVALUE
count2510.0000002510.0000002510.0000002510.0000002510.0000002510.0000002510.0000002510.0000002510.0000002510.0000002510.0000002510.0000002510.000000
mean0.13067746.83335456.9121313121.6932659.6609062.4931841023.8519171051.200485374.96447616.0626331.0435510.2146357.943746
std0.33711499.578981131.44753317183.7469838.65946511.6883893228.3467621238.821289172.41177310.4240287.2797660.1268205.446964
min0.0000005.0000007.0000005.0000000.1000000.200000150.0000005.300000109.0000000.1000000.0500000.0000000.900000
25%0.00000018.00000026.00000088.0000003.1000000.700000240.000000352.125000257.0000008.6000000.1000000.2292915.100000
50%0.00000030.00000038.000000683.0000007.7000000.900000411.000000794.300000346.00000014.0000000.2000000.2292916.850000
75%0.00000051.00000058.0000003255.41876713.3000001.200000929.7500001266.500000444.00000021.3000000.5000000.2292919.200000
max1.0000002909.0000004162.000000350000.00000056.600000328.50000063670.00000016291.0000001804.00000092.000000193.5000003.000000115.300000
\n", "
" ], "text/plain": [ " in_icu ALTVALUE ASTVALUE BNPVALUE CRPVALUE \\\n", "count 2510.000000 2510.000000 2510.000000 2510.000000 2510.000000 \n", "mean 0.130677 46.833354 56.912131 3121.693265 9.660906 \n", "std 0.337114 99.578981 131.447533 17183.746983 8.659465 \n", "min 0.000000 5.000000 7.000000 5.000000 0.100000 \n", "25% 0.000000 18.000000 26.000000 88.000000 3.100000 \n", "50% 0.000000 30.000000 38.000000 683.000000 7.700000 \n", "75% 0.000000 51.000000 58.000000 3255.418767 13.300000 \n", "max 1.000000 2909.000000 4162.000000 350000.000000 56.600000 \n", "\n", " CRTVALUE DDIMVALUE FERRVALUE LDHVALUE LYMPHVALUE \\\n", "count 2510.000000 2510.000000 2510.000000 2510.000000 2510.000000 \n", "mean 2.493184 1023.851917 1051.200485 374.964476 16.062633 \n", "std 11.688389 3228.346762 1238.821289 172.411773 10.424028 \n", "min 0.200000 150.000000 5.300000 109.000000 0.100000 \n", "25% 0.700000 240.000000 352.125000 257.000000 8.600000 \n", "50% 0.900000 411.000000 794.300000 346.000000 14.000000 \n", "75% 1.200000 929.750000 1266.500000 444.000000 21.300000 \n", "max 328.500000 63670.000000 16291.000000 1804.000000 92.000000 \n", "\n", " PROCALVALUE TNTVALUE WBCVALUE \n", "count 2510.000000 2510.000000 2510.000000 \n", "mean 1.043551 0.214635 7.943746 \n", "std 7.279766 0.126820 5.446964 \n", "min 0.050000 0.000000 0.900000 \n", "25% 0.100000 0.229291 5.100000 \n", "50% 0.200000 0.229291 6.850000 \n", "75% 0.500000 0.229291 9.200000 \n", "max 193.500000 3.000000 115.300000 " ] }, "execution_count": 197, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df.describe()" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.7.7" } }, "nbformat": 4, "nbformat_minor": 4 }