File size: 5,593 Bytes
713b9e7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4372753
713b9e7
 
cfbf31d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111

import gradio as gr
import numpy as np
import pandas as pd
import pickle

# Load the pre-trained model and its key components
with open('rf_key_components.pkl', 'rb') as file:
    key_components = pickle.load(file)

categorical_imputer = key_components['categorical_imputer']
numerical_imputer = key_components['numerical_imputer']
encoder = key_components['encoder']
scaler = key_components['scaler']
best_model = key_components['best_model']

# Preprocessing function
def churn_prediction(gender, SeniorCitizen, Partner, Dependents, tenure, PhoneService, MultipleLines, 
                     InternetService, OnlineSecurity, OnlineBackup, DeviceProtection, TechSupport,
                     StreamingTV, StreamingMovies, Contract, PaperlessBilling, PaymentMethod,
                     MonthlyCharges, TotalCharges, MonthlyCharges_TotalCharges_Ratio, AverageMonthlyCharges):
    
    # Create a DataFrame from user inputs
    user_input_df = pd.DataFrame({
        'gender': [gender],
        'SeniorCitizen': [SeniorCitizen],
        'Partner': [Partner],
        'Dependents': [Dependents],
        'tenure': [tenure],
        'PhoneService': [PhoneService],
        'MultipleLines': [MultipleLines],
        'InternetService': [InternetService],
        'OnlineSecurity': [OnlineSecurity],
        'OnlineBackup': [OnlineBackup],
        'DeviceProtection': [DeviceProtection],
        'TechSupport': [TechSupport],
        'StreamingTV': [StreamingTV],
        'StreamingMovies': [StreamingMovies],
        'Contract': [Contract],
        'PaperlessBilling': [PaperlessBilling],
        'PaymentMethod': [PaymentMethod],
        'MonthlyCharges': [MonthlyCharges],
        'TotalCharges': [TotalCharges],
        'MonthlyCharges_TotalCharges_Ratio': [MonthlyCharges_TotalCharges_Ratio],
        'AverageMonthlyCharges': [AverageMonthlyCharges]
    })
    
    # Preprocessing for categorical data
    pred_cat_data = user_input_df.select_dtypes(include='object')
    encoded_pred_data = encoder.transform(categorical_imputer.transform(pred_cat_data))

    # Convert the encoded data to a DataFrame
    encoded_pred_data_df = pd.DataFrame.sparse.from_spmatrix(encoded_pred_data,
                                                                  columns=encoder.get_feature_names_out(pred_cat_data.columns),
                                                                  index=pred_cat_data.index)

    # Preprocessing for numerical data
    pred_num_data = user_input_df.select_dtypes(include=['int', 'float'])
    scaled_pred_data = scaler.transform(numerical_imputer.transform(pred_num_data))

    # Convert the scaled numerical data to a DataFrame
    scaled_pred_data_df = pd.DataFrame(scaled_pred_data, columns=pred_num_data.columns, index=pred_num_data.index)

    # Concatenate the encoded categorical data and scaled numerical data
    final_df = pd.concat([encoded_pred_data_df, scaled_pred_data_df], axis=1)

    # Make predictions using the loaded model
    predictions = best_model.predict(final_df)

    # Map the predictions to 'Yes' or 'No'
    input_prediction = 'Churn' if predictions[0] == 1 else 'Not Churn'

    
    return input_prediction

# Define input components
input_components = [
    gr.Radio(label='Customer Gender', choices=['Female', 'Male']),
    gr.Radio(label='Is the customer a senior citizen?', choices=['No', 'Yes']),
    gr.Radio(label='Does the customer have a partner?', choices=['No', 'Yes']),
    gr.Radio(label='Does the customer have dependents?', choices=['No', 'Yes']),
    gr.Number(label='Number of months the customer has been with the company.', minimum=0, maximum=72),
    gr.Radio(label='Does the customer have a phone service?', choices=['No', 'Yes']),
    gr.Radio(label='Does the customer have multiple lines?', choices=['No', 'Yes']),
    gr.Radio(label='Type of internet service', choices=['DSL', 'Fiber optic', 'No']),
    gr.Radio(label='Does the customer have online security?', choices=['No', 'Yes']),
    gr.Radio(label='Does the customer have online backup?', choices=['No', 'Yes']),
    gr.Radio(label='Does the customer have device protection?', choices=['No', 'Yes']),
    gr.Radio(label='Does the customer have tech support?', choices=['No', 'Yes']),
    gr.Radio(label='Does the customer have streaming TV?', choices=['No', 'Yes']),
    gr.Radio(label='Does the customer have streaming movies?', choices=['No', 'Yes']),
    gr.Radio(label='Contract type', choices=['Month-to-month', 'One year', 'Two year']),
    gr.Radio(label='Does the customer use paperless billing?', choices=['No', 'Yes']),
    gr.Radio(label='Payment method', choices=['Electronic check', 'Mailed check', 'Bank transfer (automatic)', 'Credit card (automatic)']),
    gr.Number(label='Monthly charges for the customer.', minimum=18, maximum=119),
    gr.Number(label='Total charges for the customer.', minimum=19, maximum=8670),
    gr.Slider(label='Ratio of monthly charges to total charges.', minimum=0.00, maximum=1.0),
    gr.Number(label='Average monthly charges for the customer.', minimum=0, maximum=120)
]

# Create and launch the Gradio interface
iface = gr.Interface(
    fn=churn_prediction,
    inputs=input_components,
    outputs="text",
    title="Customer Churn Prediction App", 
    description="This app predicts whether a customer is likely to churn (leave) a telecommunications company. It uses machine learning to analyze customer data, such as gender, age, tenure, and service usage. The app can be used by stakeholders and customers to make informed decisions about customer retention.",
    live=False 
)

iface.launch()