File size: 2,354 Bytes
23aea5e
 
 
 
 
 
 
 
 
 
f9714df
 
94e7d06
 
23aea5e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
94e7d06
 
f9714df
94e7d06
23aea5e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
f9714df
23aea5e
 
 
 
 
 
 
 
f9714df
23aea5e
 
94e7d06
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
import joblib
import pandas as pd
import numpy as np
from flask import Flask, request, jsonify
from flask_cors import CORS

# Initialize Flask app
app = Flask("Engineering College General Predictor")
CORS(app)

# Load trained pipeline & label encoder & choice_code_map
pipeline = joblib.load('pipeline.joblib')
target_encoder = joblib.load('label_encoder.joblib')
choice_code_map = pd.read_csv('choice_code_map.csv', index_col='Choice Code')

# Home route
@app.get('/')
def home():
    return "✅ Welcome to Engineering College Predictor API!"

# Predict route
@app.post('/predict')
def predict():
    try:
        # Parse input JSON
        data = request.get_json()

        # Validate input
        required_fields = ['Category', 'Rank', 'Percentage', 'Course Name']
        missing = [f for f in required_fields if f not in data]
        if missing:
            return jsonify({"error": f"Missing fields: {missing}"}), 400

        # Build DataFrame
        sample_df = pd.DataFrame([{
            'Category': data['Category'],
            'Rank': data['Rank'],
            'Percentage': data['Percentage'],
            'Course Name': data['Course Name']
        }])

        # Predict probabilities
        proba = pipeline.predict_proba(sample_df)[0]

        # Get top-20 indices (highest probabilities)
        top_20_idx = np.argsort(proba)[::-1][:20]

        # Normalize top-20 probs to sum to 100
        top_20_probs = proba[top_20_idx]
        top_20_probs_normalized = top_20_probs / top_20_probs.sum() * 100

        results = []
        for rank, (idx, prob) in enumerate(zip(top_20_idx, top_20_probs_normalized), start=1):
            choice_code = target_encoder.inverse_transform([idx])[0]
            row = choice_code_map.loc[int(choice_code)]
            college_name = row['College Name']
            course_name = row['Course Name']
            results.append({
                "rank": rank,
                "choice_code": choice_code,
                "college_name": college_name,
                "course name": course_name,
                "probability_percent": round(float(prob), 2)
            })

        return jsonify({"top_20_predictions": results})

    except Exception as e:
        return jsonify({"error": str(e)}), 500


# Run server
if __name__ == '__main__':
    app.run(debug=False, host='0.0.0.0', port=7860)