Assignment_S3 / app.py
323Ahmed's picture
Upload app.py
d31600d verified
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(share=True)