15.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.

Dataset: https://archive.ics.uci.edu/dataset/357/occupancy%2Bdetection

pip install pandas numpy scikit-learn matplotlib seaborn ucimlrepo

occupancy.py:


import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from ucimlrepo import fetch_ucirepo
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import (
    accuracy_score,
    confusion_matrix,
    classification_report,
    ConfusionMatrixDisplay
)

# Fetch UCI Occupancy Detection dataset
dataset = fetch_ucirepo(id=357)

X = dataset.data.features
y = dataset.data.targets

# Combine features and target
df = pd.concat([X, y], axis=1)

# Clean column names
df.columns = df.columns.str.strip()

# Select required features
features = ["Temperature", "Humidity", "Light", "CO2"]

# Prepare input and output
X = df[features]
y = df["Occupancy"].squeeze()

# Remove missing values
data = pd.concat([X, y.rename("Occupancy")], axis=1)
data = data.dropna()

X = data[features]
y = data["Occupancy"]

# Split dataset into training and testing sets
X_train, X_test, y_train, y_test = train_test_split(
    X,
    y,
    test_size=0.2,
    random_state=42,
    stratify=y
)

# Create and train Decision Tree model
model = DecisionTreeClassifier(
    criterion="gini",
    max_depth=5,
    random_state=42
)

model.fit(X_train, y_train)

# Make predictions
y_pred = model.predict(X_test)

# Evaluate model
accuracy = accuracy_score(y_test, y_pred)

print("DECISION TREE OCCUPANCY DETECTION")
print("---------------------------------")
print("Accuracy:", round(accuracy * 100, 2), "%")

print("\nClassification Report:")
print(classification_report(y_test, y_pred))

# Confusion matrix
cm = confusion_matrix(y_test, y_pred)

print("Confusion Matrix:")
print(cm)

# Plot confusion matrix
ConfusionMatrixDisplay(
    confusion_matrix=cm,
    display_labels=["Not Occupied", "Occupied"]
).plot(cmap="Blues")

plt.title("Decision Tree Confusion Matrix")
plt.show()

# Feature importance
importance = pd.DataFrame({
    "Feature": features,
    "Importance": model.feature_importances_
})

print("\nFeature Importance:")
print(importance)

# Plot feature importance
plt.figure(figsize=(8, 5))

sns.barplot(
    data=importance,
    x="Importance",
    y="Feature"
)

plt.title("Feature Importance in Occupancy Detection")
plt.xlabel("Importance")
plt.ylabel("Sensor Features")
plt.tight_layout()
plt.show()

# Predict a new room condition
sample = pd.DataFrame(
    [[23.0, 27.0, 400.0, 600.0]],
    columns=features
)

prediction = model.predict(sample)[0]

print("\nNew Room Prediction:")

if prediction == 1:
    print("Room is Occupied")
else:
    print("Room is Not Occupied")
