================================================================================
  Experiment 15: Decision Tree Room Occupancy Classifier (UCI)
================================================================================

FULL QUESTION:
Develop a Decision Tree model to classify room occupancy as Occupied or Not Occupied using temperature, humidity, light, and CO2 sensor data, and evaluate the model using accuracy score and a confusion matrix.

SHORT QUESTION:
Train Decision Tree model on UCI Occupancy Detection dataset to predict room occupancy with accuracy score and confusion matrix.

================================================================================
README & SETUP INSTRUCTIONS:
================================================================================
# Experiment 15: Decision Tree Room Occupancy Classifier

## Objective
Classify room occupancy as Occupied (1) or Not Occupied (0) using Temperature, Humidity, Light, and CO2 sensor readings. Evaluated with Accuracy Score and Confusion Matrix.

## Dataset
UCI Occupancy Detection dataset (`datatraining.txt`). Ensure `datatraining.txt` is located in this directory.

## Requirements
```bash
pip install pandas scikit-learn matplotlib streamlit
```

## How to Run
- **CLI Mode:**
  ```bash
  python occupancy_cli.py
  ```
- **Streamlit Web Dashboard:**
  ```bash
  streamlit run occupancy_app.py
  ```

================================================================================
SOURCE CODE FILES:
================================================================================

1. occupancy_cli.py
--------------------------------------------------------------------------------
"""
================================================================================
IOT EXPERIMENT 15: Decision Tree Room Occupancy Classifier (CLI Pipeline)
================================================================================
Develop a Decision Tree model to classify room occupancy as Occupied or Not
Occupied using temperature, humidity, light, and CO₂ sensor data, and evaluate
the model using accuracy score and a confusion matrix.
================================================================================
"""

# Short Description: Machine learning pipeline training a Decision Tree Classifier on UCI sensor data to predict room occupancy based on temperature, humidity, light, and CO2.

"""
README / BEFORE RUNNING:
- Prerequisites: Python 3.x, pandas, scikit-learn, matplotlib (pip install pandas scikit-learn matplotlib).
- Dataset: Uses 'datatraining.txt' bundled in the project directory.
- How to Run: python occupancy_cli.py
- Expected Behavior: Trains Decision Tree model, outputs accuracy score (>95%), displays confusion matrix, and predicts occupancy for sample sensor readings.
"""

import os
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
data_path = os.path.join(BASE_DIR, "datatraining.txt") if os.path.exists(os.path.join(BASE_DIR, "datatraining.txt")) else "datatraining.txt"
data = pd.read_csv(data_path)
data.columns = [col.replace('"', '').strip() for col in data.columns]

features = ["Temperature", "Humidity", "Light", "CO2"]
target = "Occupancy"

X = data[features]
y = data[target]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=42, stratify=y
)

model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
cm = confusion_matrix(y_test, y_pred)

print("\nRoom Occupancy Detection - Decision Tree")
print("Accuracy Score: {:.2f}%".format(accuracy * 100))
print("\nConfusion Matrix:")
print("                 Predicted")
print("              Not Occupied  Occupied")
print("Actual")
print("Not Occupied     {:5d}      {:5d}".format(cm[0][0], cm[0][1]))
print("Occupied         {:5d}      {:5d}".format(cm[1][0], cm[1][1]))

def prompt_float(prompt_text: str, default_val: float) -> float:
    inp = input(f"{prompt_text} [default {default_val}]: ").strip()
    return float(inp) if inp else default_val

temperature = prompt_float("\nEnter Temperature (deg C)", 23.18)
humidity = prompt_float("Enter Humidity (%)", 27.27)
light = prompt_float("Enter Light (Lux)", 426.0)
co2 = prompt_float("Enter CO2 (ppm)", 721.25)

new_data = pd.DataFrame({
    "Temperature": [temperature],
    "Humidity": [humidity],
    "Light": [light],
    "CO2": [co2]
})

prediction = model.predict(new_data)
probability = model.predict_proba(new_data)

print("\nPrediction Result:")
if prediction[0] == 1:
    print("Room Occupied")
else:
    print("Room Not Occupied")

print("Not Occupied Probability : {:.2f}%".format(probability[0][0] * 100))
print("Occupied Probability     : {:.2f}%".format(probability[0][1] * 100))
--------------------------------------------------------------------------------

2. occupancy_app.py
--------------------------------------------------------------------------------
"""
================================================================================
IOT EXPERIMENT 15: Decision Tree Room Occupancy Web Dashboard
================================================================================
Develop a Decision Tree model to classify room occupancy as Occupied or Not
Occupied using temperature, humidity, light, and CO₂ sensor data, and evaluate
the model using accuracy score and a confusion matrix.
================================================================================
"""

# Short Description: Interactive web dashboard allowing users to input live sensor parameters (light, CO2, temperature, humidity) and receive real-time occupancy predictions.

"""
README / BEFORE RUNNING:
- Prerequisites: Python 3.x, flask, scikit-learn, pandas (pip install flask scikit-learn pandas).
- Dataset: Uses 'datatraining.txt' in the local folder to train the model on startup.
- How to Run: python occupancy_app.py (open http://localhost:5000 in your browser).
- Expected Behavior: Trains model and serves interactive web form for live sensor occupancy classification.
"""

import os
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, ConfusionMatrixDisplay

st.set_page_config(page_title="Room Occupancy Detection", layout="wide")
st.title("Room Occupancy Detection")
st.write("Decision Tree Classification using Temperature, Humidity, Light and CO2 sensor data")

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
data_path = os.path.join(BASE_DIR, "datatraining.txt") if os.path.exists(os.path.join(BASE_DIR, "datatraining.txt")) else "datatraining.txt"
data = pd.read_csv(data_path)
data.columns = [col.replace('"', '').strip() for col in data.columns]

features = ["Temperature", "Humidity", "Light", "CO2"]
target = "Occupancy"

X = data[features]
y = data[target]

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.20, random_state=42, stratify=y
)

model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
cm = confusion_matrix(y_test, y_pred)

st.sidebar.title("Model Metrics")
st.sidebar.metric("Accuracy", f"{accuracy * 100:.2f}%")

st.header("Enter Room Sensor Data")
col1, col2 = st.columns(2)

with col1:
    temperature = st.number_input("Temperature (deg C)", min_value=-50.0, max_value=100.0, value=23.5, step=0.1)
    humidity = st.number_input("Humidity (%)", min_value=0.0, max_value=100.0, value=27.0, step=0.1)

with col2:
    light = st.number_input("Light (Lux)", min_value=0.0, value=400.0, step=1.0)
    co2 = st.number_input("CO2 (ppm)", min_value=0.0, value=800.0, step=10.0)

if st.button("Predict Room Occupancy"):
    new_data = pd.DataFrame({
        "Temperature": [temperature],
        "Humidity": [humidity],
        "Light": [light],
        "CO2": [co2]
    })

    prediction = model.predict(new_data)
    probability = model.predict_proba(new_data)

    st.subheader("Prediction Result")
    if prediction[0] == 1:
        st.success("ROOM OCCUPIED")
    else:
        st.info("ROOM NOT OCCUPIED")

    p_col1, p_col2 = st.columns(2)
    p_col1.metric("Not Occupied Probability", f"{probability[0][0] * 100:.2f}%")
    p_col2.metric("Occupied Probability", f"{probability[0][1] * 100:.2f}%")

st.subheader("Confusion Matrix")
fig, ax = plt.subplots()
display = ConfusionMatrixDisplay(confusion_matrix=cm, display_labels=["Not Occupied", "Occupied"])
display.plot(ax=ax)
st.pyplot(fig)
--------------------------------------------------------------------------------
