Spotix-API / backend /app /ai /meta_classifier.py
Anish-530
Fixed loader stuck, Added a new feedback mechanism, and fixed sound upon analysis
ee2facf
import numpy as np
import joblib
from sklearn.linear_model import LogisticRegression
from app.models.feedback_model import Feedback
from app.db.database import SessionLocal
from pathlib import Path
from app.ai.model_loader import model_loader
from app.core.config import settings
def get_model_path():
return Path(settings.MODEL_DIR) / model_loader.get_latest_model_version()
def retrain_from_feedback():
db = SessionLocal()
data = db.query(Feedback).all()
if len(data) < 10:
print("Not enough feedback to retrain")
db.close()
return
X = []
y = []
batch = data[:10]
for row in batch:
X.append([row.freq_score, row.cnn_score])
y.append(1 if row.label == "ai" else 0)
X = np.array(X)
y = np.array(y)
model = LogisticRegression()
model.fit(X, y)
joblib.dump(model, get_model_path())
print("Model retrained on real feedback data")
for row in batch:
db.delete(row)
db.commit()
db.close()
def train_meta_model():
X = np.array([
[0.6, 0.5],
[0.7, 0.6],
[0.8, 0.7],
[0.9, 0.8],
[1.0, 0.9],
[1.1, 1.0],
[1.2, 1.1],
[1.3, 1.2],
[1.4, 1.3],
[1.5, 1.4],
])
y = np.array([
0,0,0,0,0,
1,1,1,1,1
])
model = LogisticRegression()
model.fit(X, y)
joblib.dump(model, get_model_path())
def load_model():
model_path = get_model_path()
if not model_path.exists():
train_meta_model()
return joblib.load(model_path)
def predict_ai(freq_score: float, cnn_score: float):
model = load_model()
X = np.array([[freq_score, cnn_score]])
prob = model.predict_proba(X)[0][1]
if prob > 0.75:
label = "Likely AI Generated"
elif prob > 0.45:
label = "Suspicious"
else:
label = "Likely Real"
return label, float(prob)