Spaces:
Sleeping
Sleeping
#!/usr/bin/env python3 | |
""" | |
Streamlit App for Tourism Package Prediction | |
""" | |
import streamlit as st | |
import pandas as pd | |
import numpy as np | |
import joblib | |
from huggingface_hub import hf_hub_download | |
# Page configuration | |
st.set_page_config( | |
page_title="Tourism Package Prediction", | |
page_icon="🏖️", | |
layout="wide", | |
initial_sidebar_state="expanded" | |
) | |
def load_model(): | |
"""Load the trained model from HuggingFace Hub""" | |
try: | |
model_path = hf_hub_download( | |
repo_id="abhishek-kumar/tourism-package-prediction-model", | |
filename="best_model.joblib" | |
) | |
model = joblib.load(model_path) | |
return model | |
except Exception as e: | |
st.error(f"Error loading model: {e}") | |
return None | |
def prepare_input_data(age, gender, marital_status, city_tier, type_of_contact, | |
occupation, designation, monthly_income, num_person_visiting, | |
num_children_visiting, preferred_property_star, num_trips, | |
passport, own_car, duration_of_pitch, product_pitched, | |
num_followups, pitch_satisfaction_score): | |
"""Prepare input data for model prediction""" | |
# Create mapping dictionaries | |
gender_map = {"Male": 1, "Female": 0} | |
marital_map = {"Single": 2, "Married": 1, "Divorced": 0, "Unmarried": 3} | |
contact_map = {"Self Enquiry": 1, "Company Invited": 0} | |
occupation_map = {"Salaried": 2, "Small Business": 1, "Free Lancer": 0} | |
designation_map = {"Executive": 0, "Manager": 1, "Senior Manager": 2, "AVP": 3, "VP": 4} | |
product_map = {"Basic": 0, "Standard": 1, "Deluxe": 2, "Super Deluxe": 3} | |
passport_map = {"Yes": 1, "No": 0} | |
car_map = {"Yes": 1, "No": 0} | |
# Feature engineering (matching training data encoding) | |
if monthly_income <= 15000: | |
income_category = 0 # Low | |
elif monthly_income <= 25000: | |
income_category = 1 # Medium | |
elif monthly_income <= 35000: | |
income_category = 2 # High | |
else: | |
income_category = 3 # Very High | |
if age <= 25: | |
age_group = 0 # Young | |
elif age <= 35: | |
age_group = 1 # Adult | |
elif age <= 45: | |
age_group = 2 # Middle-aged | |
elif age <= 55: | |
age_group = 3 # Senior | |
else: | |
age_group = 4 # Elderly | |
# Create input array | |
input_array = np.array([[ | |
age, contact_map[type_of_contact], city_tier, duration_of_pitch, | |
occupation_map[occupation], gender_map[gender], num_person_visiting, | |
num_followups, product_map[product_pitched], preferred_property_star, | |
marital_map[marital_status], num_trips, passport_map[passport], | |
pitch_satisfaction_score, car_map[own_car], num_children_visiting, | |
designation_map[designation], monthly_income, income_category, age_group | |
]]) | |
return input_array | |
def main(): | |
"""Main Streamlit app""" | |
st.title("Tourism Package Prediction") | |
st.markdown("### Predict Customer Purchase Likelihood for Wellness Tourism Package") | |
st.markdown("---") | |
# Load model | |
model = load_model() | |
if model is None: | |
st.error("Failed to load the prediction model.") | |
return | |
# Sidebar inputs | |
st.sidebar.header("Customer Information") | |
# Demographics | |
st.sidebar.subheader("Demographics") | |
age = st.sidebar.slider("Age", 18, 80, 35) | |
gender = st.sidebar.selectbox("Gender", ["Male", "Female"]) | |
marital_status = st.sidebar.selectbox("Marital Status", ["Single", "Married", "Divorced", "Unmarried"]) | |
# Location & Contact | |
st.sidebar.subheader("Location & Contact") | |
city_tier = st.sidebar.selectbox("City Tier", [1, 2, 3]) | |
type_of_contact = st.sidebar.selectbox("Type of Contact", ["Self Enquiry", "Company Invited"]) | |
# Professional Info | |
st.sidebar.subheader("Professional Info") | |
occupation = st.sidebar.selectbox("Occupation", ["Salaried", "Small Business", "Free Lancer"]) | |
designation = st.sidebar.selectbox("Designation", ["Executive", "Manager", "Senior Manager", "AVP", "VP"]) | |
monthly_income = st.sidebar.number_input("Monthly Income", 10000, 50000, 20000) | |
# Travel Preferences | |
st.sidebar.subheader("Travel Preferences") | |
num_person_visiting = st.sidebar.slider("Number of Persons Visiting", 1, 5, 2) | |
num_children_visiting = st.sidebar.slider("Number of Children Visiting", 0, 3, 0) | |
preferred_property_star = st.sidebar.slider("Preferred Property Star Rating", 1.0, 5.0, 3.0, 0.5) | |
num_trips = st.sidebar.slider("Number of Trips per Year", 0.0, 10.0, 2.0, 0.5) | |
# Additional Info | |
st.sidebar.subheader("Additional Info") | |
passport = st.sidebar.selectbox("Has Passport", ["Yes", "No"]) | |
own_car = st.sidebar.selectbox("Owns Car", ["Yes", "No"]) | |
# Sales Interaction | |
st.sidebar.subheader("Sales Interaction") | |
duration_of_pitch = st.sidebar.slider("Duration of Pitch (minutes)", 5, 60, 15) | |
product_pitched = st.sidebar.selectbox("Product Pitched", ["Basic", "Standard", "Deluxe", "Super Deluxe"]) | |
num_followups = st.sidebar.slider("Number of Followups", 0.0, 6.0, 3.0, 0.5) | |
pitch_satisfaction_score = st.sidebar.slider("Pitch Satisfaction Score", 1, 5, 3) | |
# Main content | |
col1, col2 = st.columns([2, 1]) | |
with col1: | |
st.subheader("Customer Profile Summary") | |
profile_data = { | |
"Age": age, | |
"Gender": gender, | |
"Marital Status": marital_status, | |
"City Tier": city_tier, | |
"Occupation": occupation, | |
"Monthly Income": f"₹{monthly_income:,}", | |
"Number of Persons": num_person_visiting, | |
"Preferred Star Rating": preferred_property_star, | |
"Annual Trips": num_trips, | |
"Has Passport": passport, | |
"Owns Car": own_car | |
} | |
for key, value in profile_data.items(): | |
st.write(f"**{key}:** {value}") | |
with col2: | |
st.subheader("Prediction") | |
if st.button("Predict Purchase Likelihood", type="primary"): | |
input_data = prepare_input_data( | |
age, gender, marital_status, city_tier, type_of_contact, | |
occupation, designation, monthly_income, num_person_visiting, | |
num_children_visiting, preferred_property_star, num_trips, | |
passport, own_car, duration_of_pitch, product_pitched, | |
num_followups, pitch_satisfaction_score | |
) | |
try: | |
prediction = model.predict(input_data)[0] | |
prediction_proba = model.predict_proba(input_data)[0] | |
if prediction == 1: | |
st.success("High likelihood of purchase!") | |
st.write(f"**Confidence:** {prediction_proba[1]:.2%}") | |
st.balloons() | |
else: | |
st.warning("Low likelihood of purchase") | |
st.write(f"**Confidence:** {prediction_proba[0]:.2%}") | |
# Probability breakdown | |
st.subheader("Probability Breakdown") | |
prob_df = pd.DataFrame({ | |
'Outcome': ['Will Not Purchase', 'Will Purchase'], | |
'Probability': [prediction_proba[0], prediction_proba[1]] | |
}) | |
st.bar_chart(prob_df.set_index('Outcome')) | |
except Exception as e: | |
st.error(f"Prediction error: {e}") | |
st.markdown("---") | |
st.markdown("### About This Model") | |
st.info(""" | |
This ML model predicts customer purchase likelihood for the Wellness Tourism Package | |
based on demographics, travel preferences, and sales interaction data. | |
""") | |
if __name__ == "__main__": | |
main() | |