Test / app.py
Adrian8a's picture
Update app.py
dcbc5ea
from statistics import mode
from cProfile import label
from joblib import load
import matplotlib.pyplot as plt
import gradio as gr
import numpy as np
def getdata(Age,Sex,CP,Trtbps,Chol,Fbs,Restecg,Thalachh,Oldpeak,Slp,Caa,Thall,Exng):
if Sex == "Male":
Sex = 1
else:
Sex = 0
if CP == "Typical Angina":
CP = 0
elif CP == "Atypical Angina":
CP = 1
elif CP == "Non-anginal Pain":
CP = 2
else:
CP = 3
if Fbs == "True":
Fbs = 1
else:
Fbs = 0
if Restecg == "Normal":
Restecg = 0
elif Restecg == "ST-T wave normality":
Restecg = 1
else:
Restecg = 2
if Exng == "Yes":
Exng = 1
else:
Exng = 0
a = [Age,Sex,CP,Trtbps,Chol,Fbs,Restecg,Thalachh,Exng,Oldpeak,Slp,Caa,Thall]
arr = np.array([a])
return arr
def getfig(X_test):
X_pca = load('X_pca.data')
y = load('y.data')
pca = load('pca.dim')
u_pca = pca.transform(X_test)
fig = plt.figure(figsize=(5,4))
plt.scatter(X_pca[:, 0], X_pca[:, 1], c = y, cmap = plt.cm.Spectral, s = 10, label='More Chance AH')
plt.scatter(u_pca[:, 0], u_pca[:, 1], c = 'g', cmap = plt.cm.Spectral, s = 40)
plt.annotate('You', (u_pca[:, 0]+10, u_pca[:, 1]+5), bbox = dict(boxstyle="round",ec='g',fc='lightgreen'))
plt.title(f"PCA, Exp. Variance: {np.round(np.sum(pca.explained_variance_ratio_), 4)}")
plt.legend()
plt.xlabel("PC 1")
plt.ylabel("PC 2")
return fig
def greet(Age,Sex,CP,Trtbps,Chol,Fbs,Restecg,Thalachh,Oldpeak,Slp,Caa,Thall,Exng):
X_test = getdata(Age,Sex,CP,Trtbps,Chol,Fbs,Restecg,Thalachh,Oldpeak,Slp,Caa,Thall,Exng)
scaler = load('stdscaler.model')
x_std = scaler.transform(X_test)
log_reg = load('log_reg.model')
y_lr = log_reg.predict(x_std)
kmeans = load('kmeans.model')
y_km = kmeans.predict(x_std)
tree = load('tree.model')
y_tree = tree.predict(x_std)
nb = load('nb.model')
y_bayes = nb.predict(X_test)
forest = load('forest.model')
y_forest = forest.predict(X_test)
r = [y_lr[0], y_km[0], y_tree[0], y_bayes[0], y_forest[0]]
f = mode(r)
if f == 0:
x = "You have less chance of heart attack"
else:
x = "You have more chance of heart attack"
fig = load('dime.fig')
fig2 = getfig(X_test)
return x, fig, fig2
interface = gr.Interface(
title = "HeartAttack prediction - UMG <br> Project Coeur ❤",
description = "<h3>The idea is to classify between 0 = less chance of heart attack and 1 = more chance of heart attack, according to the data provided by the user.</h3>"+
"<b>Models:</b> Logistic Regression, K-means, Decision Trees, Naive Bayes and Random Forest"+
"<br><b>Metrics:</b> Accuracy: 0.82, Precision: 0.775, Recall: 0.939, F1 Score: 0.849 <br> <br><b>Please provide the requested data:</b>",
article='Step-by-step on GitHub <a href="https://github.com/Adrian8aS/Machine-Learning-App-Gradio/blob/21246d9ba87859e9068369b89d48b4c6ee13dfe5/Proyecto%20integrador.ipynb"> notebook </a> <br> ~ Project Coeur',
allow_flagging = "never",
fn = greet,
inputs = [
gr.Number(label="Age of the patient"),
gr.Radio(["Male", "Female"], label="Sex of the patient"),
gr.Radio(["Typical Angina", "Atypical Angina", "Non-anginal Pain", "Asymptomatic"], label="Chest pain type"),
gr.Number(label="Resting blood pressure (in mm Hg)"),
gr.Number(label="Cholestoral in mg/dl fetched via BMI sensor"),
gr.Radio(["True", "False"], label="Fasting blood sugar > 120 mg/dl"),
gr.Radio(["Normal", "ST-T wave normality", "Left ventricular hypertrophy"], label="Resting electrocardiographic results"),
gr.Number(label="Maximum heart rate achieved"),
gr.Number(label="Previous peak"),
gr.Radio([0, 1, 2], label="Slope"),
gr.Radio([0, 1, 2, 3, 4], label="Number of major vessels"),
gr.Radio([0, 1, 2, 3], label="Thalium Stress Test result"),
gr.Radio(["Yes", "No"], label="Exercise induced angina")
],
outputs = [gr.Text(label="Prediction"), 'plot', 'plot'],
examples = [[41,"Female","Typical Angina",130,204,"False","Normal",172,1.4,2,0,2,"No"],
[45,"Male","Non-anginal Pain",110,264,"False","ST-T wave normality",132,0.2,1,0,3,"No"]]
)
interface.launch(share = False)