commit 9135e7794252a08f79b0ed321dd482ca07f1bb78 Author: wuhanstudio Date: Mon Jan 3 09:49:45 2022 +0000 Initial Commit diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..87620ac --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +.ipynb_checkpoints/ diff --git a/2_type_with_ct_score.ipynb b/2_type_with_ct_score.ipynb new file mode 100644 index 0000000..70fc1f7 --- /dev/null +++ b/2_type_with_ct_score.ipynb @@ -0,0 +1,2724 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Interpretable ML - COVID19\n", + "> Interpretable ML Research for COVID19\n", + "- toc:true\n", + "- branch: master\n", + "- badges: true\n", + "- comments: true\n", + "- author: Han Wu\n", + "- categories: [jupyter]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 0. Load Data" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [], + "source": [ + "np.set_printoptions(suppress=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [], + "source": [ + "covid = pd.read_csv(\"dataset/covid.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AVG age for severity 0: 36.833333333333336\n", + "AVG age for severity 1: 47.45283018867924\n", + "AVG age for severity 2: 54.3125\n", + "AVG age for severity 3: 69.4\n" + ] + } + ], + "source": [ + "print(\"AVG age for severity 0:\", np.mean(covid[covid.Severity03 == 0].Age.to_numpy()))\n", + "print(\"AVG age for severity 1:\", np.mean(covid[covid.Severity03 == 1].Age.to_numpy()))\n", + "print(\"AVG age for severity 2:\", np.mean(covid[covid.Severity03 == 2].Age.to_numpy()))\n", + "print(\"AVG age for severity 3:\", np.mean(covid[covid.Severity03 == 3].Age.to_numpy()))" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(92, 74)" + ] + }, + "execution_count": 23, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "covid.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Data Wash" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Features that has NULL value" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "remove_columns = ['MedNum', 'LVEF', 'SO2', 'PO2', 'YHZS', 'RML', 'RUL', 'RLL', 'LUL', 'LLL']" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop(remove_columns, axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Features that records time rather than biomarkers" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [], + "source": [ + "remove_columns = ['Onset2Admi', 'Onset2CT1', 'Onset2CTPositive1', 'Onset2CTPeak']" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop(remove_columns, axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Patients that have no records" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid[covid.Weight != \" \"]" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid[covid.cTnI != \" \"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "String to Float" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [], + "source": [ + "covid['Weight'] = covid['Weight'].astype(np.float64)\n", + "covid['Height'] = covid['Height'].astype(np.float64)\n", + "covid['cTnITimes'] = covid['cTnITimes'].astype(np.float64)\n", + "covid['cTnI'] = covid['cTnI'].astype(np.float64)\n", + "covid['NTproBNP'] = covid['NTproBNP'].astype(np.float64)\n", + "covid['Cr'] = covid['Cr'].astype(np.float64)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Train Test Split" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn import preprocessing\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "y = covid.Severity01.to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# Use Both\n", + "covid = covid.drop([\"Severity01\", \"Severity03\"], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "# Use None\n", + "# covid = covid.drop([\"Severity01\", \"Severity03\", \"CTScore\", \"AIVolumeP\"], axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Patient No. is irrrelevant" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop([\"No\"], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "X = covid\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.9, random_state = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 57), (9, 57))" + ] + }, + "execution_count": 37, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Sex', 'Age', 'AgeG1', 'Height', 'Weight', 'BMI', 'Temp', 'CTScore',\n", + " 'AIVolumeP', 'cTnITimes', 'cTnI', 'cTnICKMBOrdinal1',\n", + " 'cTnICKMBOrdinal2', 'AST', 'LDH', 'CK', 'CKMB', 'HBDH', 'HiCKMB',\n", + " 'NTproBNP', 'Cr', 'PCT1', 'WBC1', 'NEU1', 'LYM1', 'N2L1', 'CRP1',\n", + " 'ALB1', 'PCT2', 'WBC2', 'NEU2', 'LYM2', 'N2L2', 'CRP2', 'ALB2',\n", + " 'Sympton', 'Fever', 'Cough', 'Phlegm', 'Hemoptysis', 'SoreThroat',\n", + " 'Catarrh', 'Headache', 'ChestPain', 'Fatigue', 'SoreMuscle',\n", + " 'Stomachache', 'Diarrhea', 'PoorAppetite', 'NauseaNVomit',\n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Lung', 'CAD', 'Arrythmia',\n", + " 'Cancer'],\n", + " dtype='object')" + ] + }, + "execution_count": 38, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 1, 0, 0, 1, 1, 0, 1, 0], dtype=int64)" + ] + }, + "execution_count": 39, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_test" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Feature Selection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.1 Basic Methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1.1 Drop constant and Quasi-constant features" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_selection import VarianceThreshold" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "def drop_features(X_train, X_test, threshhold):\n", + " sel = VarianceThreshold(threshold=threshhold)\n", + " sel.fit(X_train)\n", + " print(\"No. of constant features:\",\n", + " len([\n", + " x for x in X_train.columns\n", + " if x not in X_train.columns[sel.get_support()]\n", + " ])\n", + " )\n", + " constant_features = [x for x in X_train.columns if x not in X_train.columns[sel.get_support()]]\n", + "\n", + " print(constant_features)\n", + " X_train.drop(labels=constant_features, axis=1, inplace=True)\n", + " X_test.drop(labels=constant_features, axis=1, inplace=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Drop constant and quasi-constant features" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No. of constant features: 2\n", + "['PCT2', 'Stomachache']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n" + ] + } + ], + "source": [ + "drop_features(X_train, X_test, 0.01)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 55), (9, 55))" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1.2 Drop Duplicated Features" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Maybe some symptoms are correlated" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No. of Duplicated Features: 1\n", + "['Arrythmia']\n" + ] + } + ], + "source": [ + "covid_t = covid.T\n", + "print(\"No. of Duplicated Features:\", covid_t.duplicated().sum())\n", + "print(covid_t[covid_t.duplicated()].index.values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print out duplicated features" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CAD\n", + "Arrythmia\n" + ] + } + ], + "source": [ + "duplicated_feat = []\n", + "for i in range(0, len(X_train.columns)):\n", + " col_1 = X_train.columns[i]\n", + " for col_2 in X_train.columns[i + 1 : ]:\n", + " if X_train[col_1].equals(X_train[col_2]):\n", + " print(col_1)\n", + " print(col_2) \n", + " duplicated_feat.append(col_2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Drop duplicated features" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "# covid_unique = covid_t.drop_duplicates(keep='first').T" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "X_train.drop(labels=covid_t[covid_t.duplicated()].index.values, axis=1, inplace=True)\n", + "X_test.drop(labels=covid_t[covid_t.duplicated()].index.values, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 54), (9, 54))" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2 Correlations" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "categorical_features = ['Sex', 'AgeG1', \n", + " 'Fever', 'Cough', 'Phlegm', 'Hemoptysis', 'SoreThroat', 'Catarrh', 'Headache', 'ChestPain', 'Fatigue', 'SoreMuscle', # 'Stomachache', \n", + " 'Diarrhea', 'PoorAppetite', 'NauseaNVomit', \n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Lung', #'CAD', 'Arrythmia', \n", + " 'Cancer']" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "numerical_features = ['Age', 'Height', 'Weight', 'BMI', 'Temp', 'cTnITimes', 'cTnI', 'cTnICKMBOrdinal1', 'cTnICKMBOrdinal2', 'AST',\n", + " 'LDH', 'CK', 'CKMB', 'HBDH', 'HiCKMB', 'NTproBNP', 'Cr', 'PCT1', 'WBC1',\n", + " 'NEU1', 'LYM1', 'N2L1', 'CRP1', 'ALB1', 'WBC2', 'NEU2', 'LYM2', 'N2L2',\n", + " 'CRP2', 'ALB2']" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": {}, + "outputs": [], + "source": [ + "# numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']\n", + "# numerical_vars = list(covid.select_dtypes(include=numerics).columns)\n", + "# data = covid[numerical_vars]" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "corrmat = X_train.corr()" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "fig.set_size_inches(11, 11)\n", + "sns.heatmap(corrmat)" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "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", + "
feature1feature2corr
0LDHHBDH0.958191
1HBDHLDH0.958191
2HeightPoorAppetite0.911704
3PoorAppetiteHeight0.911704
4WBC2NEU20.911419
5NEU2WBC20.911419
6WBC1NEU10.903520
7NEU1WBC10.903520
8AgeG1Age0.893413
9AgeAgeG10.893413
10AIVolumePCTScore0.874107
11CTScoreAIVolumeP0.874107
12cTnICKMBOrdinal1cTnICKMBOrdinal20.853741
13cTnICKMBOrdinal2cTnICKMBOrdinal10.853741
14LYM1LYM20.842688
15LYM2LYM10.842688
16BMIWeight0.842409
17WeightBMI0.842409
18NTproBNPN2L20.808767
19N2L2NTproBNP0.808767
\n", + "
" + ], + "text/plain": [ + " feature1 feature2 corr\n", + "0 LDH HBDH 0.958191\n", + "1 HBDH LDH 0.958191\n", + "2 Height PoorAppetite 0.911704\n", + "3 PoorAppetite Height 0.911704\n", + "4 WBC2 NEU2 0.911419\n", + "5 NEU2 WBC2 0.911419\n", + "6 WBC1 NEU1 0.903520\n", + "7 NEU1 WBC1 0.903520\n", + "8 AgeG1 Age 0.893413\n", + "9 Age AgeG1 0.893413\n", + "10 AIVolumeP CTScore 0.874107\n", + "11 CTScore AIVolumeP 0.874107\n", + "12 cTnICKMBOrdinal1 cTnICKMBOrdinal2 0.853741\n", + "13 cTnICKMBOrdinal2 cTnICKMBOrdinal1 0.853741\n", + "14 LYM1 LYM2 0.842688\n", + "15 LYM2 LYM1 0.842688\n", + "16 BMI Weight 0.842409\n", + "17 Weight BMI 0.842409\n", + "18 NTproBNP N2L2 0.808767\n", + "19 N2L2 NTproBNP 0.808767" + ] + }, + "execution_count": 54, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "corrmat = X_train.corr()\n", + "corrmat = corrmat.abs().unstack()\n", + "corrmat = corrmat.sort_values(ascending=False)\n", + "corrmat = corrmat[corrmat >= 0.8]\n", + "corrmat = corrmat[corrmat < 1]\n", + "corrmat = pd.DataFrame(corrmat).reset_index()\n", + "corrmat.columns = ['feature1', 'feature2', 'corr']\n", + "corrmat" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found 10 correlated groups\n", + "out of 54 total features\n" + ] + } + ], + "source": [ + "# find groups of correlated features\n", + "\n", + "grouped_feature_ls = []\n", + "correlated_groups = []\n", + "\n", + "for feature in corrmat.feature1.unique():\n", + " if feature not in grouped_feature_ls:\n", + "\n", + " # find all features correlated to a single feature\n", + " correlated_block = corrmat[corrmat.feature1 == feature]\n", + " grouped_feature_ls = grouped_feature_ls + list(\n", + " correlated_block.feature2.unique()) + [feature]\n", + "\n", + " # append the block of features to the list\n", + " correlated_groups.append(correlated_block)\n", + "\n", + "print('found {} correlated groups'.format(len(correlated_groups)))\n", + "print('out of {} total features'.format(X_train.shape[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " feature1 feature2 corr\n", + "0 LDH HBDH 0.958191\n", + "\n", + " feature1 feature2 corr\n", + "2 Height PoorAppetite 0.911704\n", + "\n", + " feature1 feature2 corr\n", + "4 WBC2 NEU2 0.911419\n", + "\n", + " feature1 feature2 corr\n", + "6 WBC1 NEU1 0.90352\n", + "\n", + " feature1 feature2 corr\n", + "8 AgeG1 Age 0.893413\n", + "\n", + " feature1 feature2 corr\n", + "10 AIVolumeP CTScore 0.874107\n", + "\n", + " feature1 feature2 corr\n", + "12 cTnICKMBOrdinal1 cTnICKMBOrdinal2 0.853741\n", + "\n", + " feature1 feature2 corr\n", + "14 LYM1 LYM2 0.842688\n", + "\n", + " feature1 feature2 corr\n", + "16 BMI Weight 0.842409\n", + "\n", + " feature1 feature2 corr\n", + "18 NTproBNP N2L2 0.808767\n", + "\n" + ] + } + ], + "source": [ + "# now we can visualise each group. We see that some groups contain\n", + "# only 2 correlated features, some other groups present several features \n", + "# that are correlated among themselves.\n", + "\n", + "for group in correlated_groups:\n", + " print(group)\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "def correlation(dataset, threshold):\n", + " col_corr = set()\n", + " corr_matrix = dataset.corr()\n", + " for i in range(len(corr_matrix.columns)):\n", + " for j in range(i):\n", + " if abs(corr_matrix.iloc[i, j] >= threshold):\n", + " colname = corr_matrix.columns[i]\n", + " col_corr.add(colname)\n", + " return col_corr" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['LYM2', 'NEU1', 'NEU2', 'BMI', 'N2L2', 'AgeG1', 'AIVolumeP', 'cTnICKMBOrdinal2', 'HBDH']\n" + ] + } + ], + "source": [ + "corr_features = list((correlation(X_train, 0.8)))\n", + "print(corr_features)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [], + "source": [ + "for i in corr_features:\n", + " if i in categorical_features:\n", + " corr_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "for i in corr_features:\n", + " if i in numerical_features:\n", + " numerical_features.remove(i)\n", + "\n", + "for i in corr_features:\n", + " if i in categorical_features:\n", + " categorical_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['LYM2',\n", + " 'NEU1',\n", + " 'NEU2',\n", + " 'BMI',\n", + " 'N2L2',\n", + " 'AIVolumeP',\n", + " 'cTnICKMBOrdinal2',\n", + " 'HBDH']" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "corr_features" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n" + ] + } + ], + "source": [ + "X_train.drop(labels=corr_features, axis=1, inplace=True)\n", + "X_test.drop(labels=corr_features, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 46), (9, 46))" + ] + }, + "execution_count": 63, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.3 Statistical Methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3.1 Mutual Information" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_selection import mutual_info_classif, mutual_info_regression\n", + "from sklearn.feature_selection import SelectKBest, SelectPercentile" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [], + "source": [ + "mi = mutual_info_classif(X_train, y_train)\n", + "mi = pd.Series(mi)\n", + "mi.index = X_train.columns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Features on the left side have more mutual information with y" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 66, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mi.sort_values(ascending=False).plot.bar(figsize=(20, 8))" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [], + "source": [ + "sel_ = SelectKBest(mutual_info_classif, k = 40).fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [], + "source": [ + "mi_features = list(X_train.columns[ ~ sel_.get_support()].values)" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "for i in mi_features:\n", + " if i in categorical_features:\n", + " mi_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": {}, + "outputs": [], + "source": [ + "for i in mi_features:\n", + " if i in numerical_features:\n", + " numerical_features.remove(i)\n", + "\n", + "for i in mi_features:\n", + " if i in categorical_features:\n", + " categorical_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Height', 'CK', 'HiCKMB', 'Cr', 'PCT1']" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mi_features" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n" + ] + } + ], + "source": [ + "X_train.drop(labels=mi_features, axis=1, inplace=True)\n", + "X_test.drop(labels=mi_features, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 41), (9, 41))" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3.2 Fisher Score" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_selection import chi2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "categorical features" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "f_score = chi2(X_train[categorical_features], y_train)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The smaller ones have more correlations" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Cancer 0.887949\n", + "SoreThroat 0.842057\n", + "Cough 0.703238\n", + "Headache 0.638344\n", + "Hemoptysis 0.594525\n", + "NauseaNVomit 0.356552\n", + "ChestPain 0.356552\n", + "Diarrhea 0.333947\n", + "Sex 0.302537\n", + "Fever 0.202574\n", + "Catarrh 0.159040\n", + "Hypertention 0.154388\n", + "SoreMuscle 0.105717\n", + "Hyperlipedia 0.099153\n", + "Lung 0.062605\n", + "PoorAppetite 0.060289\n", + "Phlegm 0.046410\n", + "AgeG1 0.037459\n", + "DM 0.008457\n", + "Fatigue 0.000049\n", + "dtype: float64" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p_values = pd.Series(f_score[1])\n", + "p_values.index = X_train[categorical_features].columns\n", + "p_values.sort_values(ascending=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['AgeG1', 'Phlegm', 'Fatigue', 'DM'], dtype=object)" + ] + }, + "execution_count": 77, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p_values[p_values<0.05].index.values" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [], + "source": [ + "# for c in categorical_features:\n", + "# if c not in p_values[p_values<0.05].index.values:\n", + "# categorical_features.remove(c)\n", + "# print(c)\n", + "# X_train.drop(labels=c, axis=1, inplace=True)\n", + "# X_test.drop(labels=c, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 41), (9, 41))" + ] + }, + "execution_count": 79, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3.3 Univariate" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Non-categorical features" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_selection import f_classif, f_regression" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [], + "source": [ + "univariate = f_classif(X_train[numerical_features], y_train)\n", + "univariate = pd.Series(univariate[1])\n", + "univariate.index = X_train[numerical_features].columns\n", + "univariate.sort_values(ascending=False, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "univariate.sort_values(ascending=False).plot.bar(figsize=(20, 8))" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Temp 0.437049\n", + "WBC1 0.430778\n", + "AST 0.376614\n", + "CKMB 0.351257\n", + "WBC2 0.207957\n", + "Weight 0.191531\n", + "dtype: float64" + ] + }, + "execution_count": 83, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "univariate[univariate > 0.05]" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Weight\n", + "AST\n", + "CKMB\n", + "WBC1\n", + "WBC2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n" + ] + } + ], + "source": [ + "for n in numerical_features:\n", + " if n in univariate[univariate > 0.05].index.values:\n", + " numerical_features.remove(n)\n", + " print(n)\n", + " X_train.drop(labels=n, axis=1, inplace=True)\n", + " X_test.drop(labels=n, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "(77, 36)" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3.4 ROC-AUC" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor\n", + "from sklearn.metrics import roc_auc_score, mean_squared_error" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [], + "source": [ + "# loop to build a tree, make predictions and get the roc-auc\n", + "# for each feature of the train set\n", + "\n", + "roc_values = []\n", + "for feature in X_train.columns:\n", + " clf = DecisionTreeClassifier()\n", + " clf.fit(X_train[feature].fillna(0).to_frame(), y_train)\n", + " y_scored = clf.predict_proba(X_test[feature].fillna(0).to_frame())\n", + " roc_values.append(roc_auc_score(y_test, y_scored[:, 1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "cTnITimes 0.775\n", + "Fever 0.675\n", + "CRP2 0.675\n", + "SoreThroat 0.650\n", + "NTproBNP 0.650\n", + "ALB2 0.625\n", + "Headache 0.625\n", + "LYM1 0.625\n", + "N2L1 0.625\n", + "CTScore 0.600\n", + "AgeG1 0.550\n", + "ChestPain 0.500\n", + "Diarrhea 0.500\n", + "Hemoptysis 0.500\n", + "Phlegm 0.500\n", + "Age 0.500\n", + "NauseaNVomit 0.500\n", + "Lung 0.500\n", + "PoorAppetite 0.500\n", + "SoreMuscle 0.500\n", + "CRP1 0.500\n", + "cTnICKMBOrdinal1 0.500\n", + "cTnI 0.500\n", + "CAD 0.500\n", + "Fatigue 0.500\n", + "LDH 0.500\n", + "Sex 0.450\n", + "ALB1 0.450\n", + "Hypertention 0.425\n", + "DM 0.400\n", + "Hyperlipedia 0.400\n", + "Cancer 0.400\n", + "Catarrh 0.375\n", + "Sympton 0.375\n", + "Cough 0.325\n", + "Temp 0.175\n", + "dtype: float64" + ] + }, + "execution_count": 88, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# let's add the variable names and order it for clearer visualisation\n", + "roc_values = pd.Series(roc_values)\n", + "roc_values.index = X_train.columns\n", + "roc_values.sort_values(ascending=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 89, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 89, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# and now let's plot\n", + "roc_values.sort_values(ascending=False).plot.bar(figsize=(20, 8))" + ] + }, + { + "cell_type": "code", + "execution_count": 90, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 90, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# a roc auc value of 0.5 indicates random decision\n", + "# let's check how many features show a roc-auc value\n", + "# higher than random\n", + "\n", + "len(roc_values[roc_values > 0.5])" + ] + }, + { + "cell_type": "code", + "execution_count": 91, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Sex 0.450\n", + "Temp 0.175\n", + "LDH 0.500\n", + "ALB1 0.450\n", + "Sympton 0.375\n", + "Cough 0.325\n", + "Catarrh 0.375\n", + "Hypertention 0.425\n", + "Hyperlipedia 0.400\n", + "DM 0.400\n", + "Cancer 0.400\n", + "dtype: float64" + ] + }, + "execution_count": 91, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "roc_values[roc_values < 0.5]" + ] + }, + { + "cell_type": "code", + "execution_count": 92, + "metadata": {}, + "outputs": [], + "source": [ + "roc_features = roc_values[roc_values < 0.5].index.values" + ] + }, + { + "cell_type": "code", + "execution_count": 93, + "metadata": {}, + "outputs": [], + "source": [ + "for i in roc_features:\n", + " if i in numerical_features:\n", + " numerical_features.remove(i)\n", + "\n", + "for i in roc_features:\n", + " if i in categorical_features:\n", + " categorical_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 94, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['Sex', 'Temp', 'LDH', 'ALB1', 'Sympton', 'Cough', 'Catarrh',\n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Cancer'], dtype=object)" + ] + }, + "execution_count": 94, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "roc_features" + ] + }, + { + "cell_type": "code", + "execution_count": 95, + "metadata": {}, + "outputs": [], + "source": [ + "# X_train.drop(labels=roc_features, axis=1, inplace=True)\n", + "# X_test.drop(labels=roc_features, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 96, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 36), (9, 36))" + ] + }, + "execution_count": 96, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 97, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Sex', 'Age', 'AgeG1', 'Temp', 'CTScore', 'cTnITimes', 'cTnI',\n", + " 'cTnICKMBOrdinal1', 'LDH', 'NTproBNP', 'LYM1', 'N2L1', 'CRP1', 'ALB1',\n", + " 'CRP2', 'ALB2', 'Sympton', 'Fever', 'Cough', 'Phlegm', 'Hemoptysis',\n", + " 'SoreThroat', 'Catarrh', 'Headache', 'ChestPain', 'Fatigue',\n", + " 'SoreMuscle', 'Diarrhea', 'PoorAppetite', 'NauseaNVomit',\n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Lung', 'CAD', 'Cancer'],\n", + " dtype='object')" + ] + }, + "execution_count": 97, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.columns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 98, + "metadata": {}, + "outputs": [], + "source": [ + "import sklearn\n", + "import sklearn.ensemble\n", + "import sklearn.metrics\n", + "import xgboost as xgb" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Cross Validation**" + ] + }, + { + "cell_type": "code", + "execution_count": 99, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import cross_val_score" + ] + }, + { + "cell_type": "code", + "execution_count": 100, + "metadata": {}, + "outputs": [], + "source": [ + "def cv_score(classifier, X, y, scoring):\n", + " return cross_val_score(classifier, X, y, cv=5, scoring=scoring)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Decision Tree**" + ] + }, + { + "cell_type": "code", + "execution_count": 101, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DecisionTreeClassifier()" + ] + }, + "execution_count": 101, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dt = sklearn.tree.DecisionTreeClassifier()\n", + "\n", + "dt_f1 = cv_score(dt, X_train, y_train, 'f1')\n", + "\n", + "dt.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 102, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.5642857142857143\n" + ] + } + ], + "source": [ + "print(np.mean(dt_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Random Forest**" + ] + }, + { + "cell_type": "code", + "execution_count": 103, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.ensemble import RandomForestClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 104, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RandomForestClassifier()" + ] + }, + "execution_count": 104, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rf = sklearn.ensemble.RandomForestClassifier(n_estimators=100)\n", + "\n", + "rf_f1 = cv_score(rf, X_train, y_train, 'f1')\n", + "\n", + "rf.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 105, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.66\n" + ] + } + ], + "source": [ + "print(np.mean(rf_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**SVM**" + ] + }, + { + "cell_type": "code", + "execution_count": 106, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.svm import SVC" + ] + }, + { + "cell_type": "code", + "execution_count": 107, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "SVC(probability=True)" + ] + }, + "execution_count": 107, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "svc = SVC(probability=True)\n", + "\n", + "svc_f1 = cv_score(svc, X_train, y_train, 'f1')\n", + "\n", + "svc.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 108, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6733333333333333\n" + ] + } + ], + "source": [ + "print(np.mean(svc_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**XGBoost**" + ] + }, + { + "cell_type": "code", + "execution_count": 109, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[21:07:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[21:07:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n", + "[21:07:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[21:07:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n", + "[21:07:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n", + "[21:07:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n" + ] + }, + { + "data": { + "text/plain": [ + "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n", + " colsample_bynode=1, colsample_bytree=0.7, gamma=0, gpu_id=-1,\n", + " importance_type='gain', interaction_constraints='',\n", + " learning_rate=0.300000012, max_delta_step=0, max_depth=4,\n", + " min_child_weight=0, missing=nan, monotone_constraints='()',\n", + " n_estimators=100, n_jobs=8, num_parallel_tree=1, random_state=0,\n", + " reg_alpha=4, reg_lambda=1, scale_pos_weight=9, subsample=0.8,\n", + " tree_method='exact', validate_parameters=1, verbosity=None)" + ] + }, + "execution_count": 109, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create a model\n", + "# Params from: https://www.kaggle.com/aharless/swetha-s-xgboost-revised\n", + "xgbc = xgb.XGBClassifier(\n", + " max_depth = 4,\n", + " subsample = 0.8,\n", + " colsample_bytree = 0.7,\n", + " colsample_bylevel = 0.7,\n", + " scale_pos_weight = 9,\n", + " min_child_weight = 0,\n", + " reg_alpha = 4,\n", + " objective = 'binary:logistic'\n", + ")\n", + "\n", + "xgbc_f1 = cv_score(xgbc, X_train, y_train, 'f1')\n", + "\n", + "# Fit the models\n", + "xgbc.fit(np.array(X_train), np.array(y_train))" + ] + }, + { + "cell_type": "code", + "execution_count": 110, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6714285714285715\n" + ] + } + ], + "source": [ + "print(np.mean(xgbc_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Save Models" + ] + }, + { + "cell_type": "code", + "execution_count": 114, + "metadata": {}, + "outputs": [], + "source": [ + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 133, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"2-type-model-4-ct.pkl\", 'wb') as f:\n", + " pickle.dump([dt, rf, svc, xgbc], f)\n", + "with open(\"dataset/2-type-dataset-ct.pkl\", 'wb') as f:\n", + " pickle.dump([X_train, X_test, y_train, y_test], f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load Models" + ] + }, + { + "cell_type": "code", + "execution_count": 116, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"2-type-model-4-ct.pkl\", 'rb') as f:\n", + " [dt, rf, svc, xgbc] = pickle.load(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 117, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"dataset/2-type-dataset-ct.pkl\", 'rb') as f:\n", + " [X_train, X_test, y_train, y_test] = pickle.load(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Prediction**" + ] + }, + { + "cell_type": "code", + "execution_count": 118, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import sklearn" + ] + }, + { + "cell_type": "code", + "execution_count": 119, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "dt_pred = dt.predict(X_test)\n", + "rf_pred = rf.predict(X_test)\n", + "svc_pred = svc.predict(X_test)\n", + "xgbc_pred = xgbc.predict(np.array(X_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 120, + "metadata": {}, + "outputs": [], + "source": [ + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": 121, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Decision Tree\n", + "Precision: 0.7777777777777778\n", + "Recal: 0.75\n", + "F1: 0.75\n", + "CI: 0.27161661029914536\n", + "\n", + "Random Forest\n", + "Precision: 0.6666666666666666\n", + "Recal: 0.5\n", + "F1: 0.5714285714285715\n", + "CI: 0.3079842869168074\n", + "\n", + "SVC\n", + "Precision: 0.6666666666666666\n", + "Recal: 0.25\n", + "F1: 0.4\n", + "CI: 0.3079842869168074\n", + "\n", + "XGBoost\n", + "Precision: 0.7777777777777778\n", + "Recal: 1.0\n", + "F1: 0.8\n", + "CI: 0.27161661029914536\n" + ] + } + ], + "source": [ + "print(\"Decision Tree\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, dt_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, dt_pred))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, dt_pred))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, dt_pred)) * (sklearn.metrics.accuracy_score(y_test, dt_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"Random Forest\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, rf_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, rf_pred))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, rf_pred))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, rf_pred)) * (sklearn.metrics.accuracy_score(y_test, rf_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"SVC\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, svc_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, svc_pred))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, svc_pred))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, svc_pred)) * (sklearn.metrics.accuracy_score(y_test, svc_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"XGBoost\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, xgbc_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, xgbc_pred))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, xgbc_pred))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, xgbc_pred)) * (sklearn.metrics.accuracy_score(y_test, xgbc_pred))) / len(X_test)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7 Interpreatation" + ] + }, + { + "cell_type": "code", + "execution_count": 122, + "metadata": {}, + "outputs": [], + "source": [ + "class_names = ['normal', 'severe']" + ] + }, + { + "cell_type": "code", + "execution_count": 123, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[27]" + ] + }, + "execution_count": 123, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Patient No. 21 --> 27 after shuffuling\n", + "[i for i, x in enumerate(X_train['LDH']==254) if x]" + ] + }, + { + "cell_type": "code", + "execution_count": 124, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[59]" + ] + }, + "execution_count": 124, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Patient No. 36 --> 59 after shuffuling\n", + "[i for i, x in enumerate(X_train['NTproBNP']==384) if x]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Patient No. 21 (27) & 36 (59)**" + ] + }, + { + "cell_type": "code", + "execution_count": 125, + "metadata": {}, + "outputs": [], + "source": [ + "from lime import lime_tabular\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 126, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Sex', 'Age', 'AgeG1', 'Temp', 'CTScore', 'cTnITimes', 'cTnI',\n", + " 'cTnICKMBOrdinal1', 'LDH', 'NTproBNP', 'LYM1', 'N2L1', 'CRP1', 'ALB1',\n", + " 'CRP2', 'ALB2', 'Sympton', 'Fever', 'Cough', 'Phlegm', 'Hemoptysis',\n", + " 'SoreThroat', 'Catarrh', 'Headache', 'ChestPain', 'Fatigue',\n", + " 'SoreMuscle', 'Diarrhea', 'PoorAppetite', 'NauseaNVomit',\n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Lung', 'CAD', 'Cancer'],\n", + " dtype='object')" + ] + }, + "execution_count": 126, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 127, + "metadata": {}, + "outputs": [], + "source": [ + "categorical_features = [0, 2, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]\n", + "categorical_names = {}\n", + "for c in categorical_features:\n", + " categorical_names[c] = [\"False\", \"True\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Decision Tree**" + ] + }, + { + "cell_type": "code", + "execution_count": 128, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Patient id: 59\n", + "Probability(normal) = 0.0\n", + "True class: severe\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "idx = 59\n", + "class_names = ['normal', 'severe']\n", + "\n", + "print('Patient id: %d' % idx)\n", + "print('Probability(normal) =', dt.predict_proba(np.array(X_train)[idx, :].reshape(1, -1))[0][0])\n", + "print('True class: %s' % class_names[y_train[idx]])\n", + "\n", + "explainer = lime_tabular.LimeTabularExplainer(np.array(X_train), \n", + " feature_names= X_train.columns, class_names = class_names, \n", + " categorical_features = categorical_features, categorical_names = categorical_names,\n", + " discretize_continuous=True)\n", + "exp = explainer.explain_instance(np.array(X_train)[idx, :], predict_fn = dt.predict_proba, num_features = 10)\n", + "\n", + "%matplotlib inline\n", + "fig = exp.as_pyplot_figure()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Random Forest**" + ] + }, + { + "cell_type": "code", + "execution_count": 129, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Patient id: 59\n", + "Probability(normal) = 0.26\n", + "True class: severe\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "idx = 59\n", + "class_names = ['normal', 'severe']\n", + "\n", + "print('Patient id: %d' % idx)\n", + "print('Probability(normal) =', rf.predict_proba(np.array(X_train)[idx, :].reshape(1, -1))[0][0])\n", + "print('True class: %s' % class_names[y_train[idx]])\n", + "explainer = lime_tabular.LimeTabularExplainer(np.array(X_train), \n", + " feature_names= X_train.columns, class_names = class_names, \n", + " categorical_features = categorical_features, categorical_names = categorical_names,\n", + " discretize_continuous=True)\n", + "exp = explainer.explain_instance(np.array(X_train)[idx, :], predict_fn = rf.predict_proba, num_features = 10)\n", + "\n", + "%matplotlib inline\n", + "fig = exp.as_pyplot_figure()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**SVM**" + ] + }, + { + "cell_type": "code", + "execution_count": 130, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Patient id: 59\n", + "Probability(normal) = 0.8825628851481154\n", + "True class: severe\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "idx = 59\n", + "class_names = ['normal', 'severe']\n", + "\n", + "print('Patient id: %d' % idx)\n", + "print('Probability(normal) =', svc.predict_proba(np.array(X_train)[idx, :].reshape(1, -1))[0][0])\n", + "print('True class: %s' % class_names[y_train[idx]])\n", + "explainer = lime_tabular.LimeTabularExplainer(np.array(X_train), \n", + " feature_names= X_train.columns, class_names = class_names, \n", + " categorical_features = categorical_features, categorical_names = categorical_names,\n", + " discretize_continuous=True)\n", + "exp = explainer.explain_instance(np.array(X_train)[idx, :], predict_fn = svc.predict_proba, num_features = 10)\n", + "\n", + "%matplotlib inline\n", + "fig = exp.as_pyplot_figure()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Gradient Boosted Trees**" + ] + }, + { + "cell_type": "code", + "execution_count": 131, + "metadata": {}, + "outputs": [], + "source": [ + "def predict_fn_xbg(X):\n", + " X_data = pd.DataFrame(data=X, columns=xgbc.get_booster().feature_names)\n", + " return xgbc.predict_proba(X_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 132, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Patient id: 59\n", + "Probability(normal) = 0.047768414\n", + "True class: severe\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "idx = 59\n", + "print('Patient id: %d' % idx)\n", + "print('Probability(normal) =', xgbc.predict_proba(X_train[idx:idx+1])[0][0])\n", + "print('True class: %s' % class_names[y_train[idx]])\n", + "explainer = lime_tabular.LimeTabularExplainer(np.array(X_train), \n", + " feature_names= X_train.columns, class_names = ['normal', 'severe'], \n", + " categorical_features = categorical_features, categorical_names = categorical_names,\n", + " discretize_continuous=True)\n", + "exp = explainer.explain_instance(np.array(X_train)[idx, :], predict_fn = predict_fn_xbg, num_features = 10)\n", + "\n", + "%matplotlib inline\n", + "fig = exp.as_pyplot_figure()" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/2_type_without_ct_score.ipynb b/2_type_without_ct_score.ipynb new file mode 100644 index 0000000..92b659f --- /dev/null +++ b/2_type_without_ct_score.ipynb @@ -0,0 +1,2712 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Interpretable ML - COVID19\n", + "> Interpretable ML Research for COVID19\n", + "- toc:true\n", + "- branch: master\n", + "- badges: true\n", + "- comments: true\n", + "- author: Han Wu\n", + "- categories: [jupyter]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 0. Load Data" + ] + }, + { + "cell_type": "code", + "execution_count": 211, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 212, + "metadata": {}, + "outputs": [], + "source": [ + "np.set_printoptions(suppress=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 213, + "metadata": {}, + "outputs": [], + "source": [ + "covid = pd.read_csv(\"dataset/covid.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 214, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AVG age for severity 0: 36.833333333333336\n", + "AVG age for severity 1: 47.45283018867924\n", + "AVG age for severity 2: 54.3125\n", + "AVG age for severity 3: 69.4\n" + ] + } + ], + "source": [ + "print(\"AVG age for severity 0:\", np.mean(covid[covid.Severity03 == 0].Age.to_numpy()))\n", + "print(\"AVG age for severity 1:\", np.mean(covid[covid.Severity03 == 1].Age.to_numpy()))\n", + "print(\"AVG age for severity 2:\", np.mean(covid[covid.Severity03 == 2].Age.to_numpy()))\n", + "print(\"AVG age for severity 3:\", np.mean(covid[covid.Severity03 == 3].Age.to_numpy()))" + ] + }, + { + "cell_type": "code", + "execution_count": 215, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(92, 74)" + ] + }, + "execution_count": 215, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "covid.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Data Wash" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Features that has NULL value" + ] + }, + { + "cell_type": "code", + "execution_count": 216, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "remove_columns = ['MedNum', 'LVEF', 'SO2', 'PO2', 'YHZS', 'RML', 'RUL', 'RLL', 'LUL', 'LLL']" + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop(remove_columns, axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Features that records time rather than biomarkers" + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "metadata": {}, + "outputs": [], + "source": [ + "remove_columns = ['Onset2Admi', 'Onset2CT1', 'Onset2CTPositive1', 'Onset2CTPeak']" + ] + }, + { + "cell_type": "code", + "execution_count": 219, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop(remove_columns, axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Patients that have no records" + ] + }, + { + "cell_type": "code", + "execution_count": 220, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid[covid.Weight != \" \"]" + ] + }, + { + "cell_type": "code", + "execution_count": 221, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid[covid.cTnI != \" \"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "String to Float" + ] + }, + { + "cell_type": "code", + "execution_count": 222, + "metadata": {}, + "outputs": [], + "source": [ + "covid['Weight'] = covid['Weight'].astype(np.float64)\n", + "covid['Height'] = covid['Height'].astype(np.float64)\n", + "covid['cTnITimes'] = covid['cTnITimes'].astype(np.float64)\n", + "covid['cTnI'] = covid['cTnI'].astype(np.float64)\n", + "covid['NTproBNP'] = covid['NTproBNP'].astype(np.float64)\n", + "covid['Cr'] = covid['Cr'].astype(np.float64)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Train Test Split" + ] + }, + { + "cell_type": "code", + "execution_count": 223, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn import preprocessing\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 224, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "0 3\n", + "2 1\n", + "3 1\n", + "5 2\n", + "7 0\n", + " ..\n", + "87 2\n", + "88 1\n", + "89 2\n", + "90 1\n", + "91 0\n", + "Name: Severity03, Length: 86, dtype: int64" + ] + }, + "execution_count": 224, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "covid.Severity03" + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "y = covid.Severity01.to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [], + "source": [ + "# Use Both\n", + "# covid = covid.drop([\"Severity01\", \"Severity03\"], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 16, + "metadata": {}, + "outputs": [], + "source": [ + "# Use None\n", + "covid = covid.drop([\"Severity01\", \"Severity03\", \"CTScore\", \"AIVolumeP\"], axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Patient No. is irrrelevant" + ] + }, + { + "cell_type": "code", + "execution_count": 17, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop([\"No\"], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "X = covid\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.9, random_state = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 55), (9, 55))" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Sex', 'Age', 'AgeG1', 'Height', 'Weight', 'BMI', 'Temp', 'cTnITimes',\n", + " 'cTnI', 'cTnICKMBOrdinal1', 'cTnICKMBOrdinal2', 'AST', 'LDH', 'CK',\n", + " 'CKMB', 'HBDH', 'HiCKMB', 'NTproBNP', 'Cr', 'PCT1', 'WBC1', 'NEU1',\n", + " 'LYM1', 'N2L1', 'CRP1', 'ALB1', 'PCT2', 'WBC2', 'NEU2', 'LYM2', 'N2L2',\n", + " 'CRP2', 'ALB2', 'Sympton', 'Fever', 'Cough', 'Phlegm', 'Hemoptysis',\n", + " 'SoreThroat', 'Catarrh', 'Headache', 'ChestPain', 'Fatigue',\n", + " 'SoreMuscle', 'Stomachache', 'Diarrhea', 'PoorAppetite', 'NauseaNVomit',\n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Lung', 'CAD', 'Arrythmia',\n", + " 'Cancer'],\n", + " dtype='object')" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 21, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([0, 1, 0, 0, 1, 1, 0, 1, 0], dtype=int64)" + ] + }, + "execution_count": 21, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_test" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Feature Selection" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.1 Basic Methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1.1 Drop constant and Quasi-constant features" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_selection import VarianceThreshold" + ] + }, + { + "cell_type": "code", + "execution_count": 23, + "metadata": {}, + "outputs": [], + "source": [ + "def drop_features(X_train, X_test, threshhold):\n", + " sel = VarianceThreshold(threshold=threshhold)\n", + " sel.fit(X_train)\n", + " print(\"No. of constant features:\",\n", + " len([\n", + " x for x in X_train.columns\n", + " if x not in X_train.columns[sel.get_support()]\n", + " ])\n", + " )\n", + " constant_features = [x for x in X_train.columns if x not in X_train.columns[sel.get_support()]]\n", + "\n", + " print(constant_features)\n", + " X_train.drop(labels=constant_features, axis=1, inplace=True)\n", + " X_test.drop(labels=constant_features, axis=1, inplace=True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Drop constant and quasi-constant features" + ] + }, + { + "cell_type": "code", + "execution_count": 24, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No. of constant features: 2\n", + "['PCT2', 'Stomachache']\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n" + ] + } + ], + "source": [ + "drop_features(X_train, X_test, 0.01)" + ] + }, + { + "cell_type": "code", + "execution_count": 25, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 53), (9, 53))" + ] + }, + "execution_count": 25, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.1.2 Drop Duplicated Features" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Maybe some symptoms are correlated" + ] + }, + { + "cell_type": "code", + "execution_count": 26, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "No. of Duplicated Features: 1\n", + "['Arrythmia']\n" + ] + } + ], + "source": [ + "covid_t = covid.T\n", + "print(\"No. of Duplicated Features:\", covid_t.duplicated().sum())\n", + "print(covid_t[covid_t.duplicated()].index.values)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Print out duplicated features" + ] + }, + { + "cell_type": "code", + "execution_count": 27, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "CAD\n", + "Arrythmia\n" + ] + } + ], + "source": [ + "duplicated_feat = []\n", + "for i in range(0, len(X_train.columns)):\n", + " col_1 = X_train.columns[i]\n", + " for col_2 in X_train.columns[i + 1 : ]:\n", + " if X_train[col_1].equals(X_train[col_2]):\n", + " print(col_1)\n", + " print(col_2) \n", + " duplicated_feat.append(col_2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Drop duplicated features" + ] + }, + { + "cell_type": "code", + "execution_count": 28, + "metadata": {}, + "outputs": [], + "source": [ + "# covid_unique = covid_t.drop_duplicates(keep='first').T" + ] + }, + { + "cell_type": "code", + "execution_count": 29, + "metadata": {}, + "outputs": [], + "source": [ + "X_train.drop(labels=covid_t[covid_t.duplicated()].index.values, axis=1, inplace=True)\n", + "X_test.drop(labels=covid_t[covid_t.duplicated()].index.values, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 30, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 52), (9, 52))" + ] + }, + "execution_count": 30, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.2 Correlations" + ] + }, + { + "cell_type": "code", + "execution_count": 31, + "metadata": {}, + "outputs": [], + "source": [ + "categorical_features = ['Sex', 'AgeG1', \n", + " 'Fever', 'Cough', 'Phlegm', 'Hemoptysis', 'SoreThroat', 'Catarrh', 'Headache', 'ChestPain', 'Fatigue', 'SoreMuscle', # 'Stomachache', \n", + " 'Diarrhea', 'PoorAppetite', 'NauseaNVomit', \n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Lung', #'CAD', 'Arrythmia', \n", + " 'Cancer']" + ] + }, + { + "cell_type": "code", + "execution_count": 32, + "metadata": {}, + "outputs": [], + "source": [ + "numerical_features = ['Age', 'Height', 'Weight', 'BMI', 'Temp', 'cTnITimes', 'cTnI', 'cTnICKMBOrdinal1', 'cTnICKMBOrdinal2', 'AST',\n", + " 'LDH', 'CK', 'CKMB', 'HBDH', 'HiCKMB', 'NTproBNP', 'Cr', 'PCT1', 'WBC1',\n", + " 'NEU1', 'LYM1', 'N2L1', 'CRP1', 'ALB1', 'WBC2', 'NEU2', 'LYM2', 'N2L2',\n", + " 'CRP2', 'ALB2']" + ] + }, + { + "cell_type": "code", + "execution_count": 33, + "metadata": {}, + "outputs": [], + "source": [ + "# numerics = ['int16', 'int32', 'int64', 'float16', 'float32', 'float64']\n", + "# numerical_vars = list(covid.select_dtypes(include=numerics).columns)\n", + "# data = covid[numerical_vars]" + ] + }, + { + "cell_type": "code", + "execution_count": 34, + "metadata": {}, + "outputs": [], + "source": [ + "corrmat = X_train.corr()" + ] + }, + { + "cell_type": "code", + "execution_count": 35, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 35, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "fig, ax = plt.subplots()\n", + "fig.set_size_inches(11, 11)\n", + "sns.heatmap(corrmat)" + ] + }, + { + "cell_type": "code", + "execution_count": 36, + "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", + "
feature1feature2corr
0LDHHBDH0.958191
1HBDHLDH0.958191
2HeightPoorAppetite0.911704
3PoorAppetiteHeight0.911704
4WBC2NEU20.911419
5NEU2WBC20.911419
6WBC1NEU10.903520
7NEU1WBC10.903520
8AgeG1Age0.893413
9AgeAgeG10.893413
10cTnICKMBOrdinal2cTnICKMBOrdinal10.853741
11cTnICKMBOrdinal1cTnICKMBOrdinal20.853741
12LYM1LYM20.842688
13LYM2LYM10.842688
14WeightBMI0.842409
15BMIWeight0.842409
16N2L2NTproBNP0.808767
17NTproBNPN2L20.808767
\n", + "
" + ], + "text/plain": [ + " feature1 feature2 corr\n", + "0 LDH HBDH 0.958191\n", + "1 HBDH LDH 0.958191\n", + "2 Height PoorAppetite 0.911704\n", + "3 PoorAppetite Height 0.911704\n", + "4 WBC2 NEU2 0.911419\n", + "5 NEU2 WBC2 0.911419\n", + "6 WBC1 NEU1 0.903520\n", + "7 NEU1 WBC1 0.903520\n", + "8 AgeG1 Age 0.893413\n", + "9 Age AgeG1 0.893413\n", + "10 cTnICKMBOrdinal2 cTnICKMBOrdinal1 0.853741\n", + "11 cTnICKMBOrdinal1 cTnICKMBOrdinal2 0.853741\n", + "12 LYM1 LYM2 0.842688\n", + "13 LYM2 LYM1 0.842688\n", + "14 Weight BMI 0.842409\n", + "15 BMI Weight 0.842409\n", + "16 N2L2 NTproBNP 0.808767\n", + "17 NTproBNP N2L2 0.808767" + ] + }, + "execution_count": 36, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "corrmat = X_train.corr()\n", + "corrmat = corrmat.abs().unstack()\n", + "corrmat = corrmat.sort_values(ascending=False)\n", + "corrmat = corrmat[corrmat >= 0.8]\n", + "corrmat = corrmat[corrmat < 1]\n", + "corrmat = pd.DataFrame(corrmat).reset_index()\n", + "corrmat.columns = ['feature1', 'feature2', 'corr']\n", + "corrmat" + ] + }, + { + "cell_type": "code", + "execution_count": 37, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found 9 correlated groups\n", + "out of 52 total features\n" + ] + } + ], + "source": [ + "# find groups of correlated features\n", + "\n", + "grouped_feature_ls = []\n", + "correlated_groups = []\n", + "\n", + "for feature in corrmat.feature1.unique():\n", + " if feature not in grouped_feature_ls:\n", + "\n", + " # find all features correlated to a single feature\n", + " correlated_block = corrmat[corrmat.feature1 == feature]\n", + " grouped_feature_ls = grouped_feature_ls + list(\n", + " correlated_block.feature2.unique()) + [feature]\n", + "\n", + " # append the block of features to the list\n", + " correlated_groups.append(correlated_block)\n", + "\n", + "print('found {} correlated groups'.format(len(correlated_groups)))\n", + "print('out of {} total features'.format(X_train.shape[1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 38, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + " feature1 feature2 corr\n", + "0 LDH HBDH 0.958191\n", + "\n", + " feature1 feature2 corr\n", + "2 Height PoorAppetite 0.911704\n", + "\n", + " feature1 feature2 corr\n", + "4 WBC2 NEU2 0.911419\n", + "\n", + " feature1 feature2 corr\n", + "6 WBC1 NEU1 0.90352\n", + "\n", + " feature1 feature2 corr\n", + "8 AgeG1 Age 0.893413\n", + "\n", + " feature1 feature2 corr\n", + "10 cTnICKMBOrdinal2 cTnICKMBOrdinal1 0.853741\n", + "\n", + " feature1 feature2 corr\n", + "12 LYM1 LYM2 0.842688\n", + "\n", + " feature1 feature2 corr\n", + "14 Weight BMI 0.842409\n", + "\n", + " feature1 feature2 corr\n", + "16 N2L2 NTproBNP 0.808767\n", + "\n" + ] + } + ], + "source": [ + "# now we can visualise each group. We see that some groups contain\n", + "# only 2 correlated features, some other groups present several features \n", + "# that are correlated among themselves.\n", + "\n", + "for group in correlated_groups:\n", + " print(group)\n", + " print()" + ] + }, + { + "cell_type": "code", + "execution_count": 39, + "metadata": {}, + "outputs": [], + "source": [ + "def correlation(dataset, threshold):\n", + " col_corr = set()\n", + " corr_matrix = dataset.corr()\n", + " for i in range(len(corr_matrix.columns)):\n", + " for j in range(i):\n", + " if abs(corr_matrix.iloc[i, j] >= threshold):\n", + " colname = corr_matrix.columns[i]\n", + " col_corr.add(colname)\n", + " return col_corr" + ] + }, + { + "cell_type": "code", + "execution_count": 40, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['BMI', 'cTnICKMBOrdinal2', 'NEU2', 'N2L2', 'NEU1', 'AgeG1', 'LYM2', 'HBDH']\n" + ] + } + ], + "source": [ + "corr_features = list((correlation(X_train, 0.8)))\n", + "print(corr_features)" + ] + }, + { + "cell_type": "code", + "execution_count": 41, + "metadata": {}, + "outputs": [], + "source": [ + "for i in corr_features:\n", + " if i in categorical_features:\n", + " corr_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 42, + "metadata": {}, + "outputs": [], + "source": [ + "for i in corr_features:\n", + " if i in numerical_features:\n", + " numerical_features.remove(i)\n", + "\n", + "for i in corr_features:\n", + " if i in categorical_features:\n", + " categorical_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 43, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['BMI', 'cTnICKMBOrdinal2', 'NEU2', 'N2L2', 'NEU1', 'LYM2', 'HBDH']" + ] + }, + "execution_count": 43, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "corr_features" + ] + }, + { + "cell_type": "code", + "execution_count": 44, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n" + ] + } + ], + "source": [ + "X_train.drop(labels=corr_features, axis=1, inplace=True)\n", + "X_test.drop(labels=corr_features, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 45, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 45), (9, 45))" + ] + }, + "execution_count": 45, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 3.3 Statistical Methods" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3.1 Mutual Information" + ] + }, + { + "cell_type": "code", + "execution_count": 46, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_selection import mutual_info_classif, mutual_info_regression\n", + "from sklearn.feature_selection import SelectKBest, SelectPercentile" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "mi = mutual_info_classif(X_train, y_train)\n", + "mi = pd.Series(mi)\n", + "mi.index = X_train.columns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Features on the left side have more mutual information with y" + ] + }, + { + "cell_type": "code", + "execution_count": 48, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 48, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "mi.sort_values(ascending=False).plot.bar(figsize=(20, 8))" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "sel_ = SelectKBest(mutual_info_classif, k = 40).fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "mi_features = list(X_train.columns[ ~ sel_.get_support()].values)" + ] + }, + { + "cell_type": "code", + "execution_count": 51, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "for i in mi_features:\n", + " if i in categorical_features:\n", + " mi_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 52, + "metadata": {}, + "outputs": [], + "source": [ + "for i in mi_features:\n", + " if i in numerical_features:\n", + " numerical_features.remove(i)\n", + "\n", + "for i in mi_features:\n", + " if i in categorical_features:\n", + " categorical_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 53, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['Height', 'Temp', 'CK', 'HiCKMB']" + ] + }, + "execution_count": 53, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "mi_features" + ] + }, + { + "cell_type": "code", + "execution_count": 54, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n" + ] + } + ], + "source": [ + "X_train.drop(labels=mi_features, axis=1, inplace=True)\n", + "X_test.drop(labels=mi_features, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 55, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 41), (9, 41))" + ] + }, + "execution_count": 55, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3.2 Fisher Score" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_selection import chi2" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "categorical features" + ] + }, + { + "cell_type": "code", + "execution_count": 57, + "metadata": {}, + "outputs": [], + "source": [ + "f_score = chi2(X_train[categorical_features], y_train)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The smaller ones have more correlations" + ] + }, + { + "cell_type": "code", + "execution_count": 58, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Cancer 0.887949\n", + "SoreThroat 0.842057\n", + "Cough 0.703238\n", + "Headache 0.638344\n", + "Hemoptysis 0.594525\n", + "NauseaNVomit 0.356552\n", + "ChestPain 0.356552\n", + "Diarrhea 0.333947\n", + "Sex 0.302537\n", + "Fever 0.202574\n", + "Catarrh 0.159040\n", + "Hypertention 0.154388\n", + "SoreMuscle 0.105717\n", + "Hyperlipedia 0.099153\n", + "Lung 0.062605\n", + "PoorAppetite 0.060289\n", + "Phlegm 0.046410\n", + "AgeG1 0.037459\n", + "DM 0.008457\n", + "Fatigue 0.000049\n", + "dtype: float64" + ] + }, + "execution_count": 58, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p_values = pd.Series(f_score[1])\n", + "p_values.index = X_train[categorical_features].columns\n", + "p_values.sort_values(ascending=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 59, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['AgeG1', 'Phlegm', 'Fatigue', 'DM'], dtype=object)" + ] + }, + "execution_count": 59, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "p_values[p_values<0.05].index.values" + ] + }, + { + "cell_type": "code", + "execution_count": 60, + "metadata": {}, + "outputs": [], + "source": [ + "# for c in categorical_features:\n", + "# if c not in p_values[p_values<0.05].index.values:\n", + "# categorical_features.remove(c)\n", + "# print(c)\n", + "# X_train.drop(labels=c, axis=1, inplace=True)\n", + "# X_test.drop(labels=c, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 61, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 41), (9, 41))" + ] + }, + "execution_count": 61, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3.3 Univariate" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Non-categorical features" + ] + }, + { + "cell_type": "code", + "execution_count": 62, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.feature_selection import f_classif, f_regression" + ] + }, + { + "cell_type": "code", + "execution_count": 63, + "metadata": {}, + "outputs": [], + "source": [ + "univariate = f_classif(X_train[numerical_features], y_train)\n", + "univariate = pd.Series(univariate[1])\n", + "univariate.index = X_train[numerical_features].columns\n", + "univariate.sort_values(ascending=False, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 64, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 64, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "univariate.sort_values(ascending=False).plot.bar(figsize=(20, 8))" + ] + }, + { + "cell_type": "code", + "execution_count": 65, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "PCT1 0.802511\n", + "WBC1 0.430778\n", + "AST 0.376614\n", + "CKMB 0.351257\n", + "WBC2 0.207957\n", + "Weight 0.191531\n", + "Cr 0.062507\n", + "dtype: float64" + ] + }, + "execution_count": 65, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "univariate[univariate > 0.05]" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Weight\n", + "AST\n", + "CKMB\n", + "Cr\n", + "WBC1\n", + "WBC2\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n" + ] + } + ], + "source": [ + "for n in numerical_features:\n", + " if n in univariate[univariate > 0.05].index.values:\n", + " numerical_features.remove(n)\n", + " print(n)\n", + " X_train.drop(labels=n, axis=1, inplace=True)\n", + " X_test.drop(labels=n, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(77, 35)" + ] + }, + "execution_count": 67, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### 3.3.4 ROC-AUC" + ] + }, + { + "cell_type": "code", + "execution_count": 68, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.tree import DecisionTreeClassifier, DecisionTreeRegressor\n", + "from sklearn.metrics import roc_auc_score, mean_squared_error" + ] + }, + { + "cell_type": "code", + "execution_count": 69, + "metadata": {}, + "outputs": [], + "source": [ + "# loop to build a tree, make predictions and get the roc-auc\n", + "# for each feature of the train set\n", + "\n", + "roc_values = []\n", + "for feature in X_train.columns:\n", + " clf = DecisionTreeClassifier()\n", + " clf.fit(X_train[feature].fillna(0).to_frame(), y_train)\n", + " y_scored = clf.predict_proba(X_test[feature].fillna(0).to_frame())\n", + " roc_values.append(roc_auc_score(y_test, y_scored[:, 1]))" + ] + }, + { + "cell_type": "code", + "execution_count": 70, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "cTnITimes 0.775\n", + "CRP2 0.675\n", + "Fever 0.675\n", + "NTproBNP 0.650\n", + "SoreThroat 0.650\n", + "Headache 0.625\n", + "LYM1 0.625\n", + "N2L1 0.625\n", + "ALB2 0.625\n", + "PCT1 0.550\n", + "AgeG1 0.550\n", + "Fatigue 0.500\n", + "ChestPain 0.500\n", + "Age 0.500\n", + "Lung 0.500\n", + "Hemoptysis 0.500\n", + "Phlegm 0.500\n", + "CAD 0.500\n", + "PoorAppetite 0.500\n", + "Diarrhea 0.500\n", + "NauseaNVomit 0.500\n", + "CRP1 0.500\n", + "cTnICKMBOrdinal1 0.500\n", + "cTnI 0.500\n", + "SoreMuscle 0.500\n", + "LDH 0.500\n", + "Sex 0.450\n", + "ALB1 0.450\n", + "Hypertention 0.425\n", + "DM 0.400\n", + "Cancer 0.400\n", + "Hyperlipedia 0.400\n", + "Catarrh 0.375\n", + "Sympton 0.375\n", + "Cough 0.325\n", + "dtype: float64" + ] + }, + "execution_count": 70, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# let's add the variable names and order it for clearer visualisation\n", + "roc_values = pd.Series(roc_values)\n", + "roc_values.index = X_train.columns\n", + "roc_values.sort_values(ascending=False)" + ] + }, + { + "cell_type": "code", + "execution_count": 71, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "" + ] + }, + "execution_count": 71, + "metadata": {}, + "output_type": "execute_result" + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "# and now let's plot\n", + "roc_values.sort_values(ascending=False).plot.bar(figsize=(20, 8))" + ] + }, + { + "cell_type": "code", + "execution_count": 72, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "11" + ] + }, + "execution_count": 72, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# a roc auc value of 0.5 indicates random decision\n", + "# let's check how many features show a roc-auc value\n", + "# higher than random\n", + "\n", + "len(roc_values[roc_values > 0.5])" + ] + }, + { + "cell_type": "code", + "execution_count": 73, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Sex 0.450\n", + "LDH 0.500\n", + "ALB1 0.450\n", + "Sympton 0.375\n", + "Cough 0.325\n", + "Catarrh 0.375\n", + "Hypertention 0.425\n", + "Hyperlipedia 0.400\n", + "DM 0.400\n", + "Cancer 0.400\n", + "dtype: float64" + ] + }, + "execution_count": 73, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "roc_values[roc_values < 0.5]" + ] + }, + { + "cell_type": "code", + "execution_count": 74, + "metadata": {}, + "outputs": [], + "source": [ + "roc_features = roc_values[roc_values < 0.5].index.values" + ] + }, + { + "cell_type": "code", + "execution_count": 75, + "metadata": {}, + "outputs": [], + "source": [ + "for i in roc_features:\n", + " if i in numerical_features:\n", + " numerical_features.remove(i)\n", + "\n", + "for i in roc_features:\n", + " if i in categorical_features:\n", + " categorical_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 76, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "array(['Sex', 'LDH', 'ALB1', 'Sympton', 'Cough', 'Catarrh',\n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Cancer'], dtype=object)" + ] + }, + "execution_count": 76, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "roc_features" + ] + }, + { + "cell_type": "code", + "execution_count": 225, + "metadata": {}, + "outputs": [], + "source": [ + "for i in corr_features:\n", + " if i in categorical_features:\n", + " corr_features.remove(i)" + ] + }, + { + "cell_type": "code", + "execution_count": 77, + "metadata": {}, + "outputs": [], + "source": [ + "# X_train.drop(labels=roc_features, axis=1, inplace=True)\n", + "# X_test.drop(labels=roc_features, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 78, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 35), (9, 35))" + ] + }, + "execution_count": 78, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 79, + "metadata": {}, + "outputs": [], + "source": [ + "import sklearn\n", + "import sklearn.ensemble\n", + "import sklearn.metrics\n", + "import xgboost as xgb" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Cross Validation**" + ] + }, + { + "cell_type": "code", + "execution_count": 80, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import cross_val_score" + ] + }, + { + "cell_type": "code", + "execution_count": 81, + "metadata": {}, + "outputs": [], + "source": [ + "def cv_score(classifier, X, y, scoring):\n", + " return cross_val_score(classifier, X, y, cv=5, scoring=scoring)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Decision Tree**" + ] + }, + { + "cell_type": "code", + "execution_count": 82, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DecisionTreeClassifier()" + ] + }, + "execution_count": 82, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dt = sklearn.tree.DecisionTreeClassifier()\n", + "\n", + "dt_f1 = cv_score(dt, X_train, y_train, 'f1')\n", + "\n", + "dt.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 83, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.5476190476190477\n" + ] + } + ], + "source": [ + "print(np.mean(dt_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Random Forest**" + ] + }, + { + "cell_type": "code", + "execution_count": 84, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.ensemble import RandomForestClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 85, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RandomForestClassifier()" + ] + }, + "execution_count": 85, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rf = sklearn.ensemble.RandomForestClassifier(n_estimators=100)\n", + "\n", + "rf_f1 = cv_score(rf, X_train, y_train, 'f1')\n", + "\n", + "rf.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 86, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6457142857142858\n" + ] + } + ], + "source": [ + "print(np.mean(rf_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**SVM**" + ] + }, + { + "cell_type": "code", + "execution_count": 198, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.svm import SVC" + ] + }, + { + "cell_type": "code", + "execution_count": 199, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "SVC(probability=True)" + ] + }, + "execution_count": 199, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "svc = SVC(probability=True)\n", + "\n", + "svc_f1 = cv_score(svc, X_train, y_train, 'f1')\n", + "\n", + "svc.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 200, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6733333333333333\n" + ] + } + ], + "source": [ + "print(np.mean(svc_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**XGBoost**" + ] + }, + { + "cell_type": "code", + "execution_count": 87, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[20:15:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n", + "[20:15:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[20:15:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n", + "[20:15:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n", + "[20:15:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[20:15:04] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'binary:logistic' was changed from 'error' to 'logloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "data": { + "text/plain": [ + "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n", + " colsample_bynode=1, colsample_bytree=0.7, gamma=0, gpu_id=-1,\n", + " importance_type='gain', interaction_constraints='',\n", + " learning_rate=0.300000012, max_delta_step=0, max_depth=4,\n", + " min_child_weight=0, missing=nan, monotone_constraints='()',\n", + " n_estimators=100, n_jobs=8, num_parallel_tree=1, random_state=0,\n", + " reg_alpha=4, reg_lambda=1, scale_pos_weight=9, subsample=0.8,\n", + " tree_method='exact', validate_parameters=1, verbosity=None)" + ] + }, + "execution_count": 87, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create a model\n", + "# Params from: https://www.kaggle.com/aharless/swetha-s-xgboost-revised\n", + "xgbc = xgb.XGBClassifier(\n", + " max_depth = 4,\n", + " subsample = 0.8,\n", + " colsample_bytree = 0.7,\n", + " colsample_bylevel = 0.7,\n", + " scale_pos_weight = 9,\n", + " min_child_weight = 0,\n", + " reg_alpha = 4,\n", + " objective = 'binary:logistic'\n", + ")\n", + "\n", + "xgbc_f1 = cv_score(xgbc, X_train, y_train, 'f1')\n", + "\n", + "# Fit the models\n", + "xgbc.fit(np.array(X_train), np.array(y_train))" + ] + }, + { + "cell_type": "code", + "execution_count": 88, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.698095238095238\n" + ] + } + ], + "source": [ + "print(np.mean(xgbc_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Save Models" + ] + }, + { + "cell_type": "code", + "execution_count": 201, + "metadata": {}, + "outputs": [], + "source": [ + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 226, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"2-type-model-4.pkl\", 'wb') as f:\n", + " pickle.dump([dt, rf, svc, xgbc], f)\n", + "with open(\"dataset/2-type-dataset.pkl\", 'wb') as f:\n", + " pickle.dump([X_train, X_test, y_train, y_test], f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load Models" + ] + }, + { + "cell_type": "code", + "execution_count": 203, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"2-type-model-4.pkl\", 'rb') as f:\n", + " [dt, rf, svc, xgbc] = pickle.load(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 204, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"dataset/2-type-dataset.pkl\", 'rb') as f:\n", + " [X_train, X_test, y_train, y_test] = pickle.load(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Prediction**" + ] + }, + { + "cell_type": "code", + "execution_count": 205, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import sklearn" + ] + }, + { + "cell_type": "code", + "execution_count": 206, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "dt_pred = dt.predict(X_test)\n", + "rf_pred = rf.predict(X_test)\n", + "svc_pred = svc.predict(X_test)\n", + "xgbc_pred = xgbc.predict(np.array(X_test))" + ] + }, + { + "cell_type": "code", + "execution_count": 207, + "metadata": {}, + "outputs": [], + "source": [ + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": 208, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Decision Tree\n", + "Precision: 0.8888888888888888\n", + "Recal: 0.75\n", + "F1: 0.8571428571428571\n", + "CI: 0.20532285794453828\n", + "\n", + "Random Forest\n", + "Precision: 0.7777777777777778\n", + "Recal: 0.75\n", + "F1: 0.75\n", + "CI: 0.27161661029914536\n", + "\n", + "SVC\n", + "Precision: 0.6666666666666666\n", + "Recal: 0.25\n", + "F1: 0.4\n", + "CI: 0.3079842869168074\n", + "\n", + "XGBoost\n", + "Precision: 0.7777777777777778\n", + "Recal: 1.0\n", + "F1: 0.8\n", + "CI: 0.27161661029914536\n" + ] + } + ], + "source": [ + "print(\"Decision Tree\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, dt_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, dt_pred))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, dt_pred))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, dt_pred)) * (sklearn.metrics.accuracy_score(y_test, dt_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"Random Forest\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, rf_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, rf_pred))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, rf_pred))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, rf_pred)) * (sklearn.metrics.accuracy_score(y_test, rf_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"SVC\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, svc_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, svc_pred))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, svc_pred))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, svc_pred)) * (sklearn.metrics.accuracy_score(y_test, svc_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"XGBoost\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, xgbc_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, xgbc_pred))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, xgbc_pred))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, xgbc_pred)) * (sklearn.metrics.accuracy_score(y_test, xgbc_pred))) / len(X_test)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 7 Interpreatation" + ] + }, + { + "cell_type": "code", + "execution_count": 144, + "metadata": {}, + "outputs": [], + "source": [ + "class_names = ['normal', 'severe']" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "[27]" + ] + }, + "execution_count": 184, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Patient No. 21 --> 27 after shuffuling\n", + "[i for i, x in enumerate(X_train['LDH']==254) if x]" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "[59]" + ] + }, + "execution_count": 187, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Patient No. 36 --> 59 after shuffuling\n", + "[i for i, x in enumerate(X_train['NTproBNP']==384) if x]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Patient No. 21 (27) & 36 (59)**" + ] + }, + { + "cell_type": "code", + "execution_count": 135, + "metadata": {}, + "outputs": [], + "source": [ + "from lime import lime_tabular\n", + "import pandas as pd" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Sex', 'Age', 'AgeG1', 'cTnITimes', 'cTnI', 'cTnICKMBOrdinal1', 'LDH',\n", + " 'NTproBNP', 'PCT1', 'LYM1', 'N2L1', 'CRP1', 'ALB1', 'CRP2', 'ALB2',\n", + " 'Sympton', 'Fever', 'Cough', 'Phlegm', 'Hemoptysis', 'SoreThroat',\n", + " 'Catarrh', 'Headache', 'ChestPain', 'Fatigue', 'SoreMuscle', 'Diarrhea',\n", + " 'PoorAppetite', 'NauseaNVomit', 'Hypertention', 'Hyperlipedia', 'DM',\n", + " 'Lung', 'CAD', 'Cancer'],\n", + " dtype='object')" + ] + }, + "execution_count": 188, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "metadata": {}, + "outputs": [], + "source": [ + "categorical_features = [0, 2, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]\n", + "categorical_names = {}\n", + "for c in categorical_features:\n", + " categorical_names[c] = [\"False\", \"True\"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Decision Tree**" + ] + }, + { + "cell_type": "code", + "execution_count": 191, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Patient id: 59\n", + "Probability(normal) = 0.0\n", + "True class: severe\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "idx = 59\n", + "class_names = ['normal', 'severe']\n", + "\n", + "print('Patient id: %d' % idx)\n", + "print('Probability(normal) =', dt.predict_proba(np.array(X_train)[idx, :].reshape(1, -1))[0][0])\n", + "print('True class: %s' % class_names[y_train[idx]])\n", + "\n", + "explainer = lime_tabular.LimeTabularExplainer(np.array(X_train), \n", + " feature_names= X_train.columns, class_names = class_names, \n", + " categorical_features = categorical_features, categorical_names = categorical_names,\n", + " discretize_continuous=True)\n", + "exp = explainer.explain_instance(np.array(X_train)[idx, :], predict_fn = dt.predict_proba, num_features = 10)\n", + "\n", + "%matplotlib inline\n", + "fig = exp.as_pyplot_figure()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Random Forest**" + ] + }, + { + "cell_type": "code", + "execution_count": 194, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Patient id: 59\n", + "Probability(normal) = 0.23\n", + "True class: severe\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "idx = 59\n", + "class_names = ['normal', 'severe']\n", + "\n", + "print('Patient id: %d' % idx)\n", + "print('Probability(normal) =', rf.predict_proba(np.array(X_train)[idx, :].reshape(1, -1))[0][0])\n", + "print('True class: %s' % class_names[y_train[idx]])\n", + "explainer = lime_tabular.LimeTabularExplainer(np.array(X_train), \n", + " feature_names= X_train.columns, class_names = class_names, \n", + " categorical_features = categorical_features, categorical_names = categorical_names,\n", + " discretize_continuous=True)\n", + "exp = explainer.explain_instance(np.array(X_train)[idx, :], predict_fn = rf.predict_proba, num_features = 10)\n", + "\n", + "%matplotlib inline\n", + "fig = exp.as_pyplot_figure()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**SVM**" + ] + }, + { + "cell_type": "code", + "execution_count": 209, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Patient id: 59\n", + "Probability(normal) = 0.8801943355780342\n", + "True class: severe\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "idx = 59\n", + "class_names = ['normal', 'severe']\n", + "\n", + "print('Patient id: %d' % idx)\n", + "print('Probability(normal) =', svc.predict_proba(np.array(X_train)[idx, :].reshape(1, -1))[0][0])\n", + "print('True class: %s' % class_names[y_train[idx]])\n", + "explainer = lime_tabular.LimeTabularExplainer(np.array(X_train), \n", + " feature_names= X_train.columns, class_names = class_names, \n", + " categorical_features = categorical_features, categorical_names = categorical_names,\n", + " discretize_continuous=True)\n", + "exp = explainer.explain_instance(np.array(X_train)[idx, :], predict_fn = svc.predict_proba, num_features = 10)\n", + "\n", + "%matplotlib inline\n", + "fig = exp.as_pyplot_figure()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Gradient Boosted Trees**" + ] + }, + { + "cell_type": "code", + "execution_count": 195, + "metadata": {}, + "outputs": [], + "source": [ + "def predict_fn_xbg(X):\n", + " X_data = pd.DataFrame(data=X, columns=xgbc.get_booster().feature_names)\n", + " return xgbc.predict_proba(X_data)" + ] + }, + { + "cell_type": "code", + "execution_count": 196, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Patient id: 59\n", + "Probability(normal) = 0.05998808\n", + "True class: severe\n" + ] + }, + { + "data": { + "image/png": "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\n", + "text/plain": [ + "
" + ] + }, + "metadata": { + "needs_background": "light" + }, + "output_type": "display_data" + } + ], + "source": [ + "idx = 59\n", + "print('Patient id: %d' % idx)\n", + "print('Probability(normal) =', xgbc.predict_proba(X_train[idx:idx+1])[0][0])\n", + "print('True class: %s' % class_names[y_train[idx]])\n", + "explainer = lime_tabular.LimeTabularExplainer(np.array(X_train), \n", + " feature_names= X_train.columns, class_names = ['normal', 'severe'], \n", + " categorical_features = categorical_features, categorical_names = categorical_names,\n", + " discretize_continuous=True)\n", + "exp = explainer.explain_instance(np.array(X_train)[idx, :], predict_fn = predict_fn_xbg, num_features = 10)\n", + "\n", + "%matplotlib inline\n", + "fig = exp.as_pyplot_figure()" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/4_type_with_ct_score.ipynb b/4_type_with_ct_score.ipynb new file mode 100644 index 0000000..7b8269a --- /dev/null +++ b/4_type_with_ct_score.ipynb @@ -0,0 +1,1183 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Interpretable ML - COVID19\n", + "> Interpretable ML Research for COVID19\n", + "- toc:true\n", + "- branch: master\n", + "- badges: true\n", + "- comments: true\n", + "- author: Han Wu\n", + "- categories: [jupyter]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 0. Load Data" + ] + }, + { + "cell_type": "code", + "execution_count": 493, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 494, + "metadata": {}, + "outputs": [], + "source": [ + "np.set_printoptions(suppress=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 495, + "metadata": {}, + "outputs": [], + "source": [ + "covid = pd.read_csv(\"dataset/covid.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 496, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AVG age for severity 0: 36.833333333333336\n", + "AVG age for severity 1: 47.45283018867924\n", + "AVG age for severity 2: 54.3125\n", + "AVG age for severity 3: 69.4\n" + ] + } + ], + "source": [ + "print(\"AVG age for severity 0:\", np.mean(covid[covid.Severity03 == 0].Age.to_numpy()))\n", + "print(\"AVG age for severity 1:\", np.mean(covid[covid.Severity03 == 1].Age.to_numpy()))\n", + "print(\"AVG age for severity 2:\", np.mean(covid[covid.Severity03 == 2].Age.to_numpy()))\n", + "print(\"AVG age for severity 3:\", np.mean(covid[covid.Severity03 == 3].Age.to_numpy()))" + ] + }, + { + "cell_type": "code", + "execution_count": 497, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(92, 74)" + ] + }, + "execution_count": 497, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "covid.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Data Wash" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Features that has NULL value" + ] + }, + { + "cell_type": "code", + "execution_count": 498, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "remove_columns = ['MedNum', 'LVEF', 'SO2', 'PO2', 'YHZS', 'RML', 'RUL', 'RLL', 'LUL', 'LLL']" + ] + }, + { + "cell_type": "code", + "execution_count": 499, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop(remove_columns, axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Features that records time rather than biomarkers" + ] + }, + { + "cell_type": "code", + "execution_count": 500, + "metadata": {}, + "outputs": [], + "source": [ + "remove_columns = ['Onset2Admi', 'Onset2CT1', 'Onset2CTPositive1', 'Onset2CTPeak']" + ] + }, + { + "cell_type": "code", + "execution_count": 501, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop(remove_columns, axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Patients that have no records" + ] + }, + { + "cell_type": "code", + "execution_count": 502, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid[covid.Weight != \" \"]" + ] + }, + { + "cell_type": "code", + "execution_count": 503, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid[covid.cTnI != \" \"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "String to Float" + ] + }, + { + "cell_type": "code", + "execution_count": 504, + "metadata": {}, + "outputs": [], + "source": [ + "covid['Weight'] = covid['Weight'].astype(np.float64)\n", + "covid['Height'] = covid['Height'].astype(np.float64)\n", + "covid['cTnITimes'] = covid['cTnITimes'].astype(np.float64)\n", + "covid['cTnI'] = covid['cTnI'].astype(np.float64)\n", + "covid['NTproBNP'] = covid['NTproBNP'].astype(np.float64)\n", + "covid['Cr'] = covid['Cr'].astype(np.float64)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Train Test Split" + ] + }, + { + "cell_type": "code", + "execution_count": 505, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn import preprocessing\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 506, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import OneHotEncoder" + ] + }, + { + "cell_type": "code", + "execution_count": 507, + "metadata": {}, + "outputs": [], + "source": [ + "ohe = OneHotEncoder(drop='if_binary').fit(covid.Severity03.to_numpy().reshape(-1, 1))" + ] + }, + { + "cell_type": "code", + "execution_count": 508, + "metadata": {}, + "outputs": [], + "source": [ + "y = covid.Severity03.to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": 509, + "metadata": {}, + "outputs": [], + "source": [ + "y = ohe.transform(y.reshape(-1, 1)).toarray()" + ] + }, + { + "cell_type": "code", + "execution_count": 510, + "metadata": {}, + "outputs": [], + "source": [ + "# Use Both\n", + "covid = covid.drop([\"Severity01\", \"Severity03\"], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 511, + "metadata": {}, + "outputs": [], + "source": [ + "# Use None\n", + "# covid = covid.drop([\"Severity01\", \"Severity03\", \"CTScore\", \"AIVolumeP\"], axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Patient No. is irrrelevant" + ] + }, + { + "cell_type": "code", + "execution_count": 512, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop([\"No\"], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 513, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "X = covid\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.9, random_state = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 514, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 57), (9, 57))" + ] + }, + "execution_count": 514, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 515, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Sex', 'Age', 'AgeG1', 'Height', 'Weight', 'BMI', 'Temp', 'CTScore',\n", + " 'AIVolumeP', 'cTnITimes', 'cTnI', 'cTnICKMBOrdinal1',\n", + " 'cTnICKMBOrdinal2', 'AST', 'LDH', 'CK', 'CKMB', 'HBDH', 'HiCKMB',\n", + " 'NTproBNP', 'Cr', 'PCT1', 'WBC1', 'NEU1', 'LYM1', 'N2L1', 'CRP1',\n", + " 'ALB1', 'PCT2', 'WBC2', 'NEU2', 'LYM2', 'N2L2', 'CRP2', 'ALB2',\n", + " 'Sympton', 'Fever', 'Cough', 'Phlegm', 'Hemoptysis', 'SoreThroat',\n", + " 'Catarrh', 'Headache', 'ChestPain', 'Fatigue', 'SoreMuscle',\n", + " 'Stomachache', 'Diarrhea', 'PoorAppetite', 'NauseaNVomit',\n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Lung', 'CAD', 'Arrythmia',\n", + " 'Cancer'],\n", + " dtype='object')" + ] + }, + "execution_count": 515, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 384, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0., 1., 0., 0.],\n", + " [0., 0., 1., 0.],\n", + " [0., 1., 0., 0.],\n", + " [0., 1., 0., 0.],\n", + " [0., 0., 1., 0.],\n", + " [0., 0., 1., 0.],\n", + " [0., 1., 0., 0.],\n", + " [0., 0., 1., 0.],\n", + " [1., 0., 0., 0.]])" + ] + }, + "execution_count": 384, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_test" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Feature Selection (Same as 2-type)" + ] + }, + { + "cell_type": "code", + "execution_count": 385, + "metadata": {}, + "outputs": [], + "source": [ + "cor_features = ['PCT2', 'Stomachache', 'Arrythmia', \n", + " 'LYM2',\n", + " 'NEU1',\n", + " 'NEU2',\n", + " 'BMI',\n", + " 'N2L2',\n", + "# 'AIVolumeP',\n", + " 'cTnICKMBOrdinal2',\n", + " 'HBDH',\n", + " 'Height', 'CK', 'HiCKMB', 'Cr', 'PCT1',\n", + " 'Weight', 'AST', 'CKMB', 'WBC1', 'WBC2']" + ] + }, + { + "cell_type": "code", + "execution_count": 386, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\pandas\\core\\frame.py:4305: SettingWithCopyWarning: \n", + "A value is trying to be set on a copy of a slice from a DataFrame\n", + "\n", + "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", + " return super().drop(\n" + ] + } + ], + "source": [ + "# X_train.drop(labels=cor_features, axis=1, inplace=True)\n", + "# X_test.drop(labels=cor_features, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 387, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 37), (9, 37))" + ] + }, + "execution_count": 387, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 388, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Sex', 'Age', 'AgeG1', 'Temp', 'CTScore', 'AIVolumeP', 'cTnITimes',\n", + " 'cTnI', 'cTnICKMBOrdinal1', 'LDH', 'NTproBNP', 'LYM1', 'N2L1', 'CRP1',\n", + " 'ALB1', 'CRP2', 'ALB2', 'Sympton', 'Fever', 'Cough', 'Phlegm',\n", + " 'Hemoptysis', 'SoreThroat', 'Catarrh', 'Headache', 'ChestPain',\n", + " 'Fatigue', 'SoreMuscle', 'Diarrhea', 'PoorAppetite', 'NauseaNVomit',\n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Lung', 'CAD', 'Cancer'],\n", + " dtype='object')" + ] + }, + "execution_count": 388, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.columns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 516, + "metadata": {}, + "outputs": [], + "source": [ + "import sklearn\n", + "import sklearn.ensemble\n", + "import sklearn.metrics\n", + "import xgboost as xgb" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Cross Validation**" + ] + }, + { + "cell_type": "code", + "execution_count": 517, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import cross_val_score" + ] + }, + { + "cell_type": "code", + "execution_count": 518, + "metadata": {}, + "outputs": [], + "source": [ + "def cv_score(classifier, X, y, scoring):\n", + " return cross_val_score(classifier, X, y, cv=5, scoring=scoring)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Decision Tree**" + ] + }, + { + "cell_type": "code", + "execution_count": 519, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "DecisionTreeClassifier()" + ] + }, + "execution_count": 519, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dt = sklearn.tree.DecisionTreeClassifier()\n", + "\n", + "dt_f1 = cv_score(dt, X_train, y_train, 'f1_micro')\n", + "\n", + "dt.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 520, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.7116666666666667\n" + ] + } + ], + "source": [ + "print(np.mean(dt_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Random Forest**" + ] + }, + { + "cell_type": "code", + "execution_count": 573, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.ensemble import RandomForestClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 574, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RandomForestClassifier()" + ] + }, + "execution_count": 574, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rf = sklearn.ensemble.RandomForestClassifier(n_estimators=100)\n", + "\n", + "rf_f1 = cv_score(rf, X_train, y_train, 'f1_micro')\n", + "\n", + "rf.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 575, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.7682480737653151\n" + ] + } + ], + "source": [ + "print(np.mean(rf_f1))" + ] + }, + { + "cell_type": "code", + "execution_count": 576, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Random Forest\n", + "Precision: 0.5555555555555556\n", + "Recal: 0.5555555555555556\n", + "F1: 0.6666666666666667\n", + "CI: 0.32464394339996944\n" + ] + } + ], + "source": [ + "rf_pred = rf.predict(X_test)\n", + "print(\"Random Forest\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, rf_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, rf_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, rf_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, rf_pred)) * (sklearn.metrics.accuracy_score(y_test, rf_pred))) / len(X_test)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**SVM**" + ] + }, + { + "cell_type": "code", + "execution_count": 525, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.svm import SVC" + ] + }, + { + "cell_type": "code", + "execution_count": 526, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "data": { + "text/plain": [ + "SVC(decision_function_shape='ovo', probability=True)" + ] + }, + "execution_count": 526, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "svc = SVC(probability=True, decision_function_shape='ovo')\n", + "\n", + "svc_f1 = cv_score(svc, X_train, ohe.inverse_transform(y_train), 'f1_micro')\n", + "\n", + "svc.fit(X_train, ohe.inverse_transform(y_train))" + ] + }, + { + "cell_type": "code", + "execution_count": 527, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6375\n" + ] + } + ], + "source": [ + "print(np.mean(svc_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**XGBoost**" + ] + }, + { + "cell_type": "code", + "execution_count": 538, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:29:23] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:29:23] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:29:23] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:29:23] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:29:23] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:29:23] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:29:24] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:29:24] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:29:24] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:29:24] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:29:24] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:29:24] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "data": { + "text/plain": [ + "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n", + " colsample_bynode=1, colsample_bytree=0.7, gamma=0, gpu_id=-1,\n", + " importance_type='gain', interaction_constraints='',\n", + " learning_rate=0.300000012, max_delta_step=0, max_depth=4,\n", + " min_child_weight=1, missing=nan, monotone_constraints='()',\n", + " n_estimators=100, n_jobs=8, num_parallel_tree=1,\n", + " objective='multi:softprob', random_state=0, reg_alpha=4,\n", + " reg_lambda=1, scale_pos_weight=9, subsample=0.8,\n", + " tree_method='exact', validate_parameters=1, verbosity=None)" + ] + }, + "execution_count": 538, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create a model\n", + "# Params from: https://www.kaggle.com/aharless/swetha-s-xgboost-revised\n", + "xgbc = xgb.XGBClassifier(\n", + "# booster = 'gbtree',\n", + " max_depth = 4,\n", + "# eta = 0.3,\n", + " subsample = 0.8,\n", + " colsample_bytree = 0.7,\n", + " colsample_bylevel = 0.7,\n", + " scale_pos_weight = 9,\n", + " min_child_weight = 1,\n", + " reg_alpha = 4,\n", + " objective = 'multi:softmax'\n", + ")\n", + "\n", + "xgbc_f1 = cv_score(xgbc, X_train, ohe.inverse_transform(y_train), 'f1_micro')\n", + "\n", + "# Fit the models\n", + "xgbc.fit(np.array(X_train), np.array(ohe.inverse_transform(y_train)))" + ] + }, + { + "cell_type": "code", + "execution_count": 539, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.8441666666666666\n" + ] + } + ], + "source": [ + "print(np.mean(xgbc_f1))" + ] + }, + { + "cell_type": "code", + "execution_count": 540, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "XGBoost\n", + "Precision: 0.7777777777777778\n", + "Recal: 0.7777777777777778\n", + "F1: 0.7777777777777778\n", + "CI: 0.27161661029914536\n" + ] + } + ], + "source": [ + "xgbc_pred = ohe.transform(xgbc.predict(np.array(X_test)).reshape(-1, 1)).toarray()\n", + "print(\"XGBoost\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, xgbc_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, xgbc_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, xgbc_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, xgbc_pred)) * (sklearn.metrics.accuracy_score(y_test, xgbc_pred))) / len(X_test)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Save Models" + ] + }, + { + "cell_type": "code", + "execution_count": 485, + "metadata": {}, + "outputs": [], + "source": [ + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 577, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"4-type-model-4-ct.pkl\", 'wb') as f:\n", + " pickle.dump([dt, rf, svc, xgbc], f)\n", + "with open(\"dataset/4-type-dataset-ct.pkl\", 'wb') as f:\n", + " pickle.dump([X_train, X_test, y_train, y_test], f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load Models" + ] + }, + { + "cell_type": "code", + "execution_count": 487, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"4-type-model-4-ct.pkl\", 'rb') as f:\n", + " [dt, rf, svc, xgbc] = pickle.load(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 488, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"dataset/4-type-dataset-ct.pkl\", 'rb') as f:\n", + " [X_train, X_test, y_train, y_test] = pickle.load(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Prediction**" + ] + }, + { + "cell_type": "code", + "execution_count": 531, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import sklearn" + ] + }, + { + "cell_type": "code", + "execution_count": 532, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "dt_pred = dt.predict(X_test)\n", + "rf_pred = rf.predict(X_test)\n", + "svc_pred = ohe.transform(svc.predict(X_test).reshape(-1, 1)).toarray()\n", + "xgbc_pred = ohe.transform(xgbc.predict(np.array(X_test)).reshape(-1, 1)).toarray()" + ] + }, + { + "cell_type": "code", + "execution_count": 533, + "metadata": {}, + "outputs": [], + "source": [ + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": 534, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Decision Tree\n", + "Precision: 0.5555555555555556\n", + "Recal: 0.5555555555555556\n", + "F1: 0.5555555555555556\n", + "CI: 0.32464394339996944\n", + "\n", + "Random Forest\n", + "Precision: 0.5555555555555556\n", + "Recal: 0.5555555555555556\n", + "F1: 0.6666666666666667\n", + "CI: 0.32464394339996944\n", + "\n", + "SVC\n", + "Precision: 0.5555555555555556\n", + "Recal: 0.5555555555555556\n", + "F1: 0.5555555555555556\n", + "CI: 0.32464394339996944\n", + "\n", + "XGBoost\n", + "Precision: 0.7777777777777778\n", + "Recal: 0.7777777777777778\n", + "F1: 0.7777777777777778\n", + "CI: 0.27161661029914536\n" + ] + } + ], + "source": [ + "print(\"Decision Tree\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, dt_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, dt_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, dt_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, dt_pred)) * (sklearn.metrics.accuracy_score(y_test, dt_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"Random Forest\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, rf_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, rf_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, rf_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, rf_pred)) * (sklearn.metrics.accuracy_score(y_test, rf_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"SVC\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, svc_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, svc_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, svc_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, svc_pred)) * (sklearn.metrics.accuracy_score(y_test, svc_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"XGBoost\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, xgbc_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, xgbc_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, xgbc_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, xgbc_pred)) * (sklearn.metrics.accuracy_score(y_test, xgbc_pred))) / len(X_test)))" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/4_type_without_ct_score.ipynb b/4_type_without_ct_score.ipynb new file mode 100644 index 0000000..78cabf0 --- /dev/null +++ b/4_type_without_ct_score.ipynb @@ -0,0 +1,1200 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Interpretable ML - COVID19\n", + "> Interpretable ML Research for COVID19\n", + "- toc:true\n", + "- branch: master\n", + "- badges: true\n", + "- comments: true\n", + "- author: Han Wu\n", + "- categories: [jupyter]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 0. Load Data" + ] + }, + { + "cell_type": "code", + "execution_count": 147, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "import pandas as pd\n", + "import numpy as np\n", + "import matplotlib.pyplot as plt\n", + "import seaborn as sns" + ] + }, + { + "cell_type": "code", + "execution_count": 148, + "metadata": {}, + "outputs": [], + "source": [ + "np.set_printoptions(suppress=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 149, + "metadata": {}, + "outputs": [], + "source": [ + "covid = pd.read_csv(\"dataset/covid.csv\")" + ] + }, + { + "cell_type": "code", + "execution_count": 150, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "AVG age for severity 0: 36.833333333333336\n", + "AVG age for severity 1: 47.45283018867924\n", + "AVG age for severity 2: 54.3125\n", + "AVG age for severity 3: 69.4\n" + ] + } + ], + "source": [ + "print(\"AVG age for severity 0:\", np.mean(covid[covid.Severity03 == 0].Age.to_numpy()))\n", + "print(\"AVG age for severity 1:\", np.mean(covid[covid.Severity03 == 1].Age.to_numpy()))\n", + "print(\"AVG age for severity 2:\", np.mean(covid[covid.Severity03 == 2].Age.to_numpy()))\n", + "print(\"AVG age for severity 3:\", np.mean(covid[covid.Severity03 == 3].Age.to_numpy()))" + ] + }, + { + "cell_type": "code", + "execution_count": 151, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "(92, 74)" + ] + }, + "execution_count": 151, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "covid.shape" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 1. Data Wash" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Features that has NULL value" + ] + }, + { + "cell_type": "code", + "execution_count": 152, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "remove_columns = ['MedNum', 'LVEF', 'SO2', 'PO2', 'YHZS', 'RML', 'RUL', 'RLL', 'LUL', 'LLL']" + ] + }, + { + "cell_type": "code", + "execution_count": 153, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop(remove_columns, axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Features that records time rather than biomarkers" + ] + }, + { + "cell_type": "code", + "execution_count": 154, + "metadata": {}, + "outputs": [], + "source": [ + "remove_columns = ['Onset2Admi', 'Onset2CT1', 'Onset2CTPositive1', 'Onset2CTPeak']" + ] + }, + { + "cell_type": "code", + "execution_count": 155, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop(remove_columns, axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Remove Patients that have no records" + ] + }, + { + "cell_type": "code", + "execution_count": 156, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid[covid.Weight != \" \"]" + ] + }, + { + "cell_type": "code", + "execution_count": 157, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid[covid.cTnI != \" \"]" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "String to Float" + ] + }, + { + "cell_type": "code", + "execution_count": 158, + "metadata": {}, + "outputs": [], + "source": [ + "covid['Weight'] = covid['Weight'].astype(np.float64)\n", + "covid['Height'] = covid['Height'].astype(np.float64)\n", + "covid['cTnITimes'] = covid['cTnITimes'].astype(np.float64)\n", + "covid['cTnI'] = covid['cTnI'].astype(np.float64)\n", + "covid['NTproBNP'] = covid['NTproBNP'].astype(np.float64)\n", + "covid['Cr'] = covid['Cr'].astype(np.float64)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 2. Train Test Split" + ] + }, + { + "cell_type": "code", + "execution_count": 159, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn import preprocessing\n", + "from sklearn.model_selection import train_test_split" + ] + }, + { + "cell_type": "code", + "execution_count": 160, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.preprocessing import OneHotEncoder" + ] + }, + { + "cell_type": "code", + "execution_count": 161, + "metadata": {}, + "outputs": [], + "source": [ + "ohe = OneHotEncoder(drop='if_binary').fit(covid.Severity03.to_numpy().reshape(-1, 1))" + ] + }, + { + "cell_type": "code", + "execution_count": 162, + "metadata": {}, + "outputs": [], + "source": [ + "y = covid.Severity03.to_numpy()" + ] + }, + { + "cell_type": "code", + "execution_count": 163, + "metadata": {}, + "outputs": [], + "source": [ + "y = ohe.transform(y.reshape(-1, 1)).toarray()" + ] + }, + { + "cell_type": "code", + "execution_count": 164, + "metadata": {}, + "outputs": [], + "source": [ + "# Use Both\n", + "# covid = covid.drop([\"Severity01\", \"Severity03\"], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 165, + "metadata": {}, + "outputs": [], + "source": [ + "# Use None\n", + "covid = covid.drop([\"Severity01\", \"Severity03\", \"CTScore\", \"AIVolumeP\"], axis=1)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Patient No. is irrrelevant" + ] + }, + { + "cell_type": "code", + "execution_count": 166, + "metadata": {}, + "outputs": [], + "source": [ + "covid = covid.drop([\"No\"], axis=1)" + ] + }, + { + "cell_type": "code", + "execution_count": 167, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "X = covid\n", + "X_train, X_test, y_train, y_test = train_test_split(X, y, train_size = 0.9, random_state = 1)" + ] + }, + { + "cell_type": "code", + "execution_count": 168, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "((77, 55), (9, 55))" + ] + }, + "execution_count": 168, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 169, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Sex', 'Age', 'AgeG1', 'Height', 'Weight', 'BMI', 'Temp', 'cTnITimes',\n", + " 'cTnI', 'cTnICKMBOrdinal1', 'cTnICKMBOrdinal2', 'AST', 'LDH', 'CK',\n", + " 'CKMB', 'HBDH', 'HiCKMB', 'NTproBNP', 'Cr', 'PCT1', 'WBC1', 'NEU1',\n", + " 'LYM1', 'N2L1', 'CRP1', 'ALB1', 'PCT2', 'WBC2', 'NEU2', 'LYM2', 'N2L2',\n", + " 'CRP2', 'ALB2', 'Sympton', 'Fever', 'Cough', 'Phlegm', 'Hemoptysis',\n", + " 'SoreThroat', 'Catarrh', 'Headache', 'ChestPain', 'Fatigue',\n", + " 'SoreMuscle', 'Stomachache', 'Diarrhea', 'PoorAppetite', 'NauseaNVomit',\n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Lung', 'CAD', 'Arrythmia',\n", + " 'Cancer'],\n", + " dtype='object')" + ] + }, + "execution_count": 169, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.columns" + ] + }, + { + "cell_type": "code", + "execution_count": 170, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "array([[0., 1., 0., 0.],\n", + " [0., 0., 1., 0.],\n", + " [0., 1., 0., 0.],\n", + " [0., 1., 0., 0.],\n", + " [0., 0., 1., 0.],\n", + " [0., 0., 1., 0.],\n", + " [0., 1., 0., 0.],\n", + " [0., 0., 1., 0.],\n", + " [1., 0., 0., 0.]])" + ] + }, + "execution_count": 170, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "y_test" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 3. Feature Selection (Same as 2-type)" + ] + }, + { + "cell_type": "code", + "execution_count": 171, + "metadata": {}, + "outputs": [], + "source": [ + "cor_features = ['PCT2', 'Stomachache', 'Arrythmia', \n", + " 'LYM2',\n", + " 'NEU1',\n", + " 'NEU2',\n", + " 'BMI',\n", + " 'N2L2',\n", + " 'cTnICKMBOrdinal2',\n", + " 'HBDH',\n", + " 'Height', 'CK', 'HiCKMB', 'Cr', 'PCT1',\n", + " 'Weight', 'AST', 'CKMB', 'WBC1', 'WBC2']" + ] + }, + { + "cell_type": "code", + "execution_count": 172, + "metadata": {}, + "outputs": [], + "source": [ + "# X_train.drop(labels=cor_features, axis=1, inplace=True)\n", + "# X_test.drop(labels=cor_features, axis=1, inplace=True)" + ] + }, + { + "cell_type": "code", + "execution_count": 173, + "metadata": { + "scrolled": false + }, + "outputs": [], + "source": [ + "# X_train.shape, X_test.shape" + ] + }, + { + "cell_type": "code", + "execution_count": 174, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "Index(['Sex', 'Age', 'AgeG1', 'Height', 'Weight', 'BMI', 'Temp', 'cTnITimes',\n", + " 'cTnI', 'cTnICKMBOrdinal1', 'cTnICKMBOrdinal2', 'AST', 'LDH', 'CK',\n", + " 'CKMB', 'HBDH', 'HiCKMB', 'NTproBNP', 'Cr', 'PCT1', 'WBC1', 'NEU1',\n", + " 'LYM1', 'N2L1', 'CRP1', 'ALB1', 'PCT2', 'WBC2', 'NEU2', 'LYM2', 'N2L2',\n", + " 'CRP2', 'ALB2', 'Sympton', 'Fever', 'Cough', 'Phlegm', 'Hemoptysis',\n", + " 'SoreThroat', 'Catarrh', 'Headache', 'ChestPain', 'Fatigue',\n", + " 'SoreMuscle', 'Stomachache', 'Diarrhea', 'PoorAppetite', 'NauseaNVomit',\n", + " 'Hypertention', 'Hyperlipedia', 'DM', 'Lung', 'CAD', 'Arrythmia',\n", + " 'Cancer'],\n", + " dtype='object')" + ] + }, + "execution_count": 174, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "X_train.columns" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 4. Classifier" + ] + }, + { + "cell_type": "code", + "execution_count": 175, + "metadata": {}, + "outputs": [], + "source": [ + "import sklearn\n", + "import sklearn.ensemble\n", + "import sklearn.metrics\n", + "import xgboost as xgb" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Cross Validation**" + ] + }, + { + "cell_type": "code", + "execution_count": 176, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.model_selection import cross_val_score" + ] + }, + { + "cell_type": "code", + "execution_count": 177, + "metadata": {}, + "outputs": [], + "source": [ + "def cv_score(classifier, X, y, scoring):\n", + " return cross_val_score(classifier, X, y, cv=5, scoring=scoring)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Decision Tree**" + ] + }, + { + "cell_type": "code", + "execution_count": 213, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "data": { + "text/plain": [ + "DecisionTreeClassifier()" + ] + }, + "execution_count": 213, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "dt = sklearn.tree.DecisionTreeClassifier()\n", + "\n", + "dt_f1 = cv_score(dt, X_train, y_train, 'f1_micro')\n", + "\n", + "dt.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 214, + "metadata": { + "scrolled": true + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.4525\n" + ] + } + ], + "source": [ + "print(np.mean(dt_f1))" + ] + }, + { + "cell_type": "code", + "execution_count": 215, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Decision Tree\n", + "Precision: 0.3333333333333333\n", + "Recal: 0.3333333333333333\n", + "F1: 0.3333333333333333\n", + "CI: 0.3079842869168074\n" + ] + } + ], + "source": [ + "dt_pred = dt.predict(X_test)\n", + "print(\"Decision Tree\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, dt_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, dt_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, dt_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, dt_pred)) * (sklearn.metrics.accuracy_score(y_test, dt_pred))) / len(X_test)))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Random Forest**" + ] + }, + { + "cell_type": "code", + "execution_count": 216, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.ensemble import RandomForestClassifier" + ] + }, + { + "cell_type": "code", + "execution_count": 217, + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "RandomForestClassifier()" + ] + }, + "execution_count": 217, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rf = sklearn.ensemble.RandomForestClassifier(n_estimators=100)\n", + "\n", + "rf_f1 = cv_score(rf, X_train, y_train, 'f1_micro')\n", + "\n", + "rf.fit(X_train, y_train)" + ] + }, + { + "cell_type": "code", + "execution_count": 218, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.526854897337656\n" + ] + } + ], + "source": [ + "print(np.mean(rf_f1))" + ] + }, + { + "cell_type": "code", + "execution_count": 219, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Random Forest\n", + "Precision: 0.3333333333333333\n", + "Recal: 0.3333333333333333\n", + "F1: 0.46153846153846156\n", + "CI: 0.3079842869168074\n" + ] + } + ], + "source": [ + "rf_pred = rf.predict(X_test)\n", + "print(\"Random Forest\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, rf_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, rf_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, rf_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, rf_pred)) * (sklearn.metrics.accuracy_score(y_test, rf_pred))) / len(X_test)))\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**SVM**" + ] + }, + { + "cell_type": "code", + "execution_count": 183, + "metadata": {}, + "outputs": [], + "source": [ + "from sklearn.svm import SVC" + ] + }, + { + "cell_type": "code", + "execution_count": 184, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "data": { + "text/plain": [ + "SVC(decision_function_shape='ovo', probability=True)" + ] + }, + "execution_count": 184, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "svc = SVC(probability=True, decision_function_shape='ovo')\n", + "\n", + "svc_f1 = cv_score(svc, X_train, ohe.inverse_transform(y_train), 'f1_micro')\n", + "\n", + "svc.fit(X_train, ohe.inverse_transform(y_train))" + ] + }, + { + "cell_type": "code", + "execution_count": 185, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6375\n" + ] + } + ], + "source": [ + "print(np.mean(svc_f1))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**XGBoost**" + ] + }, + { + "cell_type": "code", + "execution_count": 186, + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:31:29] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:31:29] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:31:29] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:31:29] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:31:29] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:31:29] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:31:30] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:31:30] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:31:30] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:31:30] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "name": "stderr", + "output_type": "stream", + "text": [ + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\xgboost\\sklearn.py:892: UserWarning: The use of label encoder in XGBClassifier is deprecated and will be removed in a future release. To remove this warning, do the following: 1) Pass option use_label_encoder=False when constructing XGBClassifier object; and 2) Encode your labels (y) as integers starting with 0, i.e. 0, 1, 2, ..., [num_class - 1].\n", + " warnings.warn(label_encoder_deprecation_msg, UserWarning)\n", + "d:\\anaconda3\\envs\\covid-19\\lib\\site-packages\\sklearn\\utils\\validation.py:63: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n", + " return f(*args, **kwargs)\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[22:31:30] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:541: \n", + "Parameters: { scale_pos_weight } might not be used.\n", + "\n", + " This may not be accurate due to some parameters are only used in language bindings but\n", + " passed down to XGBoost core. Or some parameters are not used but slip through this\n", + " verification. Please open an issue if you find above cases.\n", + "\n", + "\n", + "[22:31:30] WARNING: C:/Users/Administrator/workspace/xgboost-win64_release_1.3.0/src/learner.cc:1061: Starting in XGBoost 1.3.0, the default evaluation metric used with the objective 'multi:softprob' was changed from 'merror' to 'mlogloss'. Explicitly set eval_metric if you'd like to restore the old behavior.\n" + ] + }, + { + "data": { + "text/plain": [ + "XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n", + " colsample_bynode=1, colsample_bytree=0.7, eta=0.3, gamma=0,\n", + " gpu_id=-1, importance_type='gain', interaction_constraints='',\n", + " learning_rate=0.300000012, max_delta_step=0, max_depth=6,\n", + " min_child_weight=1, missing=nan, monotone_constraints='()',\n", + " n_estimators=100, n_jobs=8, num_parallel_tree=1,\n", + " objective='multi:softprob', random_state=0, reg_alpha=4,\n", + " reg_lambda=1, scale_pos_weight=9, subsample=0.8,\n", + " tree_method='exact', validate_parameters=1, verbosity=None)" + ] + }, + "execution_count": 186, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "# Create a model\n", + "# Params from: https://www.kaggle.com/aharless/swetha-s-xgboost-revised\n", + "xgbc = xgb.XGBClassifier(\n", + " booster = 'gbtree',\n", + " max_depth = 6,\n", + " eta = 0.3,\n", + " subsample = 0.8,\n", + " colsample_bytree = 0.7,\n", + " colsample_bylevel = 0.7,\n", + " scale_pos_weight = 9,\n", + " min_child_weight = 1,\n", + " reg_alpha = 4,\n", + " objective = 'multi:softmax'\n", + ")\n", + "\n", + "xgbc_f1 = cv_score(xgbc, X_train, ohe.inverse_transform(y_train), 'f1_micro')\n", + "\n", + "# Fit the models\n", + "xgbc.fit(np.array(X_train), np.array(ohe.inverse_transform(y_train)))" + ] + }, + { + "cell_type": "code", + "execution_count": 187, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0.6258333333333332\n" + ] + } + ], + "source": [ + "print(np.mean(xgbc_f1))" + ] + }, + { + "cell_type": "code", + "execution_count": 188, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "XGBoost\n", + "Precision: 0.6666666666666666\n", + "Recal: 0.6666666666666666\n", + "F1: 0.6666666666666666\n", + "CI: 0.3079842869168074\n" + ] + } + ], + "source": [ + "xgbc_pred = ohe.transform(xgbc.predict(np.array(X_test)).reshape(-1, 1)).toarray()\n", + "print(\"XGBoost\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, xgbc_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, xgbc_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, xgbc_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, xgbc_pred)) * (sklearn.metrics.accuracy_score(y_test, xgbc_pred))) / len(X_test)))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## 6. Results" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Save Models" + ] + }, + { + "cell_type": "code", + "execution_count": 47, + "metadata": {}, + "outputs": [], + "source": [ + "import pickle" + ] + }, + { + "cell_type": "code", + "execution_count": 223, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"4-type-model-4.pkl\", 'wb') as f:\n", + " pickle.dump([dt, rf, svc, xgbc], f)\n", + "with open(\"dataset/4-type-dataset.pkl\", 'wb') as f:\n", + " pickle.dump([X_train, X_test, y_train, y_test], f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load Models" + ] + }, + { + "cell_type": "code", + "execution_count": 49, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"4-type-model-4.pkl\", 'rb') as f:\n", + " [dt, rf, svc, xgbc] = pickle.load(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Load Dataset" + ] + }, + { + "cell_type": "code", + "execution_count": 50, + "metadata": {}, + "outputs": [], + "source": [ + "with open(\"dataset/4-type-dataset-ct.pkl\", 'rb') as f:\n", + " [X_train, X_test, y_train, y_test] = pickle.load(f)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Prediction**" + ] + }, + { + "cell_type": "code", + "execution_count": 189, + "metadata": {}, + "outputs": [], + "source": [ + "import numpy as np\n", + "import sklearn" + ] + }, + { + "cell_type": "code", + "execution_count": 190, + "metadata": {}, + "outputs": [], + "source": [ + "svc_pred = ohe.transform(svc.predict(X_test).reshape(-1, 1))" + ] + }, + { + "cell_type": "code", + "execution_count": 220, + "metadata": { + "scrolled": true + }, + "outputs": [], + "source": [ + "dt_pred = dt.predict(X_test)\n", + "rf_pred = rf.predict(X_test)\n", + "svc_pred = ohe.transform(svc.predict(X_test).reshape(-1, 1)).toarray()\n", + "xgbc_pred = ohe.transform(xgbc.predict(np.array(X_test)).reshape(-1, 1)).toarray()" + ] + }, + { + "cell_type": "code", + "execution_count": 221, + "metadata": {}, + "outputs": [], + "source": [ + "import math" + ] + }, + { + "cell_type": "code", + "execution_count": 222, + "metadata": { + "scrolled": false + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Decision Tree\n", + "Precision: 0.3333333333333333\n", + "Recal: 0.3333333333333333\n", + "F1: 0.3333333333333333\n", + "CI: 0.3079842869168074\n", + "\n", + "Random Forest\n", + "Precision: 0.3333333333333333\n", + "Recal: 0.3333333333333333\n", + "F1: 0.46153846153846156\n", + "CI: 0.3079842869168074\n", + "\n", + "SVC\n", + "Precision: 0.5555555555555556\n", + "Recal: 0.5555555555555556\n", + "F1: 0.5555555555555556\n", + "CI: 0.32464394339996944\n", + "\n", + "XGBoost\n", + "Precision: 0.6666666666666666\n", + "Recal: 0.6666666666666666\n", + "F1: 0.6666666666666666\n", + "CI: 0.3079842869168074\n" + ] + } + ], + "source": [ + "print(\"Decision Tree\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, dt_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, dt_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, dt_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, dt_pred)) * (sklearn.metrics.accuracy_score(y_test, dt_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"Random Forest\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, rf_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, rf_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, rf_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, rf_pred)) * (sklearn.metrics.accuracy_score(y_test, rf_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"SVC\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, svc_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, svc_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, svc_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, svc_pred)) * (sklearn.metrics.accuracy_score(y_test, svc_pred))) / len(X_test)))\n", + "\n", + "print()\n", + "\n", + "print(\"XGBoost\")\n", + "print(\"Precision: \", sklearn.metrics.accuracy_score(y_test, xgbc_pred))\n", + "print(\"Recal: \", sklearn.metrics.recall_score(y_test, xgbc_pred, average='micro'))\n", + "print(\"F1: \", sklearn.metrics.f1_score(y_test, xgbc_pred, average='micro'))\n", + "print(\"CI:\", 1.96 * math.sqrt( ((1 - sklearn.metrics.accuracy_score(y_test, xgbc_pred)) * (sklearn.metrics.accuracy_score(y_test, xgbc_pred))) / len(X_test)))" + ] + }, + { + "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.8.5" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/dataset/2-type-dataset-ct.pkl b/dataset/2-type-dataset-ct.pkl new file mode 100644 index 0000000..23fdbef Binary files /dev/null and b/dataset/2-type-dataset-ct.pkl differ diff --git a/dataset/2-type-dataset.pkl b/dataset/2-type-dataset.pkl new file mode 100644 index 0000000..70fd336 Binary files /dev/null and b/dataset/2-type-dataset.pkl differ diff --git a/dataset/4-type-dataset-ct.pkl b/dataset/4-type-dataset-ct.pkl new file mode 100644 index 0000000..3520dbd Binary files /dev/null and b/dataset/4-type-dataset-ct.pkl differ diff --git a/dataset/4-type-dataset.pkl b/dataset/4-type-dataset.pkl new file mode 100644 index 0000000..a3f6812 Binary files /dev/null and b/dataset/4-type-dataset.pkl differ diff --git a/dataset/covid.csv b/dataset/covid.csv new file mode 100644 index 0000000..e4c21db --- /dev/null +++ b/dataset/covid.csv @@ -0,0 +1,93 @@ +MedNum,No,Sex,Age,AgeG1,Height,Weight,BMI,Temp,Severity03,Severity01,CTScore,AIVolumeP,cTnITimes,cTnI,cTnICKMBOrdinal1,cTnICKMBOrdinal2,AST,LDH,CK,CKMB,HBDH,HiCKMB,NTproBNP,Cr,LVEF,PCT1,WBC1,NEU1,LYM1,N2L1,CRP1,ALB1,PCT2,WBC2,NEU2,LYM2,N2L2,CRP2,ALB2,SO2,PO2,YHZS,Sympton,Fever,Cough,Phlegm,Hemoptysis,SoreThroat,Catarrh,Headache,ChestPain,Fatigue,SoreMuscle,Stomachache,Diarrhea,PoorAppetite,NauseaNVomit,Hypertention,Hyperlipedia,DM,Lung,CAD,Arrythmia,Cancer,Onset2Admi,Onset2CT1,Onset2CTPositive1,Onset2CTPeak,RUL,RML,RLL,LUL,LLL +346136,2,0,75,1,150,57,25.3,38.1,3,1,9,.337,11,.15,1,1,17,188,55,4.9,149,10.7,4480,89,57,.12,5.61,3.95,.95,4.16,26,35.9,.12,7.95,7.51,.31,24.23,127.5,30.2, , , ,1,1,1,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0,0,0,0,7,7,7,11, , , , , +346167,3,0,48,0,155,52,21.6,36.9,1,0,1,.007, , ,0,0,14,139,27,8.3,113,17.5, , , ,0,2.52,.95,1.52,.63,.07,38.68,0,3.49,1.76,1.18,1.49,20,33.3, , , ,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,10, , , , , +346256,4,0,66,1,164,53,19.7,39,1,0,7,.097,7,.01,0,0,27,308,39,18.4,244,19.4,697,78, ,0,3.11,2.09,.7,2.99,5.2,34.1,0,4.05,3.4,.56,6.07,5.2,34.1, , , ,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,6,6,9, , , , , +346350,5,1,65,1,170,75,26,37.9,1,0,4,.003,6,.01,0,0,20,193,68,10.3,144,21,77,93.4, ,0,4.84,3.4,1.15,2.96,7,38.7,0,4.71,3.08,1.01,3.05,7,35.8, , , ,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,15,15,15,15, , , , , +346364,6,0,50,0,161,61.5,23.7,37.3,1,0,9,.137, , ,0,0,21,187,18,8.3,154,22.3, , , ,0,6.04,4.33,1.27,3.41,8.8,34.9,0,9.1,7.86,1.04,7.56,15.67,33.4, , , ,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,10,12,12,12, , , , , +346367,7,1,36,0,168,93,33,36.8,2,1,18,.709,7,.01,0,0,14.6,260,41,10,201,15.5,1660,59.6,67,0,6.2,4.3,1.2,3.58,47.4,41.1,0,9.29,8.64,.33,26.18,49.1,35.3, , , ,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,4,4,4,11, , , , , +346368,8,0,38,0,163,75,28.2,37.2,0,0,0,0, , ,0,0,34,157,63,12.7,110,17.7, , , ,0,6.76,4.36,1.37,3.18,1.5,40.4,0,6.76,4.36,1.37,3.18,16.06,36.5, , , ,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2, , , , , , , +346476,9,0,63,1,160,72.5,28.3,36.5,0,0,0,.001,3,.01,0,0,26,238,108,10.8,161,24,20,90, ,0,3.82,2.32,1.12,2.07,7,42.8,0,4.03,2.82,.84,3.36,7,36.8, , , ,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, , , , , , , +346446,10,1,56,1,172,70,23.7,40,1,0,4,.038,2,.01,0,0,18.9,143,49,14.3,98,15.1,51,91, ,0,4.87,3.54,1.17,3.03,7.3,42.9,0,5.42,3.88,1.05,3.7,11.41,36.3, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,5,6,6,9, , , , , +346498,12,1,69,1,173,60,20,38,2,1,13,.556,13,.01,0,0,21.8,343,109,14,252,18.9,2280,93.4,63,0,3.95,2.11,1.23,1.72,25.9,35.5,0,5.64,4.74,.45,10.53,128.17,37.9, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,3,4,4,9, , , , , +346500,13,0,70,1,160,75,29.3,36.7,2,1,10,.315,12,.056,1,1,17.2,219,128,13.6,169,15,4710,75,65,0,5.59,3.33,1.44,2.31,10.9,32.3,0,6.96,5.79,.66,8.77,45.79,32.4, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,3,4,4,9, , , , , +346572,14,0,58,1,162,65,24.8,37.4,2,1,9,.242,8,.01,0,0,18.6,208,73,21.4,164,21.4,1220,62.5, ,0,4.81,2.8,1.21,2.31,14.19,38.8,0,4.63,2.63,1.24,2.12,64.15,36.5, , , ,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,9, , , , , +346546,15,1,60,1,172,60,20.3,38.9,3,1,16,.905,23,.014,0,0,22.6,283,167,11.5,205,18,2820,65.9,63,0,4.7,2.8,.7,4,17.07,34.1,0,4.78,4.45,.27,16.48,59.28,33.6, , , ,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,5,7,7,9, , , , , +346615,16,0,33,0,152,47.5,20.6,37.5,1,0,3,.031,7,.01,0,0,33.4,155,29,13.7,121,22.7,248,55.8, ,0,5.47,3.23,1.41,2.29,.54,38.3,0,5.39,4.22,1,4.22,8.6,37.5, , , ,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,6,12, , , , , +346614,17,0,55,1,157,61,24.7,36.3,0,0,0,0,8,.01,0,0,29.8,185,91,14.2,141,14.2,71,71.8, ,.13,5.23,2.76,1.78,1.55,29.64,34.9,0,4.47,2.64,1.33,1.98,29.64,34.9, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, , , , , , , +346617,18,1,32,0,158,50,20,36.8,1,0,3,.018,7,.01,0,0,24.7,153,60,16.8,126,16.8,27,86, ,0,4.4,1.88,2.09,.9,1.21,43.3,0,4.14,2.21,1.42,1.56,3.34,38.5, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,7, , , , , + ,19,0,59,1,155,63,26.2,37,1,0,1,0,4,.01,0,0,17.3,165,42,11.8,147,30.7,156,71.5, ,0,2.62,1.3,1.02,1.27,0,41.5,0,2.53,1.38,.84,1.64,.46,36.5, , , ,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, , , , , , , , , +346537,20,0,23,0,150,44,19.6,36.8,0,0,0,0,1,.01,0,0,18,131,68,6,101,15.2,26,65.3, ,0,7.53,4.86,2.1,2.31,0,43.2,0,8.81,6.83,1.13,6.04,41.87,38.1, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0, , , , , , , +346514,21,1,59,1,168,63.5,22.5,36.4,0,0,0,.032,15,.51,1,1,32,254,82,23.7,177,23.6,1060,86, ,0,1.91,.65,.91,.71,17.2,32.6,0,1.91,.65,.71,.92,17.2,32.5, , , ,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,1,1,1, , , , , , , +297500,22,0,33,0,156,40,16.4,36.8,1,0,5,.014,7,.01,0,0,15.3,125,29,7.3,104,16.8,140,57.3, ,0,3.12,1.78,.9,1.98,2.12,36.5,0,2.26,1.27,.62,2.05,4.98,36.5, , , ,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,2,6,9, , , , , +346639,23,1,29,0,174,67,22.1,38,0,0,0,0,1,.01,0,0,14.3,124,92,21.6,103,26.8,20,76.7, ,0,7.45,4.29,2.41,1.78,0,45.2,0,4.92,3.11,1.43,2.17,.21,40.3, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,6,6, , , , , , , + ,24,0,56,1,145,55,26.2,37.2,1,0,5,.003,5,.01,0,0,12.9,184,60,11.9,144,23.2,117,58.2, ,0,6.61,3.93,2.16,1.82,.3,39.5,0,5.81,3.72,1.42,2.62,.53,37.7, , , ,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,18,19,19,19, , , , , +346,25,1,64,1,167,69,24.7,37.7,1,0,4,.028,10,.01,0,0,21,154,63,13.5,124,13.5,392,67.2,63,0,6.49,3.99,1.74,2.29,2.11,39.5,0,5.58,3.16,1.66,1.9,28.94,35.2, , , ,1,1,1,1,0,0,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,9,10,10,10, , , , , +346595,26,0,28,0,172,58,19.6,36.9,1,0,5,.092,9,.01,0,0,20.1,173,88,13.1,140,15.9,135,85.5, ,0,5.33,3.59,1.13,3.18,1.97,43.1,0,3.43,2.4,.82,2.93,31.02,36.6, , , ,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7, , , , , +346568,28,1,44,0,173,75,25.1,36.6,0,0,0,0,8,.01,0,0,35.5,151,192,13.5,122,16.3,187,103.4, ,.12,5.75,2.33,2.09,1.11,2.56,42.1,0,5.75,2.33,2.09,1.11,27.85,37.5, , , ,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, , , , , , , +346627,29,1,52,1,170,80,27.7,36.7,2,1,9,.131,16,.085,1,1,33.9,193,105,13.9,138,20.1,456,94, ,0,4.53,2.61,1.46,1.79,4.72,40.6,0,3.83,3.05,.7,4.36,33.25,40.1, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,12, , , , , +346609,30,1,36,0,177,80,25.5,36.8,2,1,11,.267,7,.01,0,0,26,288,377,13.4,227,29.3,932,106, ,0,4.45,2.57,1.54,1.67,17.78,37.7,0,6.36,5.51,.68,8.1,46.57,35.5, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,5,6,6,9, , , , , +346622,31,0,29,0,160,70,27.3,38.5,0,0,0,0,2,.01,0,0,13.5,168,52,13.4,133,17.8,43,61.3, ,.13,4.2,1.88,1.84,1.02,.82,37.4,0,4.6,2.5,1.67,1.5,1.07,37.4, , , ,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,3,4, , , , , , , +346654,32,0,56,1,168,70,24.8,37.8,1,0,6,.101,7,.01,0,0,47.5,215,68,19.7,167,19.7,217,70.4, ,0,3.23,1.75,1.09,1.61,8,38.8,0,3.32,2.22,.88,2.52,31.97,38.8, , , ,1,1,1,1,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,3,3,12, , , , , +346650,33,0,34,0,168,56,19.8,38.6,1,0,4,.023,1,.01,0,0,13,158,36,7.1,123,10.3,63,58.3, ,.15,4.38,1.12,2.8,.4,2.23,39.2,0,5.24,2.26,2.45,.92,2.23,37.6, , , ,1,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,7,7, , , , , +232494,34,1,42,0,170,72,24.9,37.5,1,0,10,.192,8,.01,0,0,28.4,263,77,17.9,190,19,475,72.9, ,0,3.76,2.33,1.08,2.16,36.49,37.6,0,4.13,2.81,.81,3.47,78.76,37.6, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,0,0,0,0,2,3,3,6, , , , , +346652,35,1,33,0,170,72,24.9,37.1,1,0,7,.102, , ,0,0,12.9,218,63,8.1,178,15.4, , , ,.14,4.1,1.96,1.61,1.22,6.95,38.6,0,3.85,3.09,.64,4.83,27.85,38, , , ,1,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,5,5,10, , , , , +346623,36,1,64,1,165,70,25.7,37.5,2,1,5,.026,12,.014,0,1,23.9,208,74,18,165,56.1,384,95.4, ,.13,6.64,3.66,2.03,1.8,6.36,39.3,0,6.6,4.07,1.42,2.87,16.46,36.2, , , ,1,1,0,0,0,1,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12, , , , , +346611,37,1,19,0,173,78,26.1,36.6,1,0,2,0,3,.01,0,0,18.3,149,58,13.5,134,34.3,60,82.1, ,0,5.31,2.97,1.71,1.74,.87,45.4,0,5.32,3.09,1.46,2.12,.94,40.5, , , ,1,0,1,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1,1,1, , , , , +346672,38,1,38,0,173,70,23.4,35.9,2,1,8,.091,6,.017,0,0,17.9,137,40,4.4,127,34.9,51,105,65,.12,5.02,3.08,1.05,2.93,8.6,41.1,0,2.47,1.39,.64,2.17,19.52,33.6, , , ,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,3,9, , , , , +346697,39,0,43,0,163,55,20.7,37.1,1,0,3,.027,5,.01,0,0,13.4,140,42,14.7,108,14.7,76,58.9, ,.16,4.22,2.81,.82,3.43,1.17,39.4,0,4.22,2.81,.82,3.43,4.12,37, , , ,1,1,1,0,0,0,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,5,6,6,9, , , , , +346699,40,1,69,1,168,73.5,26,36.5,1,0,1,.007,11,.01,0,0,19.1,262,60,15.7,158,46.5,810,171.8, ,5.75,12.52,9.14,1.61,5.68,128.31,35.7,0,12.55,9.14,1.61,5.68,128.31,34.3, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,6,16, , , , , +346701,41,0,41,0,158,45,18,37.5,1,0,3,.006,6,.01,0,0,16.2,154,36,12.6,114,15.2,54,57, ,0,5.51,3.4,1.57,2.17,4.1,40,0,7.08,5.24,1.31,4,4.1,35.6, , , ,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,2, , , , , +346699,42,1,44,0,174,72,23.8,36.6,1,0,1,.003,8,.01,0,0,27.8,201,140,16,164,16,23,91.5, ,0,3.27,1.04,1.29,.81,.44,43.1,0,3.44,1.63,1.2,1.36,.63,40.2, , , ,1,0,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,2,5, , , , , +346698,43,1,15,0,172,67.5,22.8,36.5,1,0,1,0,1,.01,0,0,17.4,160,94,16.3,144,16.3,20,65.4, ,0,6.43,3.13,2.76,1.13,.6,42.3,0,5.93,3.42,1.81,1.89,.69,40.7, , , ,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,13,13,13, , , , , +346724,44,1,44,0,170,70,24.2,36.8,2,1,9,.161,9,.01,0,0,21.2,196,50,11.8,163,18.5,2780,80.8,67,.19,4.77,3.47,.88,3.94,33.8,40.8,0,2.77,2.21,.5,4.42,92.58,36.7, , , ,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,2,5, , , , , +346726,45,0,57,1,150,52,23.1,37.2,1,0,3,.016, , ,0,0,25.2,166,43,17.2,130,17.2, , , ,0,7.69,2.81,4.19,.67,11.01,38.7,0,5.01,2.4,2.17,1.11,11.01,38.7, , , ,1,0,0,0,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,2,2,2, , , , , +346723,46,1,42,0,173,70,23.4,36.7,1,0,2,.004,8,.014,0,0,19.3,142,50,12.3,114,20.4,25,86.1, ,0,4.58,2.31,1.7,1.36,17.58,43.2,0,3.3,1.56,1.41,1.11,17.58,37, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,6,6, , , , , +346722,47,1,29,0,176,70,22.6,36.6,1,0,1,0,8,.01,0,0,21.2,187,88,16.2,161,16.2,67,102.4, ,.13,5.78,2.71,2.33,1.16,2.21,48,0,6.17,3.71,1.87,1.98,2.21,39.8, , , ,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,5,5, , , , , +346700,48,1,36,0,176,86,27.8,38,1,0,1,.015,4,.01,0,0,48.9,148,76,10.8,100,13.6,31,86.3, ,0,7.41,4.41,1.97,2.24,10.48,46.3,0,5.45,3.14,1.61,1.95,10.48,38.5, , , ,1,1,1,0,0,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,4,5,5,5, , , , , + ,49,1,66,1,176,60,19.4,36.7,1,0,2,.048,4,.01,0,0,29,293,70,12.2,206,15.6,90,71.8, ,0,8.49,5.23,2.47,2.12,3.77,37.4,0,6.68,5.07,1.08,4.69,3.77,35.8, , , ,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, , , , , , , , +346745,50,1,45,0,168,67.8,24,36.8,0,0,0,0,6,.01,0,0,12.9,102,52,7.9,86,12.3,55,88, ,.12,5.17,2.1,2.58,.81,.4,42.7,0,3.75,2.12,1.23,1.72,.98,37.7, , , ,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,6,2, , , , , , , +346671,51,0,29,0,158,49,19.6,37,0,0,0,0,1,.01,0,0,12.6,156,48,9.2,129,12.5,29,69.5, ,0,10.08,6.81,1.74,3.91,34.54,40.3,0,7.69,5.05,1.57,3.22,34.54,40.2, , , ,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2, , , , , , , +346720,52,0,36,0, , ,24.2,39.3,0,0,0,0,5,.01,0,0,16.1,143,64,15.7,120,21,94,62.5, ,0,3.72,2.23,1.11,2.01,9.73,40,0,3.19,1.97,.91,2.16,9.73,38.3, , , ,1,1,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2, , , , , , , +346765,53,1,37,0,184,82.5,24.4,36.8,1,0,3,.039,5,.01,0,0,17.8,190,54,20,160,20,119,74.6, ,0,5.2,2.59,2.01,1.29,4.1,36.6,0,4.38,2.11,1.78,1.19,4.11,36.6, , , ,1,1,1,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,6,6,8, , , , , +346721,54,0,63,1,157,60,24.3,37,2,1,6,.062,13,.01,0,0,20.2,256,35,13,211,31.6,882,81,64,0,3.3,1.18,1.59,.74,.8,36.3,0,1.99,1.16,.61,1.9,59.69,36, , , ,1,1,1,0,0,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,2,13,13, , , , , +346725,56,1,38,0,173,80,26.7,37.2,0,0,0,0,4,.01,0,0,31.6,206,190,14.5,167,18,54,103.3, ,0,6.55,2.95,2.86,1.03,.53,46,0,4.63,2.53,1.5,1.69,11.84,38, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, , , , , , , , , +346716,57,0,75,1,148,68,31,37.6,1,0,4,.022,4,.01,0,0,16.8,215,53,9.4,144,32.9,113,90, ,0,5.02,2.41,2.1,1.15,1.94,39,0,4.3,2.47,1.1,2.25,22.74,34.5, , , ,1,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,3,9, , , , , +346715,58,0,48,0,161,54,20.8,37.3,1,0,6,.056,2,.01,0,0,12.6,184,69,17.1,140,18.5,272,61.2, ,0,4.7,2.83,1.47,1.93,23.89,37.2,0,4.54,3.14,1.02,3.08,23.89,37.2, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, , , , , , , , , +346719,59,0,58,1,148,50,22.8,36.7,1,0,9,.168,1,.01,0,0,16,213,212,10.1,165,14,26,53.2, ,0,4.35,2.43,1.69,1.44,44.35,36.1,0,3.46,1.74,1.44,1.21,63.84,36.1, , , ,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,8,9,9,11, , , , , +346762,60,1,64,1,175,61.5,20.1,37.3,2,1,17,.583,15,.015,0,0,28.4,203,91,13.8,170,23.5,2510,73.4,72,.2,3.34,2.32,.71,3.27,5.89,36.5,0,6.18,5.73,.39,14.69,69.19,33.4, , , ,1,1,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,3,3,15, , , , , +346,61,0,56,1,157,53,21.5,38.5,1,0,9,.162,4,.01,0,0,27.2,192,75,21.1,170,21.1,311,83.7, ,.1,4.25,2.89,.95,3.04,9.6,36.7,0,4.37,3.22,.81,3.98,57.78,35.5, , , ,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,5,5,5,8, , , , , +346760,62,1,29,0,176,93,30,36.3,1,0,5,.05,3,.01,0,0,34.6,182,55,12.9,132,12.9,20,69.9, ,0,4.54,2.71,1.41,1.92,4.99,41.1,0,3.37,1.63,1.3,1.25,6.05,41.1, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4,4,7, , , , , +346761,63,0,80,1,0,61.5,23,37,3,1,10,.327,6,.01,0,0,16.4,258,66,16,195,16,1510,46,63,.3,3.09,1.75,.99,1.77,115.14,28.1,0,3.17,2.09,.57,3.67,115.14,28.1, , , ,1,0,0,0,0,0,0,0,0,1,1,0,1,1,0,0,1,1,0,0,0,0,6,6,6,6, , , , , +346747,64,0,29,0,155,54,22.5,36.5,1,0,1,.001,4,.01,0,0,12.1,108,41,8.8,92,11.2,75,69.3, ,0,4.09,1.87,1.7,1.1,.34,41.1,0,5.51,3.36,1.51,2.23,.34,36.6, , , ,1,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,5,5,12, , , , , +346746,65,0,19,0,163,52,19.6,37,0,0,0,0,4,.01,0,0,30.4,149,58,16.9,114,20.6,54,75.9, ,0,6.95,3.17,3.29,.96,0,39.1,0,6.34,3.18,2.63,1.21,.5,35.2, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, , , , , , , , , +346795,66,0,36,0,165,60,22,36,1,0,3,.057,2,.01,0,0,14.6,121,62,15.6,104,19.3,26,62.5, ,.15,3.96,2.46,1.01,2.44,2.78,41.5,0,3.96,2.46,1.01,2.44,10.12,33.4, , , ,1,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,3,3,3,7, , , , , +346796,67,0,62,1,160,62.5,24.4,36.9,1,0,7,.128,2,.01,0,0,20.8,207,38,14.3,170,16.3,83,56.3, ,0,3.09,1.85,.99,1.87,46,38.1,0,3.09,1.85,.99,1.87,56.02,33.2, , , ,1,1,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,1,1,0,3,3,3,3, , , , , +346785,68,0,53,1,158,64,25.6,36.2,1,0,2,.001,8,.01,0,1,17,125,31,9.7,101,58.5,119,61.4, ,0,3.89,2.22,1.36,1.63,.79,42.8,0,5,3.67,.98,3.74,1.74,37.9, , , ,1,0,1,1,0,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,4,8, , , , , +346801,69,0,66,1,158,59,23.6,36.7,1,0,6,.052,6,.01,0,0,14.4,122,46,30.4,95,30.4,359,67.4, ,0,3.74,1.73,1.48,1.17,3.57,38.7,0,5.22,3.77,.78,4.83,22.12,33.3, , , ,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,1,3,3,3,7, , , , , +346802,70,0,51,1,160,49,19.1,36.6,1,0,3,.038,3,.01,0,0,15.2,128,39,9,107,9,130,60.7, ,0,4.58,2.25,1.36,1.65,5.61,43.6,0,4.58,2.25,1.36,1.65,12.2,35.1, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,5,11, , , , , +346787,71,1,55,1,176,94,30.3,38,1,0,6,.026,6,.01,0,0,13.4,143,63,10.9,117,16.5,46,86.2, ,0,6.05,3.45,1.94,1.78,9.7,41.7,0,5.72,3.29,1.57,2.1,12.77,36.3, , , ,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,3,4,4,4, , , , , +346794,72,1,35,0,175,82,26.8,37.1,1,0,1,.012,5,.01,0,0,14,144,94,16.2,101,24.3,144,88, ,0,3.74,1.77,1.46,1.21,5.84,41.9,0,3.14,1.5,1.15,1.3,5.84,38, , , ,1,1,1,0,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,3,3,3,3, , , , , +346707,73,0,22,0,160,40,15.6,37,0,0,0,0,6,.01,0,0,16.7,121,57,15.2,103,25.9,53,81, ,0,3.88,2.4,1.01,2.38,0,43.9,0,4.63,3.16,.89,3.55,5.59,37, , , ,1,0,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,3, , , , , , , +346814,74,1,35,0,183,85,25.4,37.4,0,0,0,0,6,.01,0,0,20.8,139,81,6.4,110,23.5,62,88.2, ,0,3.79,2.11,.98,2.15,.46,43.7,0,3.79,2.11,.98,2.15,.46,40.8, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,1, , , , , , , +346810,75,1,65,1,159,74,29.3,37.7,3,1,11,.23,13,2.6,1,1,37.6,280,45,13.6,223,51.1,3480,79.8,63,0,6.87,5.59,.81,6.9,39.03,41.2,0,6.78,5.11,.7,7.3,49.48,33.5, , , ,1,1,1,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,10,11,11,11, , , , , +346770,76,0,54,1,155,55,22.9,37.7,2,1,5,.059,1,.01,0,0,20.5,187,33,6.1,140,22.1,193,64.6, ,0,3.61,1.65,1.69,.98,26.8,34.7,0,4.24,2.36,1.5,1.57,40.8,35.5, , , ,1,1,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,6,7,7,7, , , , , +346813,77,0,64,1,165,75,27.5,37.6,1,0,3,.012,8,.01,0,0,15.1,180,58,13,153,15.5,338,59.3, ,.13,3.65,1.54,1.78,.87,5.14,36.3,0,3.49,1.66,1.47,1.13,5.14,37.8, , , ,1,1,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,10,11,11,15, , , , , + ,78,0,58,1,160,58,22.7,37.5,1,0,2,0,4,.01,0,0,15.5,185,68,17.7,135,17.8,34,70.8, ,0,7.14,4.3,2.23,1.93,.64,39.4,0,6.86,4.88,1.41,3.46,.93,38.8, , , ,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, , , , , , , , + ,79,1,39,0,170,70,24.2,37,1,0,5,.013,5,.01,0,0,21.8,159,92,11.1,130,14.3,65,95.2, ,0,4.72,2.28,1.95,1.17,1.16,44.5,0,4.42,2.56,1.36,1.88,1.16,38.8, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,11,11,11,11, , , , , +346832,81,0,32,0,165,60,22,38,2,1,9,.14,11,.01,0,0,21.3,265,104,8.8,204,13,251,64, ,0,2.63,1.49,.89,1.67,43.35,39.6,0,2.12,1.29,.53,2.43,111.02,36.7, , , ,1,1,1,0,0,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,13,4,4,6, , , , , +346855,82,0,64,1,160,60.1,23.5,36.6,2,1,4,.042,6,.01,0,0,19.7,141,33,8.3,116,11.9,230,72.6, ,0,3.08,1.78,1.05,1.7,.05,42.3,0,2.16,1.55,.46,3.37,22.2,35.3, , , ,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,10,11,11,20, , , , , +346871,83,0,59,1,159,52,20.6,36.3,1,0,3,.001,2,.01,0,0,21.5,169,47,15.7,144,15.7,108,55.4,71,0,3.76,2.94,.58,5.07,0,39.8,0,3.76,2.94,.58,5.07,3.17,39.8, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, , , , , , , , , +346872,84,0,32,0,157,52,21.1,36.3,1,0,1,.001,6,.01,0,0,12.7,137,45,13.7,115,14.5,32,62.1, ,.13,4.64,1.89,2.22,.85,.31,36.9,0,3.64,2.03,1.13,1.8,1.16,36.9, , , ,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,9,10,10,16, , , , , +346875,85,0,37,0,156,41,16.8,36.5,0,0,0,0,2,.01,0,0,10.4,123,45,7.7,99,16.8,70,53.5, ,0,4.45,1.47,1.47,1,0,39,0,4.45,1.47,1.47,1,.06,39, , , ,1,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,1,2,3, , , , , , , +346889,86,0,71,1,158,53,21.2,36.5,1,0,3,.006,4,.01,0,0,17.2,127,26,8.3,103,12.3,856,56.9, ,0,4.59,2.18,1.99,1.1,4.83,35.9,0,5.12,3.59,1.11,3.23,4.83,35.9, , , ,1,0,1,0,0,0,0,0,0,0,0,0,0,0,0,1,1,0,0,0,0,0,9,10,10,10, , , , , +346885,87,0,33,0,165,62.5,23,36.2,1,0,2,.003,4,.01,0,0,12,185,51,16.3,151,16.3,74,73.3, ,0,7.21,3.3,3.26,1.01,0,40.2,0,8.3,5.04,2.48,2.03,.25,39.2, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, , , , , , , , , +346878,89,1,67,1,170,72,24.9,37.8,3,1,7,.109,16,.04,1,1,21.2,148,50,12.9,126,16.8,8650,506, ,.36,4.25,3.47,.37,9.38,32.01,36.7,0,7.5,7.07,.26,27.19,183.56,32.7, , , ,1,1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0,5, , , , , +346985,90,0,59,1,160,60,23.4,37.8,1,0,6,.086,6,.01,0,0,34.5,202,78,14.5,163,15.6,197,66.1, ,0,4.27,1.62,2.04,.79,5.49,38.3,0,5.29,3.2,1.5,2.13,5.49,38.2, , , ,1,1,0,0,0,0,0,0,0,0,0,0,1,0,0,1,0,0,0,0,0,0,16,16,16,16, , , , , +346924,91,0,36,0,160,75,29.3,37.3,1,0,3,.002,4,.01,0,0,15.5,127,60,11.1,99,18.8,54,78.2, ,0,8.1,4.77,2.54,1.88,4.1,41,0,7.99,5.61,1.64,3.42,6.8,39.3, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, , , , , , , , , +347040,92,1,56,1,170,70,24.2,36.7,1,0,3,.018,6,.01,0,0,19.6,151,36,21.4,134,21.4,46,102.5, ,0,5.08,2.78,1.74,1.6,8.17,45.8,0,5.6,3.37,1.59,2.12,8.17,39.5, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,0,0,0, , , , , , , , , +347039,93,1,25,0,175,73,23.8,36.9,0,0,0,0,6,.01,0,0,31.5,173,108,12.2,127,13.1,77,86.8, ,0,7.49,3.28,3.37,.97,.56,46.4,0,7.08,3.42,2.62,1.31,1.34,43.3, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, , , , , , , , , +347042,94,1,63,1,173,90,30.1,36.4,2,1,6,.113,7,.01,0,0,25.7,220,100,10.3,160,14.3,433,75.4, ,0,7.15,4.79,1.53,3.13,22.69,39.2,0,8.22,5.75,1.46,3.94,22.69,36.5, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0, , , , , , , , , +347041,95,1,39,0,170,72.5,25.1,36.7,1,0,2,.01,5,.01,0,0,25.6,153,141,6.4,120,10.4,90,86.4, ,0,6.42,3.99,1.96,2.04,0,47.6,0,5.42,3.9,.97,4.02,1.44,43.9, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1, , , , , , , , , +347052,96,0,62,1,158,63,25.2,36.7,2,1,8,.093,3,.01,0,0,29.7,209,38,13.7,161,16.6,209,56.1, ,0,6.43,4.48,1.49,3.01,38.85,36,0,6.43,4.48,1.49,3.01,38.85,35.7, , , ,1,0,1,0,0,0,0,0,0,0,0,0,1,0,0,1,0,1,0,0,0,0,3,3,3,3, , , , , +347057,97,0,63,1,155,54,22.5,36.5,1,0,5,.009,5,.01,0,0,16.6,201,58,16.9,162,16.9,274,55.4, ,0,7.36,4.21,2.35,1.79,.4,38.5,0,6.17,3.75,1.6,2.34,.95,37.3, , , ,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, , , , , , , , , +347084,98,0,37,0,163,52,19.6,36.7,0,0,0,0,3,.01,0,0,11.2,134,68,12,113,17.1,20,64, ,0,5.77,2.74,2.25,1.22,.96,38.8,0,5.22,2.22,2.09,1.06,.96,38.8, , , ,1,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,4,4, , , , , , , diff --git a/lime.png b/lime.png new file mode 100644 index 0000000..9f53f32 Binary files /dev/null and b/lime.png differ diff --git a/model/2-type-model-4-ct.pkl b/model/2-type-model-4-ct.pkl new file mode 100644 index 0000000..8d8be0c Binary files /dev/null and b/model/2-type-model-4-ct.pkl differ diff --git a/model/2-type-model-4.pkl b/model/2-type-model-4.pkl new file mode 100644 index 0000000..8848446 Binary files /dev/null and b/model/2-type-model-4.pkl differ diff --git a/model/4-type-model-4-ct.pkl b/model/4-type-model-4-ct.pkl new file mode 100644 index 0000000..abd36d3 Binary files /dev/null and b/model/4-type-model-4-ct.pkl differ diff --git a/model/4-type-model-4.pkl b/model/4-type-model-4.pkl new file mode 100644 index 0000000..5b1af26 Binary files /dev/null and b/model/4-type-model-4.pkl differ