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() | |