Spaces:
Running
Running
| 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) |