from flask import Flask, render_template, request, jsonify import pandas as pd import joblib import os app = Flask(__name__) MODEL_PATH = os.environ.get("MODEL_PATH", "random_over_sampling_model.pkl") def load_model(): try: return joblib.load(MODEL_PATH) except FileNotFoundError: return None model = load_model() def preprocess_input(data): data['IMAGES_AND_REVIEWS'] = ((data['IMAGES'] > 0) & (data['REVIEWS'] > 0)).astype(int) data['SPECS_AND_REVIEWS'] = ((data['SPECS'] > 0) & (data['REVIEWS'] > 0)).astype(int) data['FAQ_AND_IMAGES'] = ((data['FAQ'] > 0) & (data['IMAGES'] > 0)).astype(int) data['WARRANTY_AND_SPECS'] = ((data['WARRANTY'] > 0) & (data['SPECS'] > 0)).astype(int) data['COMPARE_SIMILAR_AND_SPONSORED_LINKS'] = ((data['COMPARE_SIMILAR'] > 0) & (data['SPONSORED_LINKS'] > 0)).astype(int) return data @app.route("/") def index(): return render_template("index.html") @app.route("/predict", methods=["POST"]) def predict(): if model is None: return jsonify({"error": "Model not loaded. Please ensure the model file exists."}), 500 try: body = request.get_json() features = [ "IMAGES", "REVIEWS", "FAQ", "SPECS", "SHIPPING", "BRO_TOGETHER", "COMPARE_SIMILAR", "VIEW_SIMILAR", "WARRANTY", "SPONSORED_LINKS" ] input_data = pd.DataFrame([{f: int(body.get(f, 0)) for f in features}]) processed = preprocess_input(input_data.copy()) prediction = int(model.predict(processed)[0]) probability = None if hasattr(model, "predict_proba"): proba = model.predict_proba(processed)[0] probability = float(proba[1]) if prediction == 1 else float(proba[0]) return jsonify({ "prediction": prediction, "probability": probability }) except Exception as e: return jsonify({"error": str(e)}), 500 if __name__ == "__main__": port = int(os.environ.get("PORT", 7860)) app.run(host="0.0.0.0", port=port)