Space-Risk-Intelligence-API / app /scripts /train_baseline.py
Adisri99's picture
Upload 24 files
9e6ee24 verified
raw
history blame
2 kB
import json, random
import numpy as np, pandas as pd
from sklearn.metrics import roc_auc_score
from app.database import SessionLocal
from app.repository import list_objects
from app.feature_engineering import FEATURE_COLUMNS, combine_features
from app.graph_features import build_graph, pair_graph_features
from app.ml import train_models
def run_training():
db = SessionLocal()
try:
objs = list_objects(db, 5000)
objects = [{"object_id": o.object_id, "object_type": o.object_type, "mean_motion": o.mean_motion, "inclination": o.inclination, "eccentricity": o.eccentricity, "raan": o.raan, "bstar": o.bstar, "launch_year": o.launch_year} for o in objs]
finally:
db.close()
pairs = [tuple(random.sample(objects, 2)) for _ in range(4000)]
g = build_graph([(a["object_id"], b["object_id"]) for a, b in pairs[:1000]])
rows = []
raw_scores = []
for a, b in pairs:
trend = {"recurrence_count": float(random.choice([0,1,2,3,4])), "trend_delta_score": float(random.uniform(-0.1, 0.3)), "score_volatility_proxy": float(random.uniform(0, 0.2))}
f = combine_features(a, b, trend, pair_graph_features(g, a["object_id"], b["object_id"]))
score = 0.30*f["close_approach_proxy"] + 0.16*f["same_shell"] + 0.10*min(1.0,f["shell_density_proxy"]/12.0) + 0.10*min(1.0,f["graph_local_density"]*2.0) + 0.09*min(1.0,f["graph_jaccard"]) + 0.10*min(1.0,f["recurrence_count"]/5.0) + 0.08*max(0.0,f["trend_delta_score"]) + np.random.normal(0,0.05)
y = 1 if score > 0.48 else 0
rows.append({**f, "label": y})
raw_scores.append(score)
df = pd.DataFrame(rows)
path = train_models(df[FEATURE_COLUMNS].values, df["label"].values)
auc = float(roc_auc_score(df["label"].values, np.array(raw_scores)))
return path, len(df), {"pseudo_auc": round(auc, 4), "rows": int(len(df))}
if __name__ == "__main__":
p, r, m = run_training()
print(json.dumps({"model_path": p, "rows": r, "metrics": m}, indent=2))