import pandas as pd
from sklearn.preprocessing import StandardScaler, LabelEncoder
from sklearn.model_selection import train_test_split
from collections import Counter
from sklearn.compose import ColumnTransformer
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, InputLayer
from sklearn.metrics import classification_report
from tensorflow.keras.utils import to_categorical
import numpy as np
data = pd.read_csv('heart_failure.csv')
data.info()
<class 'pandas.core.frame.DataFrame'> RangeIndex: 299 entries, 0 to 298 Data columns (total 15 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 Unnamed: 0 299 non-null int64 1 age 299 non-null float64 2 anaemia 299 non-null object 3 creatinine_phosphokinase 299 non-null int64 4 diabetes 299 non-null object 5 ejection_fraction 299 non-null int64 6 high_blood_pressure 299 non-null object 7 platelets 299 non-null float64 8 serum_creatinine 299 non-null float64 9 serum_sodium 299 non-null int64 10 sex 299 non-null object 11 smoking 299 non-null object 12 time 299 non-null int64 13 DEATH_EVENT 299 non-null int64 14 death_event 299 non-null object dtypes: float64(3), int64(6), object(6) memory usage: 35.2+ KB
data.head()
Unnamed: 0 | age | anaemia | creatinine_phosphokinase | diabetes | ejection_fraction | high_blood_pressure | platelets | serum_creatinine | serum_sodium | sex | smoking | time | DEATH_EVENT | death_event | |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
0 | 0 | 75.0 | no | 582 | no | 20 | yes | 265000.00 | 1.9 | 130 | yes | no | 4 | 1 | yes |
1 | 1 | 55.0 | no | 7861 | no | 38 | no | 263358.03 | 1.1 | 136 | yes | no | 6 | 1 | yes |
2 | 2 | 65.0 | no | 146 | no | 20 | no | 162000.00 | 1.3 | 129 | yes | yes | 7 | 1 | yes |
3 | 3 | 50.0 | yes | 111 | no | 20 | no | 210000.00 | 1.9 | 137 | yes | no | 7 | 1 | yes |
4 | 4 | 65.0 | yes | 160 | yes | 20 | no | 327000.00 | 2.7 | 116 | no | no | 8 | 1 | yes |
print('Classes and number of values in the dataset {}'.format(Counter(data.death_event)))
Classes and number of values in the dataset Counter({'no': 203, 'yes': 96})
y = data['death_event']
x = data[['age','anaemia','creatinine_phosphokinase','diabetes','ejection_fraction','high_blood_pressure','platelets','serum_creatinine','serum_sodium','sex','smoking','time']]
Converting the categorical features in the DataFrame instance x to one-hot encoding vectors and assign the result back to variable.
x = pd.get_dummies(x)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 7)
ct = ColumnTransformer([('StandardScale',
StandardScaler(),
['age','creatinine_phosphokinase','ejection_fraction','platelets','serum_creatinine','serum_sodium','time'])],
remainder = 'passthrough')
x_train = ct.fit_transform(x_train)
x_test = ct.transform(x_test)
le = LabelEncoder()
y_train = le.fit_transform(y_train.astype(str))
y_test = le.transform(y_test.astype(str))
y_train = to_categorical(y_train, dtype = 'int64')
y_test = to_categorical(y_test, dtype = 'int64')
model = Sequential()
model.add(InputLayer(x_train.shape[1],))
model.add(Dense(12, activation = 'relu'))
model.add(Dense(2, activation= 'softmax'))
model.compile(loss = 'categorical_crossentropy', metrics = ['accuracy'], optimizer = 'adam')
model.fit(x_train, y_train, verbose = 1, epochs = 100, batch_size = 16)
Epoch 1/100 14/14 [==============================] - 3s 5ms/step - loss: 0.8568 - accuracy: 0.4131 Epoch 2/100 14/14 [==============================] - 0s 2ms/step - loss: 0.8045 - accuracy: 0.3662 Epoch 3/100 14/14 [==============================] - 0s 2ms/step - loss: 0.7475 - accuracy: 0.5038 Epoch 4/100 14/14 [==============================] - 0s 2ms/step - loss: 0.6866 - accuracy: 0.5578 Epoch 5/100 14/14 [==============================] - 0s 2ms/step - loss: 0.6349 - accuracy: 0.6365 Epoch 6/100 14/14 [==============================] - 0s 2ms/step - loss: 0.5926 - accuracy: 0.7289 Epoch 7/100 14/14 [==============================] - 0s 2ms/step - loss: 0.5653 - accuracy: 0.7297 Epoch 8/100 14/14 [==============================] - 0s 2ms/step - loss: 0.5774 - accuracy: 0.7134 Epoch 9/100 14/14 [==============================] - 0s 2ms/step - loss: 0.5564 - accuracy: 0.7094 Epoch 10/100 14/14 [==============================] - 0s 2ms/step - loss: 0.5530 - accuracy: 0.7296 Epoch 11/100 14/14 [==============================] - 0s 2ms/step - loss: 0.5363 - accuracy: 0.7316 Epoch 12/100 14/14 [==============================] - 0s 2ms/step - loss: 0.5547 - accuracy: 0.7055 Epoch 13/100 14/14 [==============================] - 0s 2ms/step - loss: 0.5268 - accuracy: 0.7104 Epoch 14/100 14/14 [==============================] - 0s 2ms/step - loss: 0.5098 - accuracy: 0.7104 Epoch 15/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4718 - accuracy: 0.7784 Epoch 16/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4687 - accuracy: 0.7474 Epoch 17/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4808 - accuracy: 0.7601 Epoch 18/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4585 - accuracy: 0.7813 Epoch 19/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4716 - accuracy: 0.7698 Epoch 20/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4215 - accuracy: 0.8169 Epoch 21/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4664 - accuracy: 0.7671 Epoch 22/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4014 - accuracy: 0.8222 Epoch 23/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4256 - accuracy: 0.7901 Epoch 24/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4132 - accuracy: 0.8179 Epoch 25/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4537 - accuracy: 0.7910 Epoch 26/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4300 - accuracy: 0.8212 Epoch 27/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4394 - accuracy: 0.7945 Epoch 28/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4279 - accuracy: 0.8299 Epoch 29/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3922 - accuracy: 0.8499 Epoch 30/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4111 - accuracy: 0.8260 Epoch 31/100 14/14 [==============================] - 0s 3ms/step - loss: 0.4021 - accuracy: 0.8104 Epoch 32/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4060 - accuracy: 0.8113 Epoch 33/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3630 - accuracy: 0.8549 Epoch 34/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3888 - accuracy: 0.8365 Epoch 35/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3672 - accuracy: 0.8445 Epoch 36/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3830 - accuracy: 0.8413 Epoch 37/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3939 - accuracy: 0.8294 Epoch 38/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3623 - accuracy: 0.8562 Epoch 39/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3935 - accuracy: 0.8329 Epoch 40/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4085 - accuracy: 0.8304 Epoch 41/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4069 - accuracy: 0.8474 Epoch 42/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3703 - accuracy: 0.8500 Epoch 43/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3823 - accuracy: 0.8387 Epoch 44/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3388 - accuracy: 0.8666 Epoch 45/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4040 - accuracy: 0.8285 Epoch 46/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4011 - accuracy: 0.8240 Epoch 47/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4214 - accuracy: 0.8070 Epoch 48/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3899 - accuracy: 0.8218 Epoch 49/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3422 - accuracy: 0.8527 Epoch 50/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3856 - accuracy: 0.8219 Epoch 51/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3549 - accuracy: 0.8415 Epoch 52/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3775 - accuracy: 0.8235 Epoch 53/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3309 - accuracy: 0.8598 Epoch 54/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3605 - accuracy: 0.8426 Epoch 55/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3875 - accuracy: 0.8301 Epoch 56/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3333 - accuracy: 0.8592 Epoch 57/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3448 - accuracy: 0.8510 Epoch 58/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3918 - accuracy: 0.8212 Epoch 59/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3110 - accuracy: 0.8697 Epoch 60/100 14/14 [==============================] - 0s 3ms/step - loss: 0.3709 - accuracy: 0.8154 Epoch 61/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4028 - accuracy: 0.8130 Epoch 62/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4008 - accuracy: 0.8330 Epoch 63/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3796 - accuracy: 0.8356 Epoch 64/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3432 - accuracy: 0.8384 Epoch 65/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4035 - accuracy: 0.8283 Epoch 66/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3297 - accuracy: 0.8574 Epoch 67/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3617 - accuracy: 0.8498 Epoch 68/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3996 - accuracy: 0.8490 Epoch 69/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3419 - accuracy: 0.8334 Epoch 70/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3685 - accuracy: 0.8098 Epoch 71/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3147 - accuracy: 0.8460 Epoch 72/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3995 - accuracy: 0.8036 Epoch 73/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3508 - accuracy: 0.8522 Epoch 74/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3388 - accuracy: 0.8509 Epoch 75/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3774 - accuracy: 0.8170 Epoch 76/100 14/14 [==============================] - 0s 3ms/step - loss: 0.3662 - accuracy: 0.8310 Epoch 77/100 14/14 [==============================] - 0s 2ms/step - loss: 0.2946 - accuracy: 0.8679 Epoch 78/100 14/14 [==============================] - 0s 3ms/step - loss: 0.3442 - accuracy: 0.8535 Epoch 79/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3254 - accuracy: 0.8510 Epoch 80/100 14/14 [==============================] - 0s 2ms/step - loss: 0.4065 - accuracy: 0.8164 Epoch 81/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3753 - accuracy: 0.8318 Epoch 82/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3318 - accuracy: 0.8392 Epoch 83/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3680 - accuracy: 0.8325 Epoch 84/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3297 - accuracy: 0.8487 Epoch 85/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3667 - accuracy: 0.8252 Epoch 86/100 14/14 [==============================] - 0s 2ms/step - loss: 0.2975 - accuracy: 0.8791 Epoch 87/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3358 - accuracy: 0.8315 Epoch 88/100 14/14 [==============================] - 0s 3ms/step - loss: 0.3034 - accuracy: 0.8552 Epoch 89/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3199 - accuracy: 0.8585 Epoch 90/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3126 - accuracy: 0.8630 Epoch 91/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3417 - accuracy: 0.8669 Epoch 92/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3461 - accuracy: 0.8251 Epoch 93/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3073 - accuracy: 0.8711 Epoch 94/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3598 - accuracy: 0.8323 Epoch 95/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3737 - accuracy: 0.8119 Epoch 96/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3043 - accuracy: 0.8688 Epoch 97/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3351 - accuracy: 0.8512 Epoch 98/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3355 - accuracy: 0.8493 Epoch 99/100 14/14 [==============================] - 0s 2ms/step - loss: 0.2895 - accuracy: 0.8892 Epoch 100/100 14/14 [==============================] - 0s 2ms/step - loss: 0.3459 - accuracy: 0.8368
<tensorflow.python.keras.callbacks.History at 0x7fe48c72d650>
loss, accuracy = model.evaluate(x_test, y_test)
print('Model Loss: {} \nModel Accuracy: {}'.format(loss, accuracy))
3/3 [==============================] - 0s 4ms/step - loss: 0.3381 - accuracy: 0.8444 Model Loss: 0.3380567729473114 Model Accuracy: 0.8444444537162781
y_estimate = model.predict(x_test)
y_estimate = np.argmax(y_estimate, axis = 1)
y_true = np.argmax(y_test, axis = 1)
print(classification_report(y_true, y_estimate))
precision recall f1-score support 0 0.87 0.92 0.90 65 1 0.76 0.64 0.70 25 accuracy 0.84 90 macro avg 0.82 0.78 0.80 90 weighted avg 0.84 0.84 0.84 90