Download app.py from basaktamer/Predict_Calorie_Expenditure: direct link, hf CLI and curl.
- Browser
- Download file 2.69 kB
-
https://huggingface.co/spaces/basaktamer/Predict_Calorie_Expenditure/resolve/main/app.py
- Command line
-
hf download hf://spaces/basaktamer/Predict_Calorie_Expenditure/app.py
-
curl -L -o app.py https://huggingface.co/spaces/basaktamer/Predict_Calorie_Expenditure/resolve/main/app.py
2.69 kB
| import streamlit as st | |
| import pandas as pd | |
| import joblib | |
| import numpy as np | |
| # Set page configuration | |
| st.set_page_config(page_title="Calories Burned Predictor", layout="centered") | |
| # Load the model and assets using the established "pro" methods | |
| def load_assets(): | |
| # Loading the XGBRegressor saved with joblib | |
| model = joblib.load('calories_model.joblib') | |
| # Ensuring features match the exact training order | |
| features = joblib.load('features.pkl') | |
| # Manual mapping used to handle 8GB RAM constraints during training | |
| sex_mapping = {'female': 1, 'male': 0} | |
| return model, features, sex_mapping | |
| # Initialize assets | |
| try: | |
| model, expected_features, sex_mapping = load_assets() | |
| except Exception as e: | |
| st.error(f"Error loading model assets: {e}") | |
| st.stop() | |
| st.title("🔥 Calorie Expenditure Predictor") | |
| st.markdown("Predict calories burned during exercise using your high-precision XGBoost model.") | |
| # Create input form to batch interactions and prevent unnecessary re-runs | |
| with st.form("prediction_form"): | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| sex = st.selectbox("Sex", options=["female", "male"]) | |
| age = st.number_input("Age", min_value=1, max_value=100, value=25) | |
| height = st.number_input("Height (cm)", min_value=100.0, max_value=250.0, value=170.0) | |
| weight = st.number_input("Weight (kg)", min_value=30.0, max_value=200.0, value=70.0) | |
| with col2: | |
| duration = st.number_input("Duration (min)", min_value=1.0, max_value=180.0, value=30.0) | |
| heart_rate = st.number_input("Heart Rate", min_value=40.0, max_value=220.0, value=100.0) | |
| body_temp = st.number_input("Body Temperature (°C)", min_value=35.0, max_value=42.0, value=37.0) | |
| # Fixed the function name to streamlit's standard attribute | |
| submit = st.form_submit_button("Predict Calories") | |
| if submit: | |
| # Prepare the input dictionary matching the manual mapping | |
| input_dict = { | |
| 'Sex': sex_mapping[sex], | |
| 'Age': age, | |
| 'Height': height, | |
| 'Weight': weight, | |
| 'Duration': duration, | |
| 'Heart_Rate': heart_rate, | |
| 'Body_Temp': body_temp | |
| } | |
| # Convert to DataFrame and reorder columns to match 'features.pkl' | |
| input_df = pd.DataFrame([input_dict]) | |
| input_df = input_df[expected_features] | |
| # Run the prediction | |
| prediction = model.predict(input_df) | |
| # Apply np.clip logic to ensure outputs are compatible with MSLE metrics | |
| final_val = np.clip(prediction[0], 0, None) | |
| st.success(f"### Estimated Calories Burned: {final_val:.2f} kcal") | |
| st.info("Note: This model was built for the Kaggle S5E5 Playground Series.") |