================================================================================
  Experiment 17: Random Forest Air Quality Classification (city_day.csv)
================================================================================

FULL QUESTION:
Develop a Random Forest model to classify air quality into Good, Satisfactory, Moderate, Poor, Very Poor, or Severe using PM2.5, PM10, NO2, CO, SO2, and O3 data. Preprocess the dataset, train and evaluate the model, and predict the air quality category for a new set of pollutant readings.

SHORT QUESTION:
Random Forest 6-class air quality classifier trained on city_day.csv with evaluation and interactive single-sample prediction.

================================================================================
README & SETUP INSTRUCTIONS:
================================================================================
# Experiment 17: Random Forest Air Quality Classification

## Objective
Train a Random Forest classifier to categorize ambient air quality into Good, Satisfactory, Moderate, Poor, Very Poor, or Severe using PM2.5, PM10, NO2, CO, SO2, and O3.

## Dataset
Kaggle Indian Air Quality dataset (`city_day.csv`). Ensure `city_day.csv` is present in this folder.

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

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

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

1. air_quality_cli.py
--------------------------------------------------------------------------------
import os
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report

BASE_DIR = os.path.dirname(os.path.abspath(__file__))
data_path = os.path.join(BASE_DIR, "city_day.csv") if os.path.exists(os.path.join(BASE_DIR, "city_day.csv")) else "city_day.csv"
data = pd.read_csv(data_path)

features = ["PM2.5", "PM10", "NO2", "CO", "SO2", "O3"]
target = "AQI_Bucket"

required_columns = features + [target]
missing_columns = [col for col in required_columns if col not in data.columns]
if missing_columns:
    print("Missing columns:", missing_columns)
    exit()

data = data[features + [target]].dropna()

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

print("\nAir Quality Category Distribution:")
print(y.value_counts())

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

model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

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

print("\nModel Accuracy: {:.2f}%".format(accuracy * 100))

print("\nConfusion Matrix:")
cm = confusion_matrix(y_test, y_pred)
print(cm)

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

print("\nFeature Importances:")
for feat, imp in zip(features, model.feature_importances_):
    print("{:6s}: {:.4f}".format(feat, imp))

sample = [[65.0, 115.0, 35.0, 1.1, 14.5, 38.0]]
prediction = model.predict(sample)[0]
print("Predicted Air Quality Category for sample:", prediction)
--------------------------------------------------------------------------------

2. air_quality_app.py
--------------------------------------------------------------------------------
import streamlit as st
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, confusion_matrix

st.title("Air Quality Classification")

features = ["PM2.5", "PM10", "NO2", "CO", "SO2", "O3"]
target = "AQI_Bucket"

data = pd.read_csv("city_day.csv")[features + [target]].dropna()
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)
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train, y_train)

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

pm25 = st.number_input("PM2.5", value=75.0)
pm10 = st.number_input("PM10", value=140.0)
no2  = st.number_input("NO2", value=42.0)
co   = st.number_input("CO", value=1.4)
so2  = st.number_input("SO2", value=16.0)
o3   = st.number_input("O3", value=48.0)

if st.button("Predict"):
    pred = model.predict([[pm25, pm10, no2, co, so2, o3]])[0]
    st.success(f"Predicted Air Quality: {pred}")
--------------------------------------------------------------------------------
