Kousik-1504
Version 1.0 of the application has been developed
e80d1c2
Raw
History Blame Contribute Delete
5.77 kB
from flask import Flask, request, render_template, jsonify
import joblib
import pandas as pd
app = Flask(__name__)
# Load pre-trained pipeline and XGBoost model at startup
try:
ohe = joblib.load('models/ohe.pkl')
scaler = joblib.load('models/scaler.pkl')
model = joblib.load('models/xgboost_model.pkl')
expected_features = list(model.feature_names_in_)
print("Models and pipelines loaded successfully.")
except Exception as e:
print(f"Error loading models or encoder: {e}")
ohe, scaler, model, expected_features = None, None, None, []
@app.route('/')
def home():
return render_template('home2.html')
@app.route('/documentation')
def documentation():
return render_template('documentation2.html')
@app.route('/predict_model', methods=['GET', 'POST'])
def predict_model():
if request.method == 'POST':
try:
# 1. Extract raw inputs from form
gender = int(request.form.get('gender', 0))
senior = int(request.form.get('SeniorCitizen', 0))
partner_str = request.form.get('Partner', 'No')
dependents_str = request.form.get('Dependents', 'No')
phone_str = request.form.get('PhoneService', 'No')
multiple_str = request.form.get('MultipleLines', 'No')
internet_str = request.form.get('InternetService', 'No')
security_str = request.form.get('OnlineSecurity', 'No')
backup_str = request.form.get('OnlineBackup', 'No')
protection_str = request.form.get('DeviceProtection', 'No')
tech_str = request.form.get('TechSupport', 'No')
tv_str = request.form.get('StreamingTV', 'No')
movies_str = request.form.get('StreamingMovies', 'No')
contract = request.form.get('Contract', 'Month-to-month')
paperless = request.form.get('PaperlessBilling', 'No')
payment = request.form.get('PaymentMethod', 'Electronic check')
tenure = int(request.form.get('tenure', 0))
monthly = float(request.form.get('MonthlyCharges', 0.0))
total = float(request.form.get('TotalCharges', 0.0))
map_addon = lambda val: 1 if val == 'Yes' else (-1 if val == 'No' else 0)
security = map_addon(security_str)
backup = map_addon(backup_str)
protection = map_addon(protection_str)
tech = map_addon(tech_str)
tv = map_addon(tv_str)
movies = map_addon(movies_str)
has_partner = 1 if partner_str == 'Yes' else 0
has_dependents = 1 if dependents_str == 'Yes' else 0
has_phoneservice = 1 if phone_str == 'Yes' else 0
has_multiplelines = 1 if multiple_str == 'Yes' else 0
internet_map = {'No': 0, 'DSL': 1, 'Fiber optic': 2}
internet_encoded = internet_map.get(internet_str, 0)
is_automatic = 1 if 'automatic' in payment else 0
addons_list = [security_str, backup_str, protection_str, tech_str, tv_str, movies_str]
product_count = sum(1 for add in addons_list if add == 'Yes')
high_risk = 1 if product_count in [1, 2, 3] else 0
fully_integrated = 1 if product_count >= 5 else 0
mod_security = 1 if security_str == 'Yes' else 0
user_data = {
'gender': gender,
'SeniorCitizen': senior,
'tenure': tenure,
'OnlineSecurity': security,
'OnlineBackup': backup,
'DeviceProtection': protection,
'TechSupport': tech,
'StreamingTV': tv,
'StreamingMovies': movies,
'Contract': contract,
'PaperlessBilling': paperless,
'PaymentMethod': payment,
'MonthlyCharges': monthly,
'TotalCharges': total,
'has_partner': has_partner,
'has_dependents': has_dependents,
'has_phoneservice': has_phoneservice,
'has_multiplelines': has_multiplelines,
'internet_service_encoded': internet_encoded,
'is_automatic': is_automatic,
'Product_Count': product_count,
'Is_High_Risk_Integration': high_risk,
'Is_Fully_Integrated': fully_integrated,
'Mod_Security': mod_security
}
df_raw = pd.DataFrame([user_data])
categorical_cols = ['Contract', 'PaperlessBilling', 'PaymentMethod']
encoded_data = ohe.transform(df_raw[categorical_cols]).toarray()
encoded_df = pd.DataFrame(encoded_data, columns=ohe.get_feature_names_out(categorical_cols))
df_processed = pd.concat([df_raw.drop(columns=categorical_cols), encoded_df], axis=1)
numerical_cols = ['MonthlyCharges', 'TotalCharges']
df_processed[numerical_cols] = scaler.transform(df_processed[numerical_cols])
df_final = df_processed[expected_features]
churn_prob = float(model.predict_proba(df_final)[0][1])
prediction = int(model.predict(df_final)[0])
return jsonify({
'success': True,
'prediction': prediction,
'churn_prob': churn_prob
})
except Exception as ex:
print(f"Error during prediction: {ex}")
return jsonify({
'success': False,
'error': str(ex)
}), 400
return render_template('predict2.html')
if __name__ == "__main__":
app.run(port=7860, host='0.0.0.0')