Deep Learning dalam Kebiasaan Berkendara

Arvin Rifqi Hanif

Sosial Media


2 orang menyukai ini
Suka

Summary

Perilaku mengemudi yang agresif adalah faktor utama penyebab kecelakaan lalu lintas jalan. Seperti yang dilaporkan oleh AAA Foundation for Traffic Safety, 106.727 kecelakaan fatal - 55,7 persen dari total kecelakaan - selama periode empat tahun terakhir melibatkan pengemudi yang melakukan satu atau lebih tindakan mengemudi yang agresif.

Description

Deskripsi Project

Mengemudi secara agresif termasuk mengebut, berhenti mendadak, dan berbelok ke kiri atau ke kanan secara mendadak. Semua kejadian ini tercermin pada data akselerometer dan giroskop. Oleh karena itu, mengetahui bahwa hampir semua orang memiliki smartphone saat ini yang memiliki berbagai macam sensor, maka kami telah merancang aplikasi pengumpul data di android berdasarkan sensor akselerometer dan giroskop.

Tujuan

Tujuan utama adalah memanfaatkan sensor-sensor ini yang umumnya ada pada smartphone untuk mendeteksi dan merekam perilaku mengemudi agresif, seperti kecepatan tinggi, pengereman mendadak, dan perubahan arah yang tiba-tiba. Dengan aplikasi ini, diharapkan dapat mengumpulkan data yang relevan untuk menganalisis dan memahami pola kebiasaan berkendara agresif menggunakan pendekatan deep learning.

 

Kode program dan cara kerja 

import pandas as pd: Mengimpor pustaka Pandas dengan alias 'pd'. Pandas digunakan untuk manipulasi dan analisis data, terutama bekerja dengan data tabular.

from sklearn.model_selection import train_test_split: Mengimpor fungsi train_test_split dari pustaka Scikit-learn. Fungsi ini digunakan untuk membagi dataset menjadi dua subset: satu untuk pelatihan model dan yang lainnya untuk pengujian.

from sklearn.preprocessing import StandardScaler, LabelEncoder: Mengimpor kelas StandardScaler dan LabelEncoder dari Scikit-learn. StandardScaler digunakan untuk menskalakan fitur-fitur data, sedangkan LabelEncoder digunakan untuk mengubah label kategori menjadi bentuk numerik.

from keras.models import Sequential: Mengimpor kelas Sequential dari Keras. Sequential digunakan untuk membuat model neural network berurutan, yang artinya lapisan-lapisan ditambahkan satu per satu secara berurutan.

from keras.layers import Dense: Mengimpor kelas Dense dari Keras. Dense digunakan untuk menambahkan lapisan-lapisan ke dalam model neural network, dan ini biasanya digunakan untuk menentukan lapisan-lapisan yang sepenuhnya terhubung (fully connected).

import matplotlib.pyplot as plt: Mengimpor modul pyplot dari Matplotlib dengan alias 'plt'. Modul ini digunakan untuk membuat visualisasi grafik, seperti plot garis dan histogram.

file_path = '/content/train_motion_data.csv': Menyimpan path atau lokasi file CSV yang akan dibaca dalam variabel file_path. Pastikan bahwa path yang diberikan sesuai dengan lokasi sebenarnya dari file CSV tersebut.

df = pd.read_csv(file_path): Menggunakan Pandas untuk membaca file CSV yang terletak di file_path dan memuatnya ke dalam suatu DataFrame, yang disimpan dalam variabel df. DataFrame adalah struktur data tabular dua dimensi yang umum digunakan oleh Pandas untuk menyimpan dan memanipulasi data.

df berfungsi untuk menampilkan isi data yang sudah diletakan didalam df

X = df.drop(['Class', 'Timestamp'], axis=1): Variabel X dibuat dengan menghapus dua kolom dari DataFrame df, yaitu 'Class' dan 'Timestamp'. Fungsi drop digunakan untuk menghapus kolom-kolom yang tidak dibutuhkan. axis=1 menunjukkan bahwa kita ingin menghapus kolom (bukan baris).

y = df['Class']: Variabel y dibuat untuk menyimpan kolom 'Class' dari DataFrame df.

label_encoder = LabelEncoder(): Membuat objek dari kelas LabelEncoder. LabelEncoder digunakan untuk mengonversi label kategori menjadi representasi numerik.

y_encoded = label_encoder.fit_transform(y): Menggunakan objek label_encoder untuk mengonversi label kategori yang disimpan dalam variabel y menjadi bentuk numerik. Metode fit_transform digunakan untuk melakukan dua langkah sekaligus: mengfit model pada data dan mentransformasikan data. Hasil transformasi disimpan dalam variabel y_encoded.

X_train, X_test, y_train, y_test = train_test_split(X, y_encoded, test_size=0.2, random_state=42): Fungsi ini membagi dataset menjadi empat subset:
X_train: Subset fitur untuk pelatihan.
X_test: Subset fitur untuk pengujian.
y_train: Subset label (terkait dengan data pelatihan).
y_test: Subset label (terkait dengan data pengujian).
Parameter yang digunakan:
X: Fitur yang ingin dibagi.
y_encoded: Label yang ingin dibagi (sudah dalam bentuk numerik setelah encoding).
test_size=0.2: Menentukan proporsi dataset yang akan dialokasikan untuk pengujian. Dalam contoh ini, 20% dari data akan digunakan untuk pengujian.
random_state=42: Digunakan untuk memastikan bahwa pembagian dataset bersifat reproducible atau dapat direproduksi, sehingga hasilnya konsisten pada setiap eksekusi.

scaler = StandardScaler(): Membuat objek dari kelas StandardScaler. StandardScaler digunakan untuk menskalakan fitur-fitur agar memiliki rata-rata nol dan varians satu. Ini membantu algoritma pembelajaran mesin yang sensitif terhadap skala untuk berperforma lebih baik.

X_train = scaler.fit_transform(X_train): Menggunakan objek scaler untuk menghitung rata-rata dan deviasi standar dari setiap fitur dalam dataset pelatihan (X_train), dan kemudian melakukan transformasi untuk menskalakan setiap fitur. Data hasil transformasi disimpan kembali dalam variabel X_train.

X_test = scaler.transform(X_test): Menggunakan nilai rata-rata dan deviasi standar yang telah dihitung dari dataset pelatihan (X_train) untuk melakukan transformasi yang sama pada dataset pengujian (X_test). Hal ini memastikan bahwa skala fitur pada dataset pengujian konsisten dengan skala fitur pada dataset pelatihan.

num_classes = len(label_encoder.classes_): Menggunakan atribut classes_ dari objek label_encoder untuk mendapatkan daftar unik dari kelas-kelas yang terdapat dalam label setelah encoding. len(label_encoder.classes_) menghitung jumlah kelas atau kategori dalam label tersebut. Hasilnya disimpan dalam variabel num_classes.

model = Sequential(): Membuat objek model sequential. Model sequential adalah tipe model Keras yang memungkinkan kita membuat model secara berurutan, dengan menambahkan lapisan satu per satu.

model.add(Dense(64, input_dim=X_train.shape[1], activation='relu')): Menambahkan lapisan pertama, yaitu lapisan Dense (lapisan sepenuhnya terhubung) dengan 64 unit, input_dim sesuai dengan jumlah fitur dalam data (X_train.shape[1]), dan menggunakan fungsi aktivasi ReLU ('relu'). Ini adalah lapisan input.

model.add(Dense(32, activation='relu')): Menambahkan lapisan kedua, juga lapisan Dense, dengan 32 unit dan fungsi aktivasi ReLU. Ini adalah lapisan tersembunyi.

model.add(Dense(num_classes, activation='softmax')): Menambahkan lapisan output, lapisan Dense dengan jumlah unit sesuai dengan jumlah kelas (num_classes) dan menggunakan fungsi aktivasi softmax. Softmax digunakan untuk menghasilkan output yang dapat diinterpretasikan sebagai probabilitas untuk setiap kelas.

loss='sparse_categorical_crossentropy': Menentukan fungsi kerugian (loss function) yang akan digunakan selama pelatihan. Dalam konteks klasifikasi multikelas (seperti yang tampaknya pada kasus ini), 'sparse_categorical_crossentropy' biasanya digunakan ketika label kelas bersifat diskrit (integer). Fungsi kerugian ini sesuai dengan masalah klasifikasi dengan lebih dari dua kelas.

optimizer='adam': Memilih optimizer yang akan digunakan untuk mengoptimalkan model selama pelatihan. 'Adam' adalah optimizer yang umum digunakan dan efisien dalam banyak kasus. Adam adalah singkatan dari Adaptive Moment Estimation.

metrics=['accuracy']: Menentukan metrik evaluasi yang akan digunakan untuk memantau kinerja model selama pelatihan dan evaluasi. Dalam hal ini, 'accuracy' digunakan untuk mengukur sejauh mana model berhasil memprediksi kelas dengan benar.

X_train dan y_train: Data pelatihan, dengan X_train berisi fitur-fitur dan y_train berisi label terkait.

epochs=10: Menentukan jumlah kali model akan melihat keseluruhan dataset pelatihan selama proses pelatihan. Satu epoch berarti model melihat dan memproses seluruh dataset pelatihan.

batch_size=32: Menentukan jumlah sampel yang digunakan untuk menghitung gradien dan memperbarui bobot model pada setiap iterasi. Batch size 32 berarti model akan menggunakan 32 sampel untuk setiap iterasi.

validation_data=(X_test, y_test): Data yang digunakan untuk evaluasi model pada setiap epoch selama pelatihan. Dalam hal ini, data pengujian (X_test dan y_test) digunakan untuk memantau performa model selama pelatihan.

loss, accuracy = model.evaluate(X_test, y_test): Metode evaluate digunakan untuk mengukur nilai kerugian (loss) dan akurasi (accuracy) model pada dataset pengujian (X_test dan y_test). Nilai-nilai ini kemudian disimpan dalam variabel loss dan accuracy.

print(f'Loss: {loss}, Accuracy: {accuracy}'): Mencetak nilai kerugian dan akurasi pada konsol. Dengan cara ini, Anda dapat melihat seberapa baik model Anda berperforma pada dataset pengujian.

plt.plot(history.history['accuracy']): Menambahkan garis untuk akurasi pada dataset pelatihan untuk setiap epoch.

plt.plot(history.history['val_accuracy']): Menambahkan garis untuk akurasi pada dataset pengujian untuk setiap epoch.

plt.title('Model Accuracy'): Menentukan judul plot.

plt.xlabel('Epoch'): Memberi label pada sumbu x dengan "Epoch".

plt.ylabel('Accuracy'): Memberi label pada sumbu y dengan "Accuracy".

plt.legend(['Train', 'Test'], loc='upper left'): Menambahkan legenda untuk setiap garis. "Train" untuk akurasi pada dataset pelatihan dan "Test" untuk akurasi pada dataset pengujian.

plt.show(): Menampilkan plot secara keseluruhan

Kesimpulan

Hasil pelatihan model dengan sepuluh epoch menunjukkan beberapa pola yang dapat disimpulkan. Selama pelatihan, terjadi peningkatan bertahap pada akurasi model pada dataset pelatihan, dimulai dari sekitar 37.74% pada Epoch pertama hingga mencapai 47.27% pada Epoch ke-10. Meskipun demikian, performa model pada dataset pengujian tidak mengalami peningkatan yang signifikan, dengan akurasi sekitar 34.43% pada awal pelatihan dan mencapai 40.74% pada akhir. Analisis lebih lanjut menunjukkan adanya kemungkinan overfitting, di mana model cenderung lebih baik dalam memprediksi data pelatihan daripada data pengujian. Hal ini terlihat dari penurunan nilai loss pada data pelatihan dari 1.0997 menjadi 1.0161, sementara nilai loss pada data pengujian cenderung naik dari 1.0966 menjadi 1.0670. Evaluasi akhir pada dataset pengujian menghasilkan akurasi sekitar 40.74% dengan loss sekitar 1.0670. Oleh karena itu, rekomendasi selanjutnya dapat mencakup penyesuaian arsitektur model atau hiperparameter untuk mengatasi potensi overfitting dan meningkatkan performa pada data pengujian. Evaluasi lebih lanjut dan fine-tuning dapat memberikan wawasan yang lebih mendalam tentang faktor-faktor yang memengaruhi kinerja model secara keseluruhan.

Informasi Course Terkait
  Kategori: Data Science / Big Data
  Course: Deep Learning Dengan Keras Python