================================================================================
  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
--------------------------------------------------------------------------------
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("Room Occupancy Detection - Decision Tree")
print(f"Accuracy Score: {accuracy * 100:.2f}%")
print("Confusion Matrix:\n", cm)

sample = [[23.18, 27.27, 426.0, 721.25]]
prediction = model.predict(sample)[0]
print("Prediction for sample [23.18, 27.27, 426.0, 721.25]:", "Room Occupied" if prediction == 1 else "Room Not Occupied")
--------------------------------------------------------------------------------

2. occupancy_app.py
--------------------------------------------------------------------------------
import streamlit as st
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

st.title("Room Occupancy Detection")

data = pd.read_csv("datatraining.txt")
data.columns = [col.replace('"', '').strip() for col in data.columns]

features = ["Temperature", "Humidity", "Light", "CO2"]
X = data[features]
y = data["Occupancy"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)
model = DecisionTreeClassifier(random_state=42)
model.fit(X_train, y_train)

y_pred = model.predict(X_test)
st.write(f"Accuracy: {accuracy_score(y_test, y_pred) * 100:.2f}%")
st.write("Confusion Matrix:")
st.write(confusion_matrix(y_test, y_pred))

temp = st.number_input("Temperature (deg C)", value=23.5)
hum = st.number_input("Humidity (%)", value=27.0)
light = st.number_input("Light (Lux)", value=400.0)
co2 = st.number_input("CO2 (ppm)", value=800.0)

if st.button("Predict"):
    pred = model.predict([[temp, hum, light, co2]])[0]
    result = "OCCUPIED" if pred == 1 else "NOT OCCUPIED"
    st.success(f"Result: {result}")
--------------------------------------------------------------------------------
