Galle, LK--:--5/6 sites live

Multiple disease prediction system - heart

Diabetes model එකේම packaging pattern එක, heart disease එකට apply කරනවා — model එකක් deploy කරන්න දැනගත්තම, ඊළඟ එක deploy කරන එක බොහොම විට repetition එකක් කියලා ශක්තිමත් කරනවා.

The same packaging pattern as the diabetes model, applied to heart disease — reinforcing that once you know how to deploy one model, deploying the next is mostly repetition.

19 May 20266 min readSelf Guide · Stage 17#Shipping Models to the World#Multiple Disease Prediction System#Machine learning

Lesson 55 of 64 · Part 5 · Shipping Models to the World · Multiple Disease Prediction System · bilingual notes (English + සිංහල)

Why this matters. The same packaging pattern as the diabetes model, applied to heart disease — reinforcing that once you know how to deploy one model, deploying the next is mostly repetition.

සිංහලෙන්: Diabetes model එකේම packaging pattern එක, heart disease එකට apply කරනවා — model එකක් deploy කරන්න දැනගත්තම, ඊළඟ එක deploy කරන එක බොහොම විට repetition එකක් කියලා ශක්තිමත් කරනවා.

What you'll use this for. This is one of three disease modules that get combined into a single multi-disease app — each one independent, but sharing the exact same deployment skeleton.

සිංහලෙන්: Multi-disease app එකකට combine වෙන disease modules තුනෙන් එකක් තමයි මේක — එකිනෙක independent, ඒත් හැම එකකම එකම deployment skeleton එකයි.

Key principles

  • Reusable structure is what makes scaling to more diseases realistic. Because the loading, input, and prediction logic follow the same shape as the diabetes app, adding heart disease took far less new code than the first module did.
    Reusable structure එකයි, තව රෝග වලට scale කරන එක realistic කරන්නෙ

Walkthrough

Importing the Dependencies

ExamplePython
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

Data Collection and Processing

ExamplePython
# loading the csv data to a Pandas DataFrame
heart_data = pd.read_csv('/content/heart.csv')
ExamplePython
# print first 5 rows of the dataset
heart_data.head()
agesexcptrestbpscholfbsrestecg…
0631314523310…
1371213025001…
2410113020400…
3561112023601…
4570012035401…
ExamplePython
# print last 5 rows of the dataset
heart_data.tail()
agesexcptrestbpscholfbsrestecg…
298570014024101…
299451311026401…
300681014419311…
301571013013101…
302570113023600…
ExamplePython
# number of rows and columns in the dataset
heart_data.shape

Output

Output
(303, 14)
ExamplePython
# getting some info about the data
heart_data.info()

Output

Output
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 303 entries, 0 to 302
Data columns (total 14 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   age       303 non-null    int64  
 1   sex       303 non-null    int64  
 2   cp        303 non-null    int64  
 3   trestbps  303 non-null    int64  
 4   chol      303 non-null    int64  
 5   fbs       303 non-null    int64  
 6   restecg   303 non-null    int64  
 7   thalach   303 non-null    int64  
 8   exang     303 non-null    int64  
 9   oldpeak   303 non-null    float64
 10  slope     303 non-null    int64  
 11  ca        303 non-null    int64  
 12  thal      303 non-null    int64  
… (3 more lines)
ExamplePython
# checking for missing values
heart_data.isnull().sum()

Output

Output
age         0
sex         0
cp          0
trestbps    0
chol        0
fbs         0
restecg     0
thalach     0
exang       0
oldpeak     0
slope       0
ca          0
thal        0
target      0
dtype: int64
ExamplePython
# statistical measures about the data
heart_data.describe()
agesexcptrestbpscholfbsrestecg…
count303.000000303.000000303.000000303.000000303.000000303.000000303.000000…
mean54.3663370.6831680.966997131.623762246.2640260.1485150.528053…
std9.0821010.4660111.03205217.53814351.8307510.3561980.525860…
min29.0000000.0000000.00000094.000000126.0000000.0000000.000000…
25%47.5000000.0000000.000000120.000000211.0000000.0000000.000000…
50%55.0000001.0000001.000000130.000000240.0000000.0000001.000000…

… 2 more rows

ExamplePython
# checking the distribution of Target Variable
heart_data['target'].value_counts()

Output

Output
1    165
0    138
Name: target, dtype: int64

1 --> Defective Heart

0 --> Healthy Heart

Splitting the Features and Target

ExamplePython
X = heart_data.drop(columns='target', axis=1)
Y = heart_data['target']
ExamplePython
print(X)

Output

Output
     age  sex  cp  trestbps  chol  fbs  restecg  thalach  exang  oldpeak  \
0     63    1   3       145   233    1        0      150      0      2.3   
1     37    1   2       130   250    0        1      187      0      3.5   
2     41    0   1       130   204    0        0      172      0      1.4   
3     56    1   1       120   236    0        1      178      0      0.8   
4     57    0   0       120   354    0        1      163      1      0.6   
..   ...  ...  ..       ...   ...  ...      ...      ...    ...      ...   
298   57    0   0       140   241    0        1      123      1      0.2   
299   45    1   3       110   264    0        1      132      0      1.2   
300   68    1   0       144   193    1        1      141      0      3.4   
301   57    1   0       130   131    0        1      115      1      1.2   
302   57    0   1       130   236    0        0      174      0      0.0   

     slope  ca  thal  
0        0   0     1  
1        0   0     2  
2        2   0     2  
3        2   0     2  
… (9 more lines)
ExamplePython
print(Y)

Output

Output
0      1
1      1
2      1
3      1
4      1
      ..
298    0
299    0
300    0
301    0
302    0
Name: target, Length: 303, dtype: int64

Splitting the Data into Training data & Test Data

ExamplePython
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, stratify=Y, random_state=2)
ExamplePython
print(X.shape, X_train.shape, X_test.shape)

Output

Output
(303, 13) (242, 13) (61, 13)

Model Training

Logistic Regression

ExamplePython
model = LogisticRegression()
ExamplePython
# training the LogisticRegression model with Training data
model.fit(X_train, Y_train)

Output

Output
/usr/local/lib/python3.7/dist-packages/sklearn/linear_model/_logistic.py:818: ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.

Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG,

Output

Output
LogisticRegression()

Model Evaluation

Accuracy Score

ExamplePython
# accuracy on training data
X_train_prediction = model.predict(X_train)
training_data_accuracy = accuracy_score(X_train_prediction, Y_train)
ExamplePython
print('Accuracy on Training data : ', training_data_accuracy)

Output

Output
Accuracy on Training data :  0.8512396694214877
ExamplePython
# accuracy on test data
X_test_prediction = model.predict(X_test)
test_data_accuracy = accuracy_score(X_test_prediction, Y_test)
ExamplePython
print('Accuracy on Test data : ', test_data_accuracy)

Output

Output
Accuracy on Test data :  0.819672131147541

Building a Predictive System

ExamplePython
input_data = (62,0,0,140,268,0,0,160,0,3.6,0,2,2)

# change the input data to a numpy array
input_data_as_numpy_array= np.asarray(input_data)

# reshape the numpy array as we are predicting for only on instance
input_data_reshaped = input_data_as_numpy_array.reshape(1,-1)

prediction = model.predict(input_data_reshaped)
print(prediction)

if (prediction[0]== 0):
  print('The Person does not have a Heart Disease')
else:
  print('The Person has Heart Disease')

Output

Output
[0]
The Person does not have a Heart Disease

Output

Output
/usr/local/lib/python3.7/dist-packages/sklearn/base.py:451: UserWarning: X does not have valid feature names, but LogisticRegression was fitted with feature nam
  "X does not have valid feature names, but"

Saving the trained model

ExamplePython
import pickle
ExamplePython
filename = 'heart_disease_model.sav'
pickle.dump(model, open(filename, 'wb'))
ExamplePython
# loading the saved model
loaded_model = pickle.load(open('heart_disease_model.sav', 'rb'))
ExamplePython
for column in X.columns:
  print(column)

Output

Output
age
sex
cp
trestbps
chol
fbs
restecg
thalach
exang
oldpeak
slope
ca
thal

Keep going: ← Lesson 54 · Lesson 56 → · Track it in the Self Guide