File size: 4,287 Bytes
b9ddc97
 
 
 
 
0d61f16
b9ddc97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import gradio as gr
import pandas as pd
import joblib
import os
import warnings
import imblearn

# Suppress the FutureWarning from pandas
warnings.simplefilter(action='ignore', category=FutureWarning)

# --- Gradio App Components ---
# List of possible values for the dropdown menus
locations = ['Bathroom', 'Bedroom', 'Kitchen', 'Living Room']
days_of_week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']

# Load the trained model pipeline from the joblib file
try:
    # Load the complete pipeline, which includes the pre-processors and the model
    model_pipeline = joblib.load('fall_detection_pipeline.joblib')
    # Load the final prediction threshold
    with open('prediction_threshold.txt', 'r') as f:
        threshold = float(f.read())
    print("Model and threshold loaded successfully.")
except FileNotFoundError as e:
    model_pipeline = None
    threshold = 0.4 # Default threshold in case of loading error
    print(f"Error: {e}. Model files not found. The app will run in a placeholder mode.")
except Exception as e:
    model_pipeline = None
    threshold = 0.4
    print(f"An unexpected error occurred while loading files: {e}. The app will run in a placeholder mode.")


def predict_fall(location, day_of_week, hour_of_day, minute_of_day, time_since_last_event):
    """
    Makes a fall prediction based on user inputs using the pre-trained model.
    The function expects raw inputs and the pipeline handles all transformations.
    """
    # Check if the model was loaded successfully. If not, return an error message.
    if model_pipeline is None:
        return "Prediction model not available. Please ensure model files are correctly saved."
    
    try:
        # Create a dictionary to hold the feature values based on the original data columns.
        # This is the format the pipeline expects.
        # The 'Movement Activity' column is not used based on previous analysis, but
        # we can include it if the model requires it. For now, let's stick to the features
        # identified in the previous steps.
        
        # The feature names from the notebook cells were:
        # ['Location', 'day_of_week', 'hour_of_day', 'minute_of_day', 'time_since_last_event']
        
        # Create a DataFrame from the inputs
        input_data = pd.DataFrame([{
            'Location': location,
            'day_of_week': day_of_week,
            'hour_of_day': hour_of_day,
            'minute_of_day': minute_of_day,
            'time_since_last_event': time_since_last_event
        }])

        # Use the trained pipeline to get the probability. The pipeline
        # automatically handles the scaling and one-hot encoding.
        pred_proba = model_pipeline.predict_proba(input_data)[0, 1]
        
        # Get the final prediction label based on the threshold.
        pred_label = "Fall Detected" if pred_proba >= threshold else "No Fall"

        return f"Prediction: {pred_label}\nFall Probability: {pred_proba:.2f}"

    except Exception as e:
        import traceback
        traceback.print_exc()
        return f"An error occurred during prediction: {str(e)}"

# Define the Gradio interface
with gr.Blocks() as demo:
    gr.Markdown("## Elderly Fall Prediction System")
    gr.Markdown("This system uses a trained machine learning model to predict the likelihood of a fall based on behavioral data. **Note:** This is a demonstration and should not be used for medical diagnosis.")

    with gr.Row():
        location_input = gr.Dropdown(choices=locations, label="Location", value='Living Room')
        day_input = gr.Dropdown(choices=days_of_week, label="Day of Week", value='Monday')

    with gr.Row():
        hour_input = gr.Slider(minimum=0, maximum=23, step=1, label="Hour of Day", value=12)
        minute_input = gr.Slider(minimum=0, maximum=59, step=1, label="Minute of Day", value=30)
    
    time_since_input = gr.Number(label="Time Since Last Event (minutes)", value=60)

    predict_button = gr.Button("Predict Fall")
    output = gr.Textbox(label="Prediction Result")

    predict_button.click(
        predict_fall,
        inputs=[location_input, day_input, hour_input, minute_input, time_since_input],
        outputs=output
    )

if __name__ == "__main__":
    demo.launch()