| import joblib
|
| import json
|
| import numpy as np
|
|
|
|
|
|
|
|
|
| lgb_model = joblib.load("lgb_model.pkl")
|
| scaler = joblib.load("scaler.pkl")
|
| le = joblib.load("label_encoder.pkl")
|
|
|
| with open("feature_names.json") as f:
|
| feature_names = json.load(f)
|
|
|
|
|
|
|
|
|
| mitre_mapping = {
|
| "Web Attack Sql Injection": ("T1190", "Exploit Public-Facing Application"),
|
| "DDoS": ("T1498", "Network Denial of Service"),
|
| "PortScan": ("T1046", "Network Service Scanning"),
|
| "Brute Force": ("T1110", "Brute Force")
|
| }
|
|
|
|
|
|
|
|
|
| def predict(inputs):
|
| """
|
| Hugging Face expects:
|
| {"inputs": [...]}
|
| """
|
|
|
| input_data = inputs
|
|
|
|
|
| x = np.array(input_data).reshape(1, -1)
|
|
|
|
|
| x_scaled = scaler.transform(x)
|
|
|
|
|
| pred = lgb_model.predict(x_scaled)[0]
|
| pred_label = le.inverse_transform([pred])[0]
|
|
|
|
|
| proba = lgb_model.predict_proba(x_scaled)[0]
|
| confidence = float(np.max(proba))
|
| confidence = min(confidence, 0.99)
|
|
|
|
|
| mitre_id, mitre_name = mitre_mapping.get(
|
| pred_label, ("Unknown", "Unknown")
|
| )
|
|
|
| return {
|
| "prediction": pred_label,
|
| "confidence": round(confidence, 3),
|
| "mitre_attack": {
|
| "technique_id": mitre_id,
|
| "technique_name": mitre_name
|
| }
|
| } |