Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import pandas as pd | |
| import numpy as np | |
| import joblib | |
| st.set_page_config( | |
| page_title="Obesity Risk Prediction", | |
| page_icon="🏥", | |
| layout="centered") | |
| def load_assets(): | |
| try: | |
| return joblib.load('src/model.pkl') | |
| except FileNotFoundError: | |
| st.error("Model file not found. Please upload it to the Files section.") | |
| return None | |
| assets = load_assets() | |
| if assets: | |
| model = assets['model'] | |
| encoders = assets['encoders'] | |
| target_encoder = assets['target_encoder'] | |
| st.title("🏥 Obesity Risk Level Prediction") | |
| st.markdown(""" | |
| This application predicts the obesity risk level based on physical and behavioral habits. | |
| """) | |
| st.divider() | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| st.subheader("Personal Information") | |
| gender = st.selectbox("Gender", ["Male", "Female"]) | |
| age = st.number_input("Age", min_value=10, max_value=80, value=25) | |
| height = st.number_input("Height (meters)", min_value=1.00, max_value=2.30, value=1.70, step=0.01) | |
| weight = st.number_input("Weight (kg)", min_value=30.0, max_value=200.0, value=70.0, step=0.1) | |
| family_history = st.selectbox("Family History with Overweight", ["yes", "no"]) | |
| st.subheader("Eating Habits") | |
| favc = st.selectbox("Frequent consumption of high caloric food (FAVC)", ["yes", "no"]) | |
| fcvc = st.slider("Frequency of consumption of vegetables (FCVC)", 1.0, 3.0, 2.0, help="1: Never, 2: Sometimes, 3: Always") | |
| ncp = st.slider("Number of main meals (NCP)", 1.0, 4.0, 3.0) | |
| caec = st.selectbox("Consumption of food between meals (CAEC)", ["no", "Sometimes", "Frequently", "Always"]) | |
| with col2: | |
| st.subheader("Lifestyle & Activity") | |
| smoke = st.selectbox("Do you smoke? (SMOKE)", ["yes", "no"]) | |
| ch2o = st.slider("Consumption of water daily (CH2O) (Liters)", 1.0, 3.0, 2.0) | |
| scc = st.selectbox("Calories consumption monitoring (SCC)", ["yes", "no"]) | |
| faf = st.slider("Physical activity frequency (FAF)", 0.0, 3.0, 1.0, help="0: None, 1: 1-2 days, 2: 2-4 days, 3: 4+ days") | |
| tue = st.slider("Time using technology devices (TUE)", 0.0, 2.0, 1.0, help="0: 0-2 hours, 1: 3-5 hours, 2: >5 hours") | |
| calc = st.selectbox("Consumption of alcohol (CALC)", ["no", "Sometimes", "Frequently", "Always"]) | |
| mtrans = st.selectbox("Transportation used (MTRANS)", ["Public_Transportation", "Walking", "Automobile", "Motorbike", "Bike"]) | |
| if st.button("Predict Obesity Risk", type="primary"): | |
| input_data = pd.DataFrame({ | |
| 'Gender': [gender], | |
| 'Age': [age], | |
| 'Height': [height], | |
| 'Weight': [weight], | |
| 'family_history_with_overweight': [family_history], | |
| 'FAVC': [favc], | |
| 'FCVC': [fcvc], | |
| 'NCP': [ncp], | |
| 'CAEC': [caec], | |
| 'SMOKE': [smoke], | |
| 'CH2O': [ch2o], | |
| 'SCC': [scc], | |
| 'FAF': [faf], | |
| 'TUE': [tue], | |
| 'CALC': [calc], | |
| 'MTRANS': [mtrans] | |
| }) | |
| input_data['BMI'] = input_data['Weight'] / (input_data['Height'] ** 2) | |
| input_data['BMI_2'] = input_data['BMI'] ** 2 | |
| input_data['Age'] = input_data['Age'].round().astype(int) | |
| input_data['IsYoung'] = input_data['Age'].apply(lambda x: 1 if x < 25 else 0) | |
| input_data['IsAging'] = input_data['Age'].apply(lambda x: 1 if 25 <= x < 40 else 0) | |
| input_data['IsOld'] = input_data['Age'].apply(lambda x: 1 if 40 <= x <= 61 else 0) | |
| bmi_bool_str = (input_data['BMI'] > 25).astype(str) | |
| age_bool_str = (input_data['Age'] > 30).astype(str) | |
| input_data['Family_BMI_Interaction'] = input_data['family_history_with_overweight'].astype(str) + "_" + bmi_bool_str | |
| input_data['Gender_Age_Interaction'] = input_data['Gender'].astype(str) + "_" + age_bool_str | |
| integer_cols = ['FCVC', 'NCP', 'CH2O', 'FAF', 'TUE'] | |
| for col in integer_cols: | |
| input_data[col] = input_data[col].round().astype(int) | |
| categorical_cols = ['Gender', 'family_history_with_overweight', 'FAVC', 'CAEC', 'SMOKE', 'SCC', 'CALC', 'MTRANS', | |
| 'Family_BMI_Interaction', 'Gender_Age_Interaction'] | |
| try: | |
| for col in categorical_cols: | |
| le = encoders[col] | |
| input_data[col] = le.transform(input_data[col]) | |
| prediction_idx = model.predict(input_data)[0] | |
| prediction_label = target_encoder.inverse_transform([prediction_idx])[0] | |
| formatted_label = prediction_label.replace("_", " ") | |
| st.success(f"Prediction: **{formatted_label}**") | |
| bmi_val = input_data['BMI'].values[0] | |
| st.info(f"Calculated BMI: {bmi_val:.2f}") | |
| if "Obesity" in formatted_label: | |
| st.warning("⚠️ High risk detected. Consider consulting a specialist.") | |
| elif "Overweight" in formatted_label: | |
| st.warning("⚠️ Moderate risk detected.") | |
| else: | |
| st.success("✅ Weight is within or near normal range.") | |
| except Exception as e: | |
| st.error(f"An error occurred during processing: {e}") |