CoolFace
Apppublic

AkramAzman/MaternalHealthRisk

sourceHugging Faceupdated 1y agoView on Hugging Face
0likes
app.py266 linesDownload Raw Back to root
1#!/usr/bin/env python2# coding: utf-83 4# In[14]:5 6 7import pandas as pd8import numpy as np9import matplotlib.pyplot as plt10import seaborn as sns11import joblib12import gradio as gr13 14from sklearn.model_selection import train_test_split15from sklearn.preprocessing import LabelEncoder, StandardScaler16from sklearn.ensemble import RandomForestClassifier17from sklearn.linear_model import LogisticRegression18from sklearn.metrics import confusion_matrix, classification_report19 20 21# In[15]:22 23 24# 1. Load and preprocess data25 26df = pd.read_csv("Maternal Health Risk Data Set.csv")27df28 29 30# In[16]:31 32 33df.info()34 35 36# In[17]:37 38 39df.describe()40 41 42# In[18]:43 44 45sns.set(style="whitegrid")46 47# --- 1. Distribution of Numerical Features48numeric_cols = df.select_dtypes(include='number').columns49for col in numeric_cols:50    plt.figure(figsize=(6, 4))51    sns.histplot(df[col], kde=True, bins=20)52    plt.title(f"Distribution of {col}")53    plt.xlabel(col)54    plt.ylabel("Frequency")55    plt.tight_layout()56    plt.show()57 58 59# In[19]:60 61 62# --- 2. Correlation Heatmap63plt.figure(figsize=(8, 6))64corr = df[numeric_cols].corr()65sns.heatmap(corr, annot=True, cmap="coolwarm", fmt=".2f")66plt.title("Feature Correlation Heatmap")67plt.tight_layout()68plt.show()69 70 71# In[20]:72 73 74# --- 3. Target Distribution (RiskLevel)75plt.figure(figsize=(6, 4))76sns.countplot(data=df, x="RiskLevel", palette="Set2")77plt.title("Target Class Distribution (RiskLevel)")78plt.ylabel("Count")79plt.tight_layout()80plt.show()81 82 83# In[21]:84 85 86# --- 4. Boxplots for RiskLevel vs Features87for col in numeric_cols:88    if col != "RiskLevel":89        plt.figure(figsize=(6, 4))90        sns.boxplot(data=df, x="RiskLevel", y=col, palette="pastel")91        plt.title(f"{col} by RiskLevel")92        plt.tight_layout()93        plt.show()94 95 96# In[5]:97 98 99# 3. DESCRIPTIVE ANALYSIS100 101print("\nDescriptive Statistics:\n", df.describe())102print("\nMissing Values:\n", df.isnull().sum())103 104 105# In[6]:106 107 108# 4. HANDLE MISSING VALUES109 110df.fillna(df.median(numeric_only=True), inplace=True)111 112 113# In[7]:114 115 116# 5. ENCODE TARGET LABEL117 118label_encoder = LabelEncoder()119df['RiskLevel'] = label_encoder.fit_transform(df['RiskLevel'])120# Mapping: {'high risk': 0, 'low risk': 1, 'mid risk': 2}121 122 123# In[8]:124 125 126# 6. SPLIT FEATURES AND TARGET127 128X = df.drop('RiskLevel', axis=1)129y = df['RiskLevel']130 131 132# In[9]:133 134 135# 7. TRAIN/TEST SPLIT + SCALING136 137X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)138 139scaler = StandardScaler()140X_train_scaled = scaler.fit_transform(X_train)141X_test_scaled = scaler.transform(X_test)142 143 144# In[10]:145 146 147# 8. TWO ALGORITHMS148 149# Model 1: Random Forest150rf_model = RandomForestClassifier(random_state=42)151rf_model.fit(X_train_scaled, y_train)152 153# Model 2: Logistic Regression154lr_model = LogisticRegression(max_iter=1000)155lr_model.fit(X_train_scaled, y_train)156 157 158# In[22]:159 160 161# 9. PERFORMANCE EVALUATION (CONFUSION MATRIX)162 163# Random Forest164rf_pred = rf_model.predict(X_test_scaled)165rf_cm = confusion_matrix(y_test, rf_pred)166print("\nRandom Forest Confusion Matrix:\n", rf_cm)167print("\nRandom Forest Classification Report:\n", classification_report(y_test, rf_pred))168 169# Logistic Regression170lr_pred = lr_model.predict(X_test_scaled)171lr_cm = confusion_matrix(y_test, lr_pred)172print("\nLogistic Regression Confusion Matrix:\n", lr_cm)173print("\nLogistic Regression Classification Report:\n", classification_report(y_test, lr_pred))174 175# Manual Confusion Matrix Calculation (for Class 0)176tp_rf = rf_cm[0][0]177fp_rf = rf_cm[:, 0].sum() - tp_rf178fn_rf = rf_cm[0].sum() - tp_rf179tn_rf = rf_cm.sum() - (tp_rf + fp_rf + fn_rf)180print(f"\nRandom Forest Class 0: TP={tp_rf}, FP={fp_rf}, FN={fn_rf}, TN={tn_rf}")181 182 183# In[23]:184 185 186# 10. FEATURE SELECTION187 188# Random Forest Importance189rf_importance = pd.Series(rf_model.feature_importances_, index=X.columns)190print("\nRandom Forest Top Feature:\n", rf_importance.sort_values(ascending=False).head(1))191 192# Logistic Regression Coefficients193lr_coeff = pd.Series(abs(lr_model.coef_[0]), index=X.columns)194print("\nLogistic Regression Top Feature:\n", lr_coeff.sort_values(ascending=False).head(1))195 196 197# In[24]:198 199 200# 11. MODEL SELECTION & EXPORT201 202# Random Forest chosen for deployment203model_bundle = {204    "model": rf_model,205    "scaler": scaler206}207joblib.dump(model_bundle, "MaternalHealthRisk.pkl")208 209 210# In[25]:211 212 213# 12. GRADIO PREDICTION FUNCTION214 215def predict_risk(age, systolic, diastolic, bs, body_temp, hr):216    # Load model and scaler217    data = joblib.load("MaternalHealthRisk.pkl")218    model = data["model"]219    scaler = data["scaler"]220 221    # Input preprocessing222    input_array = np.array([[age, systolic, diastolic, bs, body_temp, hr]])223    scaled_input = scaler.transform(input_array)224 225    # Prediction226    prediction = model.predict(scaled_input)[0]227    risk_map = {0: "High Risk", 1: "Low Risk", 2: "Mid Risk"}228    return f"Predicted Maternal Health Risk: {risk_map[prediction]}"229 230 231# In[26]:232 233 234# 13. GRADIO INTERFACE235 236gr_interface = gr.Interface(237    fn=predict_risk,238    inputs=[239        gr.Number(label="Age", value=30, minimum=10, maximum=100),240        gr.Number(label="Systolic BP (mm Hg)", value=120),241        gr.Number(label="Diastolic BP (mm Hg)", value=80),242        gr.Number(label="Blood Sugar (mmol/L)", value=5.5),243        gr.Number(label="Body Temperature (°C)", value=36.5),244        gr.Number(label="Heart Rate (bpm)", value=75)245    ],246    outputs="text",247    title="🤰 Maternal Health Risk Predictor",248    description="Enter health readings to predict risk level using a trained Random Forest model."249)250 251 252# In[27]:253 254 255# 14. LAUNCH GRADIO APP256 257if __name__ == "__main__":258    gr_interface.launch()259 260 261# In[ ]:262 263 264 265 266