Foto User
Prediksi CO2 Menggunakan Random Forest Regressor

Wisnu Tubagus

Sosial Media


1 orang menyukai ini
Suka

Summary

Di proyek ini, saya mengembangkan sebuah model prediksi menggunakan Random Forest Regressor untuk memperkirakan tingkat CO2. Saya mulai dengan membersihkan dan memproses data CSV yang terdiri dari timestamp dan berbagai fitur terkait lingkungan. Setelah mengisi nilai yang hilang dan menangani anomali, saya melakukan penskalaan fitur dan membagi data menjadi set pelatihan dan pengujian. Kemudian, saya melatih model menggunakan set pelatihan dan mengevaluasi kinerjanya dengan metrik Mean Squared Error (MSE) dan R-squared (R2) pada set pengujian. Setelah memvalidasi model, saya menyimpannya ke dalam file untuk digunakan di masa depan. Selanjutnya, saya menggunakan model yang disimpan untuk memprediksi tingkat CO2 untuk setiap menit besok, dengan menghasilkan tabel prediksi dan visualisasi grafik untuk memperlihatkan tren prediksi secara waktu.

Description

1. Eksplorasi Data Awal

saya melakukan analisis data menggunakan Pandas, sebuah library populer di Python untuk manipulasi dan analisis data. Data yang digunakan adalah file CSV yang disimpan di Google Drive, berisi informasi dengan kolom timestamp. Tujuan dari proyek ini adalah memuat data dari Google Drive, mengonversi kolom timestamp menjadi tipe data datetime, dan memberikan gambaran awal mengenai data melalui beberapa metode eksplorasi data dasar seperti menampilkan beberapa baris pertama, informasi umum tentang dataset, dan statistik deskriptif.
 

from google.colab import drive
drive.mount('/content/drive')
import pandas as pd

file_path = '/content/drive/MyDrive/Eddy/data_bersih.csv' 
data = pd.read_csv(file_path)

# Mengubah timestamp menjadi datetime dengan mengabaikan error
data['timestamp'] = pd.to_datetime(data['timestamp'], format='%Y-%m-%dT%H:%M:%S.%f', errors='coerce')

# Menampilkan beberapa baris pertama data
print(data.head())

# Menampilkan informasi umum tentang data
print(data.info())

# Menampilkan statistik deskriptif dari data
print(data.describe())

2. Visualisasi Data dengan Matplotlib dan Seaborn

Setelah melakukan eksplorasi data awal, langkah selanjutnya adalah melakukan visualisasi distribusi variabel penting dalam dataset. Saya menggunakan Matplotlib dan Seaborn untuk membuat plot distribusi CO2 dan arah angin. Visualisasi ini membantu dalam memahami pola dan karakteristik dari data tersebut.

import matplotlib.pyplot as plt
import seaborn as sns

# Menampilkan distribusi CO2
plt.figure(figsize=(10, 6))
sns.histplot(data['co2'], kde=True)
plt.title('Distribusi CO2')
plt.xlabel('CO2')
plt.ylabel('Frequency')
plt.show()

# Menampilkan distribusi arah angin
wind_directions = ['utara', 'barat', 'timur', 'selatan']
for direction in wind_directions:
   plt.figure(figsize=(10, 6))
   sns.histplot(data[direction], kde=True)
   plt.title(f'Distribusi Arah Angin: {direction}')
   plt.xlabel(direction)
   plt.ylabel('Frequency')
   plt.show()

3. Visualisasi Matriks Korelasi

Dalam bagian ini, saya membuat visualisasi matriks korelasi untuk melihat hubungan antara variabel-variabel dalam dataset. Saya menggunakan Seaborn untuk membuat heatmap dari matriks korelasi ini. Visualisasi ini membantu dalam mengidentifikasi hubungan linear antara variabel yang berbeda.

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(figsize=(12, 8))
correlation_matrix = data.corr()
sns.heatmap(correlation_matrix, annot=True, cmap='coolwarm')
plt.title('Correlation Matrix')
plt.show()

4. Penanganan Missing Values dan Outliers

Pada tahap ini, saya menangani missing values dan outliers dalam dataset. Missing values diisi dengan mean dari masing-masing kolom, sedangkan outliers ditangani dengan mengganti nilai yang berada di luar range tertentu dengan nilai batasnya. Ini dilakukan untuk menjaga integritas data tanpa menghapus baris yang mungkin berisi informasi penting.

# Mengisi missing values dengan mean
data_filled = data.fillna(data.mean())

# Menangani outliers dengan mengganti nilai yang berada di luar range dengan nilai batas (bukan menghapus baris)
def handle_outliers(df, column):
   Q1 = df[column].quantile(0.25)
   Q3 = df[column].quantile(0.75)
   IQR = Q3 - Q1
   lower_bound = Q1 - 1.5 * IQR
   upper_bound = Q3 + 1.5 * IQR
   df[column] = df[column].apply(lambda x: upper_bound if x > upper_bound else (lower_bound if x < lower_bound else x))

# Menangani outliers untuk semua kolom kecuali timestamp
for column in data_filled.columns[1:]:
   handle_outliers(data_filled, column)

print(data_filled.describe())

5. Standarisasi Data

Pada tahap ini, saya melakukan standarisasi data menggunakan StandardScaler dari Scikit-Learn. Standarisasi dilakukan untuk memastikan setiap fitur memiliki skala yang sama, yang penting untuk algoritma machine learning yang sensitif terhadap skala data. Saya menghapus kolom timestamp sebelum standarisasi dan kemudian menggabungkannya kembali setelah transformasi.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
data_scaled = scaler.fit_transform(data_filled.drop('timestamp', axis=1))

# Mengubah kembali ke DataFrame dengan nama fitur yang sama
data_scaled = pd.DataFrame(data_scaled, columns=data_filled.columns[1:])
data_scaled['timestamp'] = data_filled['timestamp'].values

print(data_scaled.head())

6. Pembagian Data untuk Pelatihan dan Pengujian Model

Pada tahap ini, saya membagi dataset menjadi data pelatihan dan data pengujian menggunakan train_test_split dari Scikit-Learn. Tujuan dari pembagian ini adalah untuk melatih dan menguji model prediksi CO2 menggunakan semua fitur kecuali timestamp.

from sklearn.model_selection import train_test_split

# Misalnya, prediksi CO2 menggunakan semua fitur kecuali timestamp
X = data_filled.drop(['timestamp', 'co2'], axis=1)
y = data_filled['co2']

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

7. Standarisasi Data Pelatihan dan Pengujian

Pada tahap ini, saya menggunakan StandardScaler dari Scikit-Learn untuk melakukan standarisasi terhadap data pelatihan (X_train) dan data pengujian (X_test). Standarisasi dilakukan agar semua fitur memiliki skala yang sama, yang penting untuk algoritma machine learning yang sensitif terhadap skala data.
 

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

8. Visualisasi Grafik Timestamp vs CO2 dari Data yang Difilter

Pada tahap ini, saya melakukan filter terhadap data berdasarkan rentang waktu yang relevan dari kolom timestamp. Data yang sudah difilter kemudian digunakan untuk membuat grafik yang menampilkan hubungan antara timestamp dan konsentrasi CO2. Visualisasi ini membantu dalam memahami pola atau tren CO2 dari waktu ke waktu.

import pandas as pd
import matplotlib.pyplot as plt

# Filter data berdasarkan rentang waktu yang relevan
filtered_data = data_filled[(data_filled['timestamp'].dt.minute >= 0.6) & (data_filled['timestamp'].dt.minute <= 36)]

# Plot grafik timestamp vs CO2 dari data yang sudah difilter
plt.figure(figsize=(12, 6))
plt.plot(filtered_data['timestamp'], filtered_data['co2'], marker='o', linestyle='-')
plt.title('Grafik CO2 terhadap Timestamp (Data Difilter)')
plt.xlabel('Timestamp')
plt.ylabel('CO2')
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

9. Visualisasi Grafik Timestamp vs CO2 untuk 30 Menit Pertama dari Data yang Difilter

Pada tahap ini, saya melakukan filter data berdasarkan rentang waktu yang relevan dari kolom timestamp. Setelah itu, saya mengambil hanya 30 menit pertama dari data yang sudah difilter. Grafik yang dihasilkan menampilkan hubungan antara timestamp dan konsentrasi CO2 selama 30 menit pertama dari data yang difilter. Visualisasi ini membantu dalam analisis lebih mendalam terhadap perubahan CO2 pada periode waktu yang singkat.

import pandas as pd
import matplotlib.pyplot as plt

# Filter data berdasarkan rentang waktu yang relevan (dari menit 0.6 hingga 36)
filtered_data = data_filled[(data_filled['timestamp'].dt.minute >= 0.6) & (data_filled['timestamp'].dt.minute <= 36)]

# Ambil hanya 30 menit pertama dari data yang sudah difilter
filtered_data_30min = filtered_data[filtered_data['timestamp'] <= filtered_data['timestamp'].iloc[0] + pd.Timedelta(minutes=30)]

# Plot grafik timestamp vs CO2 dari 30 menit pertama data yang sudah difilter
plt.figure(figsize=(12, 6))
plt.plot(filtered_data_30min['timestamp'], filtered_data_30min['co2'], marker='o', linestyle='-')
plt.title('Grafik CO2 terhadap Timestamp (30 Menit Pertama)')
plt.xlabel('Timestamp')
plt.ylabel('CO2')
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

10. Visualisasi Grafik Timestamp vs Arah Angin yang Dipilih

Pada tahap ini, saya melakukan filter data berdasarkan rentang waktu yang relevan dari kolom timestamp (jika diperlukan). Kemudian, saya mengambil hanya 30 menit pertama dari data yang sudah difilter. Selanjutnya, saya meminta input dari pengguna melalui terminal untuk memilih arah angin yang ingin diplot. Setelah validasi input, saya melakukan plot grafik yang menampilkan hubungan antara timestamp dan arah angin yang dipilih.

import pandas as pd
import matplotlib.pyplot as plt

# Filter data berdasarkan rentang waktu yang relevan (jika diperlukan)
filtered_data = data_filled[(data_filled['timestamp'].dt.minute >= 0.6) & (data_filled['timestamp'].dt.minute <= 36)]

# Ambil hanya 30 menit pertama dari data yang sudah difilter
filtered_data_30min = filtered_data[filtered_data['timestamp'] <= filtered_data['timestamp'].iloc[0] + pd.Timedelta(minutes=30)]

# Input dari terminal untuk memilih arah angin yang ingin diplot
wind_direction = input("Masukkan arah angin yang ingin Anda plot: ").lower()

# Validasi input arah angin
if wind_direction not in ['utara', 'barat', 'timur', 'selatan', 'bawah', 'atas']:
   print("Input arah angin tidak valid.")
else:
   # Plot grafik timestamp vs arah angin yang dipilih
   plt.figure(figsize=(12, 6))
   plt.plot(filtered_data['timestamp'], filtered_data[wind_direction], marker='o', linestyle='-')
   plt.title(f'Grafik Arah Angin: {wind_direction}')
   plt.xlabel('Timestamp')
   plt.ylabel('Arah Angin')
   plt.grid(True)
   plt.xticks(rotation=45)
   plt.tight_layout()
   plt.show()

11. Persiapan Data untuk Prediksi CO2 Tanpa Timestamp

Pada tahap ini, saya mempersiapkan data untuk melakukan prediksi konsentrasi CO2 menggunakan Random Forest Regressor. Data diawali dengan filter berdasarkan rentang waktu yang relevan dari kolom timestamp (jika diperlukan). Selanjutnya, saya memisahkan data menjadi data pelatihan dan data pengujian menggunakan train_test_split dari Scikit-Learn.

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score
import joblib
from google.colab import files

# Filter data berdasarkan rentang waktu yang relevan (jika diperlukan)
filtered_data = data_filled[(data_filled['timestamp'].dt.minute >= 0.6) & (data_filled['timestamp'].dt.minute <= 36)]

# prediksi CO2 menggunakan semua fitur kecuali timestamp
X = data_filled.drop(['timestamp', 'co2'], axis=1)  # Drop 'co2' karena ini variabel target
y = data_filled['co2']

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

12. Pembuatan dan Pelatihan Model Random Forest

Pada tahap ini, saya membuat model Random Forest Regressor dengan menggunakan RandomForestRegressor dari Scikit-Learn. Model ini diset dengan n_estimators=100 untuk menggunakan 100 pohon keputusan dan random_state=42 untuk hasil yang dapat direproduksi.

Setelah membuat model, saya melatihnya menggunakan data pelatihan (X_train dan y_train).

from sklearn.ensemble import RandomForestRegressor

# Buat model Random Forest
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)

# Latih model dengan data training
rf_model.fit(X_train, y_train)

13. Evaluasi Model Random Forest

Pada tahap ini, saya menggunakan model Random Forest Regressor yang telah dilatih sebelumnya dengan data pelatihan (X_train dan y_train). Setelah model dilatih, saya melakukan prediksi terhadap data pengujian (X_test) dan menghitung metrik evaluasi performa model seperti Mean Squared Error (MSE) dan R-squared (R2).

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

# Buat model Random Forest
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)

# Latih model dengan data training
rf_model.fit(X_train, y_train)

# Lakukan prediksi dengan data testing
y_pred = rf_model.predict(X_test)

# Evaluasi model
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error (MSE): {mse}')
print(f'R-squared (R2): {r2}')

14. Ekstraksi Fitur Temporal dari Timestamp

Pada tahap ini, saya mengekstraksi fitur-fitur temporal seperti tahun, bulan, hari, jam, menit, dan detik dari kolom timestamp dalam dataset. Fitur-fitur temporal ini dapat memberikan informasi tambahan yang berguna untuk analisis data terkait dengan variabilitas waktu.

# Ekstraksi fitur-fitur temporal dari timestamp
data_filled['year'] = data_filled['timestamp'].dt.year
data_filled['month'] = data_filled['timestamp'].dt.month
data_filled['day'] = data_filled['timestamp'].dt.day
data_filled['hour'] = data_filled['timestamp'].dt.hour
data_filled['minute'] = data_filled['timestamp'].dt.minute
data_filled['second'] = data_filled['timestamp'].dt.second

# Menampilkan beberapa baris pertama data yang sudah ditambahkan fitur temporal
print(data_filled.head())

15. Pemrosesan Data Lanjutan

Pada tahap ini, saya melakukan beberapa langkah penting dalam pemrosesan data untuk persiapan model prediksi CO2:

a. Menghapus Kolom Timestamp: Kolom timestamp dihapus dari dataset karena kita telah mengekstraksi fitur-fitur temporalnya sebelumnya.

b. Menentukan Fitur dan Target: Fitur untuk model adalah semua kolom kecuali co2, sedangkan co2 adalah target yang akan diprediksi.

c. Membagi Data: Data dibagi menjadi data pelatihan (X_train dan y_train) serta data pengujian (X_test dan y_test) menggunakan train_test_split dari Scikit-Learn.

import pandas as pd
from sklearn.model_selection import train_test_split

# Drop kolom timestamp
data_filled = data_filled.drop('timestamp', axis=1)

# Menentukan fitur dan target
X = data_filled.drop('co2', axis=1)
y = data_filled['co2']

# Membagi data menjadi data training dan testing
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

16. Evaluasi Model Random Forest

from sklearn.ensemble import RandomForestRegressor
from sklearn.metrics import mean_squared_error, r2_score

# Buat model Random Forest
rf_model = RandomForestRegressor(n_estimators=100, random_state=42)

# Latih model dengan data training
rf_model.fit(X_train, y_train)

# Lakukan prediksi dengan data testing
y_pred = rf_model.predict(X_test)

# Evaluasi model
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f'Mean Squared Error (MSE): {mse}')
print(f'R-squared (R2): {r2}')

17. Penyimpanan Model ke File

Selanjutnya saya menggunakan joblib.dump untuk menyimpan model Random Forest yang telah dilatih ke dalam sebuah file. File ini dapat digunakan nanti untuk melakukan prediksi di masa mendatang tanpa perlu melatih ulang model.

import joblib

# Tentukan path tempat menyimpan model
model_path = '/content/drive/MyDrive/Eddy/random_forest_model_with_timestamp.pkl'

# Simpan model ke file
joblib.dump(rf_model, model_path)

print(f'Model berhasil disimpan di {model_path}')

18. Prediksi Tingkat CO2 untuk Besok

Pada tahap selanjutnya, saya menggunakan model Random Forest yang telah dilatih sebelumnya untuk memprediksi tingkat CO2 untuk setiap menit besok.
 

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import joblib

# Load the trained model
model_path = '/content/drive/MyDrive/Eddy/random_forest_model_with_timestamp.pkl'
rf_model = joblib.load(model_path)

# Generate future dates from 00:00 to 23:59 for tomorrow
tomorrow_date = pd.Timestamp.now().normalize() + pd.Timedelta(days=1)
future_dates = pd.date_range(start=tomorrow_date, periods=24*60, freq='T')

# Extract temporal features from future timestamps
future_data = pd.DataFrame({
   'year': future_dates.year,
   'month': future_dates.month,
   'day': future_dates.day,
   'hour': future_dates.hour,
   'minute': future_dates.minute,
   'second': future_dates.second,
})

# Load the original data to get column names and default values
file_path = '/content/drive/MyDrive/Eddy/data_bersih.csv'
original_data = pd.read_csv(file_path)

# Ensure future_data has all the columns that were used in training
for column in original_data.columns:
   if column not in future_data.columns:
       if column != 'timestamp' and column != 'co2':  # Exclude target and timestamp columns
           future_data[column] = original_data[column].mean()  # Use mean value or any other default value

# Reorder columns to match the training data
if hasattr(rf_model, 'feature_names_in_'):  # Check if the model has feature names attribute
   future_data = future_data[rf_model.feature_names_in_]

# Predict CO2 levels for each minute of tomorrow
future_predictions = rf_model.predict(future_data)

# Ensure 'prediction_table' or 'future_dates' has correct values from 'future_predictions'
prediction_table = pd.DataFrame({
   'timestamp': future_dates,
   'predicted_co2': future_predictions
})

# Print the first few rows to verify
print(prediction_table.head())

# Visualize the prediction results
plt.figure(figsize=(15, 6))
plt.plot(prediction_table['timestamp'], prediction_table['predicted_co2'], label='Predicted CO2 levels')
plt.xlabel('Time')
plt.ylabel('CO2 level')
plt.title('Predicted CO2 levels for tomorrow')
plt.legend()
plt.grid(True)
plt.show()

# Optionally, save 'prediction_table' to a CSV file
prediction_table.to_csv('/content/drive/MyDrive/Eddy/predicted_co2_levels.csv', index=False)

Informasi Course Terkait
  Kategori: Algoritma dan Pemrograman
  Course: Machine Learning Dengan Scikit Learn Python