import pandas as pd import numpy as np import joblib import gradio as gr # Load the preprocessing steps and the model label_encoders = joblib.load('label_encoders.pkl') one_hot_encoder = joblib.load('one_hot_encoder.pkl') min_max_scaler = joblib.load('min_max_scaler.pkl') model = joblib.load('logistic_regression_model.pkl') le_target = joblib.load('label_encoder_target.pkl') def preprocess_data(data): df = pd.DataFrame([data]) label_encode_cols = ["Partner", "Dependents", "PhoneService", "PaperlessBilling", "gender"] one_hot_encode_cols = ["MultipleLines", "InternetService", "OnlineSecurity", "OnlineBackup", "DeviceProtection", "TechSupport", "StreamingTV", "StreamingMovies", "Contract", "PaymentMethod"] min_max_scale_cols = ["tenure", "MonthlyCharges", "TotalCharges"] # Strip leading and trailing spaces from string inputs for col in label_encode_cols + one_hot_encode_cols: df[col] = df[col].str.strip() # Convert non-numeric values to NaN and fill them with the mean of the column df[min_max_scale_cols] = df[min_max_scale_cols].replace(' ', np.nan).astype(float) df[min_max_scale_cols] = df[min_max_scale_cols].fillna(df[min_max_scale_cols].mean()) # Label encode specified columns for col in label_encode_cols: le = label_encoders[col] df[col] = le.transform(df[col]) # One-hot encode specified columns one_hot_encoded = one_hot_encoder.transform(df[one_hot_encode_cols]) # Min-max scale specified columns scaled_numerical = min_max_scaler.transform(df[min_max_scale_cols]) # Combine processed columns into one DataFrame X_processed = np.hstack((df[label_encode_cols].values, scaled_numerical, one_hot_encoded)) return X_processed def predict(gender, senior_citizen, partner, dependents, tenure, phone_service, multiple_lines, internet_service, online_security, online_backup, device_protection, tech_support, streaming_tv, streaming_movies, contract, paperless_billing, payment_method, monthly_charges, total_charges): data = { "gender": gender, "SeniorCitizen": senior_citizen, "Partner": partner, "Dependents": dependents, "tenure": tenure, "PhoneService": phone_service, "MultipleLines": multiple_lines, "InternetService": internet_service, "OnlineSecurity": online_security, "OnlineBackup": online_backup, "DeviceProtection": device_protection, "TechSupport": tech_support, "StreamingTV": streaming_tv, "StreamingMovies": streaming_movies, "Contract": contract, "PaperlessBilling": paperless_billing, "PaymentMethod": payment_method, "MonthlyCharges": monthly_charges, "TotalCharges": total_charges } try: X_new = preprocess_data(data) prediction = model.predict(X_new) prediction = le_target.inverse_transform(prediction) return "Churn" if prediction[0] == 'Yes' else "No Churn" except Exception as e: print("Error during prediction:", e) return str(e) # Define the Gradio interface inputs = [ gr.Radio(label="Gender", choices=["Female", "Male"]), gr.Number(label="Senior Citizen (0 or 1)"), gr.Radio(label="Partner", choices=["Yes", "No"]), gr.Radio(label="Dependents", choices=["Yes", "No"]), gr.Number(label="Tenure (integer)"), gr.Radio(label="Phone Service", choices=["Yes", "No"]), gr.Radio(label="Multiple Lines", choices=["Yes", "No", "No phone service"]), gr.Radio(label="Internet Service", choices=["DSL", "Fiber optic", "No"]), gr.Radio(label="Online Security", choices=["Yes", "No", "No internet service"]), gr.Radio(label="Online Backup", choices=["Yes", "No", "No internet service"]), gr.Radio(label="Device Protection", choices=["Yes", "No", "No internet service"]), gr.Radio(label="Tech Support", choices=["Yes", "No", "No internet service"]), gr.Radio(label="Streaming TV", choices=["Yes", "No", "No internet service"]), gr.Radio(label="Streaming Movies", choices=["Yes", "No", "No internet service"]), gr.Radio(label="Contract", choices=["Month-to-month", "One year", "Two year"]), gr.Radio(label="Paperless Billing", choices=["Yes", "No"]), gr.Radio(label="Payment Method", choices=["Electronic check", "Mailed check", "Bank transfer (automatic)", "Credit card (automatic)"]), gr.Number(label="Monthly Charges (float)"), gr.Number(label="Total Charges (float)") ] outputs = gr.Textbox(label="Prediction") # Create the Gradio interface gr.Interface(fn=predict, inputs=inputs, outputs=outputs, title="Churn Prediction Model").launch()