File size: 5,876 Bytes
d1d1019
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131

import joblib
import numpy as np
import sys
import os

# ---------------------------------------------------------
# 1. SETUP - DEFINING CLASSES FOR PICKLE LOADING
# ---------------------------------------------------------

# Try to import real classes first to avoid pickle errors
try:
    from predict_mental_health import (
        RewardModel, VariationalPreferenceLearning, ActiveLearner,
        EnhancedQuantumTransform, SuperEnsemble95
    )
    print("✓ Imported classes from predict_mental_health")
    
    # Alias to __main__ for pickle compatibility
    if __name__ == "__main__":
        import sys
        current_module = sys.modules[__name__]
        setattr(current_module, 'SuperEnsemble95', SuperEnsemble95)
        setattr(current_module, 'EnhancedQuantumTransform', EnhancedQuantumTransform)
        setattr(current_module, 'RewardModel', RewardModel)
        setattr(current_module, 'VariationalPreferenceLearning', VariationalPreferenceLearning)
        setattr(current_module, 'ActiveLearner', ActiveLearner)
except ImportError:
    print("⚠ Could not import classes. Using dummies (This might fail if pickle expects logic).")
    # Dummies if file is missing (unlikely in this context)
    class RewardModel:
        def __init__(self, n_features): pass
    class VariationalPreferenceLearning:
        def __init__(self, n_features, n_latent): pass
    class ActiveLearner:
        def __init__(self, n_queries=20): pass
    class EnhancedQuantumTransform:
        def __init__(self, n_features): pass
        def transform(self, X): return X
    class SuperEnsemble95:
        def __init__(self, n_features, n_classes): pass

# ---------------------------------------------------------
# 2. VALIDATION LOGIC
# ---------------------------------------------------------

def load_model_and_scaler(name, model_path, scaler_path):
    try:
        model = joblib.load(model_path)
        scaler = joblib.load(scaler_path)
        return model, scaler
    except Exception as e:
        print(f"✗ Failed to load {name}: {e}")
        return None, None

def run_test(name, model, scaler, inputs, feature_names):
    print(f"\n--- Testing {name} ---")
    print(f"Input: {dict(zip(feature_names, inputs[0]))}")
    
    try:
        # Scale
        X_scaled = scaler.transform(inputs)
        
        # Predict
        pred = model.predict(X_scaled)[0]
        proba = model.predict_proba(X_scaled)[0]
        
        print(f"Prediction: {pred}")
        print(f"Probabilities: {proba}")
        print(f"Result: {'POSITIVE/HIGH' if pred==1 else 'NEGATIVE/LOW'} (Conf: {max(proba):.2f})")
    except Exception as e:
        print(f"Error during inference: {e}")
        import traceback
        traceback.print_exc()

if __name__ == "__main__":
    MODEL_DIR = "model"
    
    # -----------------------------------------------------
    # SCENARIO 1: SLEEP QUALITY
    # User Input: Age 25, Male, Screen 6h, Night 2h, Social 3h, Stress 15
    # Features: [age, gender_enc, screen_time_hours, screen_time_night_hours, social_media_hours, stress_score]
    # Gender Enc: Female=0, Male=1
    # -----------------------------------------------------
    sleep_model, sleep_scaler = load_model_and_scaler("Sleep", f"{MODEL_DIR}/students_sleep_model.joblib", f"{MODEL_DIR}/students_sleep_scaler.joblib")
    if sleep_model:
        inputs = np.array([[25, 1, 6.0, 2.0, 3.0, 15]])
        run_test("Sleep Quality", sleep_model, sleep_scaler, inputs, 
                 ["Age", "Gender(M=1)", "Screen", "NightScreen", "Social", "Stress"])

    # -----------------------------------------------------
    # SCENARIO 2: DEPRESSION
    # User Input: Age 25, Male, Student, Social 3h, Instagram, PHQ9=5, GAD7=5 (GAD7 from anxiety form context usually)
    # Features: [age, gender_enc, role_enc, social_media_hours, platform_enc, phq9_score, gad7_score]
    # Mappings from app.py:
    # gender: male=1
    # role: student=2
    # platform: instagram=1
    # -----------------------------------------------------
    dep_model, dep_scaler = load_model_and_scaler("Depression", f"{MODEL_DIR}/depression_model.joblib", f"{MODEL_DIR}/depression_scaler.joblib")
    if dep_model:
        # Note: Screenshot shows PHQ9=5. GAD7 input is in next form but likely similar low value? Assuming 5.
        inputs = np.array([[25, 1, 2, 3.0, 1, 5, 5]])
        run_test("Depression Screening", dep_model, dep_scaler, inputs,
                 ["Age", "Gender", "Role", "Social", "Platform", "PHQ9", "GAD7"])

    # -----------------------------------------------------
    # SCENARIO 3: ANXIETY
    # Same inputs as above relative to profile
    # -----------------------------------------------------
    anx_model, anx_scaler = load_model_and_scaler("Anxiety", f"{MODEL_DIR}/anxiety_model.joblib", f"{MODEL_DIR}/anxiety_scaler.joblib")
    if anx_model:
        inputs = np.array([[25, 1, 2, 3.0, 1, 5, 5]])
        run_test("Anxiety Screening", anx_model, anx_scaler, inputs,
                 ["Age", "Gender", "Role", "Social", "Platform", "PHQ9", "GAD7"])

    # -----------------------------------------------------
    # SCENARIO 4: BURNOUT
    # User Input: Age 35, Male, Healthcare Worker, Stress 20, Work 50h, Patients 70, MBSR No
    # Features: [age, gender_enc, role_enc, stress_score, work_hours_per_week, patient_load_per_week, mbsr_participation]
    # Mappings:
    # gender: male=1
    # role: healthcare_worker=0
    # mbsr: no=0
    # -----------------------------------------------------
    burn_model, burn_scaler = load_model_and_scaler("Burnout", f"{MODEL_DIR}/burnout_model.joblib", f"{MODEL_DIR}/burnout_scaler.joblib")
    if burn_model:
        inputs = np.array([[35, 1, 0, 20, 50, 70, 0]])
        run_test("Burnout Risk", burn_model, burn_scaler, inputs,
                 ["Age", "Gender", "Role", "Stress", "WorkHrs", "Patients", "MBSR"])