16.Using the provided historical IoT environmental sensor dataset, develop a Linear Regression model to predict temperature using PM2.5, PM10, pressure, dew point, and wind speed. Train and evaluate the model, and predict the temperature for a new set of sensor readings.

Dataset : https://archive.ics.uci.edu/dataset/501/beijing

pip install pandas numpy scikit-learn matplotlib seaborn ucimlrepo

temperature_prediction.py:


import requests
import zipfile
import io
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import (
    mean_absolute_error,
    mean_squared_error,
    r2_score
)

# Download UCI Beijing Multi-Site Air Quality dataset
url = "https://archive.ics.uci.edu/static/public/501/beijing+multi+site+air+quality+data.zip"

print("Downloading dataset...")

response = requests.get(url, timeout=60)
response.raise_for_status()

# Extract CSV files from ZIP
zip_file = zipfile.ZipFile(io.BytesIO(response.content))

csv_files = [
    name for name in zip_file.namelist()
    if name.lower().endswith(".csv")
]

# Combine data from all monitoring stations
dataframes = []

for file in csv_files:
    with zip_file.open(file) as f:
        station_df = pd.read_csv(f)
        dataframes.append(station_df)

df = pd.concat(dataframes, ignore_index=True)

print("Dataset loaded successfully!")
print("\nFirst five records:")
print(df.head())

# Select input features and target
features = ["PM2.5", "PM10", "PRES", "DEWP", "WSPM"]
target = "TEMP"

# Convert selected columns to numeric
for column in features + [target]:
    df[column] = pd.to_numeric(df[column], errors="coerce")

# Remove missing values
df = df[features + [target]].dropna()
if df.empty:
    raise ValueError("No valid records available after removing missing values.")

print("\nDataset shape after cleaning:", df.shape)

# Prepare input and output
X = df[features]
y = df[target]

# 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
)

# Create and train Linear Regression model
model = LinearRegression()
model.fit(X_train, y_train)

# Predict temperature
y_pred = model.predict(X_test)

# Evaluate model
mae = mean_absolute_error(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

print("\nLINEAR REGRESSION RESULTS")
print("-------------------------")
print("Mean Absolute Error:", round(mae, 2))
print("Mean Squared Error:", round(mse, 2))
print("Root Mean Squared Error:", round(rmse, 2))
print("R2 Score:", round(r2, 4))

# Compare actual and predicted temperatures
comparison = pd.DataFrame({
    "Actual Temperature": y_test.values[:10],
    "Predicted Temperature": y_pred[:10]
})

print("\nActual vs Predicted Temperature:")
print(comparison)

# Actual vs predicted graph
plt.figure(figsize=(8, 5))

sns.scatterplot(
    x=y_test,
    y=y_pred,
    alpha=0.4
)

plt.xlabel("Actual Temperature")
plt.ylabel("Predicted Temperature")
plt.title("Actual vs Predicted Temperature")

plt.tight_layout()
plt.show()

# Feature importance using regression coefficients
importance = pd.DataFrame({
    "Feature": features,
    "Coefficient": model.coef_
})

print("\nRegression Coefficients:")
print(importance)

plt.figure(figsize=(8, 5))

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

plt.title("Feature Coefficients")
plt.tight_layout()
plt.show()

# Predict temperature for new sensor readings
sample = pd.DataFrame(
    [[35.0, 60.0, 1010.0, 5.0, 2.0]],
    columns=features
)

predicted_temperature = model.predict(sample)

print("\nPredicted Temperature for New Readings:")
print(round(predicted_temperature[0], 2), "°C")
