Spaces:
Sleeping
Sleeping
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
from sklearn.ensemble import RandomForestClassifier, VotingClassifier | |
from sklearn.tree import DecisionTreeClassifier | |
from sklearn.linear_model import LogisticRegression | |
from sklearn.neighbors import KNeighborsClassifier | |
from sklearn.svm import SVC | |
from sklearn.naive_bayes import GaussianNB | |
from sklearn.neural_network import MLPClassifier | |
from sklearn.ensemble import GradientBoostingClassifier | |
from sklearn.model_selection import train_test_split | |
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score | |
from sklearn.multioutput import MultiOutputClassifier | |
st.title('Disease Prediction Application') | |
st.write(''' | |
Please fill in the attributes below, then hit the Predict button | |
to get your results. | |
''') | |
st.header('General Information') | |
gen = st.radio("Your Gender", ('Male', 'Female')) | |
st.write(''' ''') | |
age = st.slider('Your Age (Years)', min_value=0.0, max_value=100.0, value=50.0, step=1.0) | |
st.write(''' ''') | |
bmi = st.slider('BMI', min_value=0.0, max_value=50.0, value=25.0, step=0.1) | |
st.write(''' ''') | |
st.header('Blood Test Information') | |
bs = st.radio("Is Your Fasting Blood Sugar > 120 mg/dl?", ('Yes', 'No')) | |
st.write(''' ''') | |
urea = st.slider('Urea', min_value=0.0, max_value=100.0, value=50.0, step=0.1) | |
st.write(''' ''') | |
cr = st.slider('Creatinine Ratio(Cr)', min_value=0.0, max_value=1000.0, value=500.0, step=1.0) | |
st.write(''' ''') | |
hb = st.slider('HbA1c', min_value=0.0, max_value=20.0, value=10.0, step=0.1) | |
st.write(''' ''') | |
st.header('Cholesterol Test Information') | |
chol = st.slider('Cholesterol (Chol)', min_value=0.0, max_value=20.0, value=10.0, step=0.1) | |
st.write(''' ''') | |
tg = st.slider('Triglycerides(TG) Cholesterol', min_value=0.0, max_value=20.0, value=10.0, step=0.1) | |
st.write(''' ''') | |
hdl = st.slider('HDL Cholesterol', min_value=0.0, max_value=20.0, value=10.0, step=0.1) | |
st.write(''' ''') | |
ldl = st.slider('LDL Cholesterol', min_value=0.0, max_value=20.0, value=10.0, step=0.1) | |
st.write(''' ''') | |
vldl = st.slider('VLDL Cholesterol', min_value=0.0, max_value=50.0, value=25.0, step=0.1) | |
st.write(''' ''') | |
st.header('Cardio Test Information') | |
cp = st.radio("Chest Pain", ('Typical Angina', 'Atypical Angina', 'Non-Anginal Pain', 'Asymptomatic')) | |
st.write(''' ''') | |
max_heart = st.slider('Maximum Heart Rate', min_value=0.0, max_value=300.0, value=150.0, step=1.0) | |
st.write(''' ''') | |
resting_bp = st.slider('Resting Blood Pressure (In mm Hg)', min_value=0.0, max_value=200.0, value=100.0, step=1.0) | |
st.write(''' ''') | |
re = st.radio("Resting Electrocardiogram Results", ( | |
'Normal', 'ST-T Wave Abnormality (T Wave Inversions and/or ST Elevation or Depression of > 0.05 mV)', | |
'Showing Probable or Definite Left Ventricular Hypertrophy by Estes Criteria')) | |
st.write(''' ''') | |
ex = st.radio("Exercise Induced Angina", ('Yes', 'No')) | |
st.write(''' ''') | |
oldpeak = st.slider('ST Depression Induced by Exercise Relative to Rest', min_value=-5.0, max_value=5.0, value=0.0, | |
step=0.01) | |
st.write(''' ''') | |
sp = st.radio("The Slope of the Peak Exercise ST Segment", ('Upsloping', 'Flat', 'Downsloping')) | |
st.write(''' ''') | |
# gender conversion | |
if gen == "Male": | |
gender = 1 | |
else: | |
gender = 0 | |
# Chest Pain | |
if cp == "Typical Angina": | |
chest = 1 | |
elif cp == "Atypical Angina": | |
chest = 2 | |
elif cp == "Non-Anginal Pain": | |
chest = 3 | |
else: | |
chest = 4 | |
# blood_sugar conversion | |
if bs == "Yes": | |
blood_sugar = 1 | |
else: | |
blood_sugar = 0 | |
# electro conversion | |
if re == "Normal": | |
electro = 0 | |
elif re == "ST-T Wave Abnormality (T Wave Inversions and/or ST Elevation or Depression of > 0.05 mV)": | |
electro = 1 | |
else: | |
electro = 2 | |
# exercise conversion | |
if ex == "Yes": | |
exercise = 1 | |
else: | |
exercise = 0 | |
# slope conversion | |
if sp == "Upsloping": | |
slope = 1 | |
elif sp == "Flat": | |
slope = 2 | |
else: | |
slope = 3 | |
user_input = np.array([age, gender, chest, blood_sugar, resting_bp, electro, max_heart, | |
exercise, oldpeak, slope, urea, cr, hb, chol, tg, hdl, ldl, vldl, bmi]).reshape(1, -1) | |
# import dataset | |
def get_dataset(): | |
data = pd.read_csv('Final Dataset.csv') | |
# Calculate the correlation matrix | |
# corr_matrix = data.corr() | |
# Create a heatmap of the correlation matrix | |
# plt.figure(figsize=(10, 8)) | |
# sns.heatmap(corr_matrix, annot=True, cmap='coolwarm') | |
# plt.title('Correlation Matrix') | |
# plt.xticks(rotation=45) | |
# plt.yticks(rotation=0) | |
# plt.tight_layout() | |
# Display the heatmap in Streamlit | |
# st.pyplot() | |
return data | |
if st.button('Submit'): | |
# Load your dataset for prediction | |
df = get_dataset() | |
# Create an ensemble model with 'Random Forest', 'Naive Bayes', and 'Gradient Boosting' | |
random_forest_model = RandomForestClassifier(random_state=101) | |
naive_bayes_model = GaussianNB() | |
gradient_boosting_model = GradientBoostingClassifier(random_state=42) | |
# Create a voting ensemble with soft voting | |
ensemble_model = VotingClassifier(estimators=[ | |
('Random Forest', random_forest_model), | |
('Naive Bayes', naive_bayes_model), | |
('Gradient Boosting', gradient_boosting_model) | |
], voting='soft') | |
# Split the dataset into features and targets for Heart and Diabetes prediction | |
X = df.drop(['Diabetes', 'Heart'], axis=1) | |
y_heart = df['Heart'] | |
y_diabetes = df['Diabetes'] | |
# Fit the ensemble model on the entire dataset for Heart Disease prediction | |
ensemble_model.fit(X, y_heart) | |
# Make predictions on user input for Heart Disease | |
prediction_heart = ensemble_model.predict(user_input) | |
prediction_proba_heart = ensemble_model.predict_proba(user_input) | |
# You can add a threshold and provide a prediction based on class 1 for Heart Disease | |
threshold_heart = 0.5 | |
if prediction_proba_heart[0][1] >= threshold_heart: | |
st.header("Predicted Heart Disease: You might have Heart Disease") | |
st.write("Predicted Probability of Having Heart Disease:", prediction_proba_heart[0][1] * 100) | |
else: | |
st.header("Predicted Heart Disease: You do not have Heart Disease") | |
st.write("Predicted Probability of Having Heart Disease:", prediction_proba_heart[0][1] * 100) | |
# Calculate and display evaluation metrics for Heart Disease prediction | |
accuracy_heart = accuracy_score(y_heart, ensemble_model.predict(X)) | |
precision_heart = precision_score(y_heart, ensemble_model.predict(X)) | |
recall_heart = recall_score(y_heart, ensemble_model.predict(X)) | |
f1_heart = f1_score(y_heart, ensemble_model.predict(X)) | |
st.header("Heart Disease Prediction Metrics:") | |
st.write("Accuracy:", accuracy_heart) | |
st.write("Precision:", precision_heart) | |
st.write("Recall:", recall_heart) | |
st.write("F1-score:", f1_heart) | |
# Fit the ensemble model on the entire dataset for Diabetes prediction | |
ensemble_model.fit(X, y_diabetes) | |
# Make predictions on user input for Diabetes | |
pred_diabetes = ensemble_model.predict(user_input) | |
pred_diabetes_proba = ensemble_model.predict_proba(user_input) | |
# You can add a threshold and provide a prediction based on class 1 for Diabetes | |
threshold_diabetes = 0.5 | |
if pred_diabetes_proba[0][1] >= threshold_diabetes: | |
st.header("Predicted Diabetes: You might have Diabetes") | |
st.write("Predicted Probability of Having Diabetes:", pred_diabetes_proba[0][1] * 100) | |
else: | |
st.header("Predicted Diabetes: You do not have Diabetes") | |
st.write("Predicted Probability of Having Diabetes:", pred_diabetes_proba[0][1] * 100) | |
# Calculate and display evaluation metrics for Diabetes prediction | |
accuracy_diabetes = accuracy_score(y_diabetes, ensemble_model.predict(X)) | |
precision_diabetes = precision_score(y_diabetes, ensemble_model.predict(X)) | |
recall_diabetes = recall_score(y_diabetes, ensemble_model.predict(X)) | |
f1_diabetes = f1_score(y_diabetes, ensemble_model.predict(X)) | |
st.header("Diabetes Prediction Metrics:") | |
st.write("Accuracy:", accuracy_diabetes) | |
st.write("Precision:", precision_diabetes) | |
st.write("Recall:", recall_diabetes) | |
st.write("F1-score:", f1_diabetes) | |