Valtry commited on
Commit
fbb2cd4
·
verified ·
1 Parent(s): 1310b2f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +57 -26
app.py CHANGED
@@ -1,13 +1,15 @@
1
  from fastapi import FastAPI
2
  from pydantic import BaseModel
3
  import numpy as np
 
4
  import joblib
5
 
6
  # -----------------------------
7
- # Load model + scaler
8
  # -----------------------------
9
- model = joblib.load("appliance_model.pkl")
10
- scaler = joblib.load("scaler.pkl")
 
11
 
12
  # -----------------------------
13
  # FastAPI app
@@ -15,7 +17,7 @@ scaler = joblib.load("scaler.pkl")
15
  app = FastAPI(title="Energy Appliance Detection API")
16
 
17
  # -----------------------------
18
- # Input schema
19
  # -----------------------------
20
  class Features(BaseModel):
21
  mean: float
@@ -23,11 +25,20 @@ class Features(BaseModel):
23
  min: float
24
  std: float
25
  range: float
26
- skew: float
27
- kurtosis: float
28
  peak_count: float
29
  slope: float
30
 
 
 
 
 
 
 
 
 
 
 
 
31
  # -----------------------------
32
  # Routes
33
  # -----------------------------
@@ -39,31 +50,51 @@ def root():
39
  def health():
40
  return {"status": "ok"}
41
 
 
 
 
42
  @app.post("/predict")
43
  def predict(data: Features):
44
 
45
- features = np.array([[
46
- data.mean,
47
- data.max,
48
- data.min,
49
- data.std,
50
- data.range,
51
- data.skew,
52
- data.kurtosis,
53
- data.peak_count,
54
- data.slope
55
- ]])
56
-
57
- # Scale
58
- features_scaled = scaler.transform(features)
59
-
60
- # Predict
61
- pred = model.predict(features_scaled)[0]
62
- probs = model.predict_proba(features_scaled)[0]
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
63
  confidence = float(np.max(probs))
64
 
65
- # Confidence filtering
66
- if confidence < 0.45:
 
 
67
  pred = "Unknown"
68
 
69
  return {
 
1
  from fastapi import FastAPI
2
  from pydantic import BaseModel
3
  import numpy as np
4
+ import pandas as pd
5
  import joblib
6
 
7
  # -----------------------------
8
+ # Load model + scaler + encoder
9
  # -----------------------------
10
+ model = joblib.load("xgb_model.pkl")
11
+ scaler = joblib.load("xgb_scaler.pkl")
12
+ le = joblib.load("label_encoder.pkl")
13
 
14
  # -----------------------------
15
  # FastAPI app
 
17
  app = FastAPI(title="Energy Appliance Detection API")
18
 
19
  # -----------------------------
20
+ # Input schema (RAW FEATURES ONLY)
21
  # -----------------------------
22
  class Features(BaseModel):
23
  mean: float
 
25
  min: float
26
  std: float
27
  range: float
 
 
28
  peak_count: float
29
  slope: float
30
 
31
+ # -----------------------------
32
+ # Feature order (VERY IMPORTANT)
33
+ # -----------------------------
34
+ columns = [
35
+ "mean","max","min","std","range",
36
+ "peak_count","slope",
37
+ "energy","ratio",
38
+ "cv","peak_ratio",
39
+ "delta_mean","power_density"
40
+ ]
41
+
42
  # -----------------------------
43
  # Routes
44
  # -----------------------------
 
50
  def health():
51
  return {"status": "ok"}
52
 
53
+ # -----------------------------
54
+ # Prediction
55
+ # -----------------------------
56
  @app.post("/predict")
57
  def predict(data: Features):
58
 
59
+ # -------- RAW --------
60
+ mean = data.mean
61
+ mx = data.max
62
+ mn = data.min
63
+ std = data.std
64
+ rng = data.range
65
+ peak = data.peak_count
66
+ slope = data.slope
67
+
68
+ # -------- ENGINEERED FEATURES --------
69
+ energy = mean * 40
70
+ ratio = mx / (mn + 1)
71
+ cv = std / (mean + 1)
72
+ peak_ratio = peak / 40
73
+ delta_mean = std * 0.8
74
+ power_density = mean / (rng + 1)
75
+
76
+ row = [
77
+ mean, mx, mn, std, rng,
78
+ peak, slope,
79
+ energy, ratio,
80
+ cv, peak_ratio,
81
+ delta_mean, power_density
82
+ ]
83
+
84
+ df = pd.DataFrame([row], columns=columns)
85
+
86
+ # -------- SCALE --------
87
+ X = scaler.transform(df)
88
+
89
+ # -------- PREDICT --------
90
+ probs = model.predict_proba(X)[0]
91
+ pred_index = np.argmax(probs)
92
  confidence = float(np.max(probs))
93
 
94
+ pred = le.inverse_transform([pred_index])[0]
95
+
96
+ # -------- UNKNOWN FILTER --------
97
+ if confidence < 0.5:
98
  pred = "Unknown"
99
 
100
  return {