Spaces:
Sleeping
Sleeping
| import streamlit as st | |
| import pandas as pd | |
| from huggingface_hub import hf_hub_download | |
| import joblib | |
| # Download and load the model from Hugging Face Hub. | |
| # The model will be used for making predictions in the Streamlit app. | |
| model_path = hf_hub_download(repo_id="Garg06/Tourism-Package-Model", filename="best_machine_failure_model_v1.joblib") | |
| model = joblib.load(model_path) | |
| # Set the title and description for the Streamlit web application. | |
| st.title("Tourism Package Prediction App") | |
| st.write(""" | |
| This application predicts whether a customer will purchase the newly introduced Wellness Tourism Package. | |
| Please enter the customer details and interaction data below to get a prediction. | |
| """) | |
| # User input fields for customer details, organized under a header. | |
| st.header("Customer Details") | |
| # Numerical input for Age, with defined min/max values and a default. | |
| age = st.number_input("Age", min_value=18, max_value=90, value=30) | |
| # Dropdown for Type of Contact, with string options. | |
| typeofcontact = st.selectbox("Type of Contact", options=['Company Invited', 'Self Inquiry']) | |
| # Numerical input for City Tier. | |
| citytier = st.number_input("City Tier (1, 2, or 3)", min_value=1, max_value=3, value=1) | |
| # Dropdown for Occupation. | |
| occupation = st.selectbox("Occupation", options=['Freelancer', 'Large Business', 'Salaried', 'Small Business', 'Unemployed']) | |
| # Dropdown for Gender. | |
| gender = st.selectbox("Gender", options=['Female', 'Male']) | |
| # Numerical input for Number of Persons Visiting. | |
| numberofpersonvisiting = st.number_input("Number of Persons Visiting", min_value=1, max_value=10, value=1) | |
| # Numerical input for Preferred Property Star rating. | |
| preferredpropertystar = st.number_input("Preferred Property Star (e.g., 3, 4, 5)", min_value=1, max_value=5, value=3) | |
| # Dropdown for Marital Status. | |
| maritalstatus = st.selectbox("Marital Status", options=['Divorced', 'Married', 'Single']) | |
| # Numerical input for Number of Trips Annually. | |
| numberoftrips = st.number_input("Number of Trips Annually", min_value=0, max_value=50, value=5) | |
| # Dropdown for Passport, with custom display for 0/1. | |
| passport = st.selectbox("Passport", options=[0, 1], format_func=lambda x: "Yes" if x == 1 else "No") | |
| # Dropdown for Own Car, with custom display for 0/1. | |
| owncar = st.selectbox("Own Car", options=[0, 1], format_func=lambda x: "Yes" if x == 1 else "No") | |
| # Numerical input for Number of Children Visiting. | |
| numberofchildrenvisiting = st.number_input("Number of Children Visiting (below age 5)", min_value=0, max_value=5, value=0) | |
| # Dropdown for Designation. | |
| designation = st.selectbox("Designation", options=['Director', 'Executive', 'Manager', 'Senior Executive', 'VP']) | |
| # Numerical input for Monthly Income. | |
| monthlyincome = st.number_input("Monthly Income", min_value=0.0, max_value=1000000.0, value=50000.0, step=100.0) | |
| # User input fields for customer interaction data, organized under a header. | |
| st.header("Customer Interaction Data") | |
| # Numerical input for Pitch Satisfaction Score. | |
| pitchsatisfactionscore = st.number_input("Pitch Satisfaction Score (1-5)", min_value=1, max_value=5, value=3) | |
| # Dropdown for Product Pitched. | |
| productpitched = st.selectbox("Product Pitched", options=['Basic', 'Deluxe', 'King', 'Standard', 'Super Deluxe']) | |
| # Numerical input for Number of Follow-ups. | |
| numberoffollowups = st.number_input("Number of Follow-ups", min_value=0, max_value=20, value=3) | |
| # Numerical input for Duration of Pitch. | |
| durationofpitch = st.number_input("Duration of Pitch (minutes)", min_value=0.0, max_value=60.0, value=15.0, step=0.5) | |
| # Assemble the user input into a Pandas DataFrame. | |
| # The column names must exactly match those expected by the trained model. | |
| input_data = pd.DataFrame([{ | |
| 'Age': age, | |
| 'TypeofContact': typeofcontact, | |
| 'CityTier': citytier, | |
| 'DurationOfPitch': durationofpitch, | |
| 'Occupation': occupation, | |
| 'Gender': gender, | |
| 'NumberOfPersonVisiting': numberofpersonvisiting, | |
| 'PreferredPropertyStar': preferredpropertystar, | |
| 'MaritalStatus': maritalstatus, | |
| 'NumberOfTrips': numberoftrips, | |
| 'Passport': passport, | |
| 'PitchSatisfactionScore': pitchsatisfactionscore, | |
| 'OwnCar': owncar, | |
| 'NumberOfChildrenVisiting': numberofchildrenvisiting, | |
| 'Designation': designation, | |
| 'MonthlyIncome': monthlyincome, | |
| 'NumberOfFollowups': numberoffollowups, | |
| 'ProductPitched': productpitched, | |
| }]) | |
| # When the "Predict Purchase" button is clicked: | |
| if st.button("Predict Purchase"): | |
| # Get prediction probabilities from the model. | |
| prediction_proba = model.predict_proba(input_data)[:, 1] | |
| # Define the classification threshold (as used during model evaluation). | |
| classification_threshold = 0.45 | |
| # Convert probabilities to binary predictions based on the threshold. | |
| prediction = (prediction_proba >= classification_threshold).astype(int)[0] | |
| # Display the prediction result to the user. | |
| result = "Customer WILL purchase the Wellness Tourism Package" if prediction == 1 else "Customer will NOT purchase the Wellness Tourism Package" | |
| st.subheader("Prediction Result:") | |
| st.success(f"The model predicts: **{result}**") | |
| st.info(f"Probability of purchase: {prediction_proba[0]:.2f}") | |