File size: 2,691 Bytes
bbf8d61
 
 
 
 
 
 
 
1792cc3
bbf8d61
 
1792cc3
bbf8d61
1792cc3
bbf8d61
1792cc3
bbf8d61
 
 
1792cc3
 
 
 
 
 
bbf8d61
 
1792cc3
bbf8d61
1792cc3
bbf8d61
 
 
 
 
 
 
 
 
 
 
 
 
 
1792cc3
 
bbf8d61
 
1792cc3
bbf8d61
 
 
 
 
 
 
 
 
 
1792cc3
bbf8d61
 
 
1792cc3
bbf8d61
 
1792cc3
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
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
@st.cache_resource
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.")