Taha pertama ditunjukan pada gambar diatas merupakan script kode Python yang
mengimpor modul datetime dan mendefinisikan beberapa variabel. Kode ini juga mencetak
beberapa informasi tentang proyek dan pengguna.
Bagian pertama dari kode tersebut mendefinisikan versi notebook, judul, awalan, dan judul
proyek menggunakan modul datetime. Versi notebook diatur ke '2.0.0', sedangkan judul
notebook diatur ke 'kualitas_air_ann_so_2.0.0'. Awalan diatur ke waktu UTC saat ini dalam
format tahun-bulan-hari-jam:menit, sedangkan judul proyek diatur ke awalan yang
digabungkan dengan judul notebook.
Bagian kedua dari kode ini memasang Google Drive sebagai tempat untuk menyimpan hasil
pelatihan. Hal ini dilakukan dengan menggunakan metode drive.mount() dari modul
google.colab.
Terakhir, baris kode terakhir mendefinisikan variabel drop_path dengan path ke direktori
dropbox di Google Drive pengguna.
Kode di atas kemungkinan merupakan bagian dari proyek yang lebih besar atau buku catatan
untuk melatih jaringan syaraf tiruan untuk memprediksi kualitas air. Nama pengguna, kelas,
dan ID siswa juga disertakan dalam hasil cetakan, menunjukkan bahwa ini adalah proyek
sekolah.
Kode di atas menginstal dan mengimpor dua paket Python, umakit dan hidrokit.
Bagian pertama dari kode tersebut menginstal paket umakit dari repositori github
https://github.com/taruma/umakit menggunakan manajer paket pip. Paket ini digunakan
untuk tujuan pencatatan, yang berarti membantu melacak apa yang terjadi selama proses
pelatihan. Paket ini diimpor menggunakan baris dari umakit.logtool import LogTool, yang
mengimpor kelas LogTool dari modul umakit.logtool. Sebuah instance dari kelas ini
kemudian dibuat menggunakan mylog = LogTool(), yang digunakan untuk mencatat proses
pelatihan.
Bagian kedua dari kode tersebut menginstal paket hidrokit dari repositori github
https://github.com/taruma/hidrokit menggunakan manajer paket pip. Paket ini digunakan
untuk prapemrosesan data dan plotting. Paket ini diinstal menggunakan baris !pip install
hidrokit, yang menginstal paket di lingkungan saat ini.
Kode tersebut adalah kode Python yang digunakan untuk memuat dataset dan mengimpor
data ke dalam pandas DataFrame. Berikut adalah analisis baris per baris:
Mengunggah Dataset
from google.colab import files
uploaded = files.upload()
Kode ini adalah untuk mengunggah dataset dari komputer lokal ke Google Colaboratory.
Analisis selanjutnya adalah sebagai berikut.
1. Import dataset ke pandas.DataFrame
import pandas as pd
Pada baris ini, kita mengimpor modul pandas dan memanggilnya sebagai "pd".
#import dataset
dataset = pd.read_excel('PLOT DATA DUGA AIR 2013.xlsx', skiprows=[0])
Kode ini memuat dataset dari file Excel 'PLOT DATA DUGA AIR 2013.xlsx' dan
menyimpannya dalam variabel "dataset". Fungsi "read_excel" adalah fungsi bawaan pandas
yang digunakan untuk membaca data dari file Excel. Parameter "skiprows" digunakan untuk
melewatkan baris pertama dari file Excel yang biasanya berisi judul atau header.
2. Menamai kolom
dataset.columns =
["tanggal","JAN","FEB","MAR","APR","MEI","JUN","JUL","AGS","SEP","OKT","NOV",
"DES"]
Kode ini memberikan nama untuk setiap kolom dalam DataFrame. Dalam kode di atas,
kolom-kolom tersebut adalah "tanggal", "JAN", "FEB", "MAR", "APR", "MEI", "JUN",
"JUL", "AGS", "SEP", "OKT", "NOV", dan "DES".
3. Mengatur index dataframe ke tanggal
dataset = dataset.set_index('tanggal')
Kode ini mengatur indeks DataFrame ke kolom "tanggal" yang telah diberi nama
sebelumnya. Ini akan memungkinkan kita untuk dengan mudah mengambil data berdasarkan
tanggal.
4. Mengubah tipe data kolom index menjadi datetime
dataset.index = pd.to_datetime(dataset.index, format='%Y-%m-%d')
Kode ini mengubah tipe data kolom indeks dari string ke tipe data datetime. Fungsi
"to_datetime" digunakan untuk melakukan konversi ini. Format '%Y-%m-%d' menentukan
format tanggal yang diharapkan.
5. Output
Setelah kode dieksekusi, tidak ada output yang dihasilkan secara eksplisit. Namun, data telah
dimuat ke dalam DataFrame, dan DataFrame tersebut siap untuk digunakan untuk analisis
lebih lanjut.
Pada grafik hasil visualisasi diatas akan dibaca ada beberapa data yang hilang oleh sistem,
untuk itu program coding untuk untuk mendeteksi data yang hilang/tidak terbaca harus
dilakukan
Dari visualisasi diatas diketahui bahwa terdapat kolom yang memiliki distribusi tidak normal,
sehingga dalam scaling digunakan MinMaxScaler.
Kemudian tahap selanjutnya yaitu tahap proses pengolahan data dari new_dataset, proses
pertama yaitu pembagian training set dan test set
Setelah itu kita lakukan proses scaling dengan menggunaka skala yaitu MinMaxScaler.
MinMaxscaler adalah salah satu Teknik saclling data yang digunakan untuk mengubah ddata
numerik pada rentang skala tertentu (biasanya 0 hingga 1) tanpa mengubah distribusi relative
dari nilai-nilai tersebut.dan dialukan juga proses mempresentasikan timesteps.
Kemudian melanjutkan proses training
Selanjutnya pada kode yang diberikan diatas mendefinisikan sebuah fungsi bernama
build_model dan membuat sebuah objek KerasRegressor bernama model menggunakan
fungsi ini. Fungsi build_model membutuhkan beberapa argumen:
optimizer (nilai default 'adam'): pengoptimal yang akan digunakan saat mengkompilasi
model.
activation (nilai default 'sigmoid'): fungsi aktivasi yang akan digunakan pada lapisan padat.
first_layer (nilai default 10): jumlah neuron pada lapisan pertama.
hidden_layers (nilai default [30]): sebuah daftar bilangan bulat yang merepresentasikan
jumlah neuron pada setiap lapisan tersembunyi.
p (nilai default 0): probabilitas dropout untuk semua lapisan Dropout.
message (nilai default True): sebuah bendera boolean yang mengindikasikan apakah akan
mencetak pesan atau tidak selama pembuatan model.
Fungsi ini membuat model Sequential dan menambahkan lapisan Dense dengan neuron
first_layer dan fungsi aktivasi yang ditentukan. Lapisan Dropout ditambahkan dengan
probabilitas dropout yang ditentukan p.
Jika hidden_layers tidak kosong, fungsi ini akan membuat sebuah perulangan yang
menambahkan lapisan Dense dan Dropout untuk setiap elemen x dalam hidden_layers. Untuk
setiap lapisan Dense, jumlah neuron sama dengan x dan fungsi aktivasi sama dengan aktivasi.
Jika x adalah elemen terakhir di hidden_layers, sebuah lapisan Dropout dengan probabilitas
dropout p/2 ditambahkan setelah lapisan Dense. Jika tidak, sebuah lapisan Dropout dengan
probabilitas dropout p ditambahkan.
Terakhir, sebuah Dense layer dengan satu neuron ditambahkan ke output, dan model disusun
dengan pengoptimal yang ditentukan, loss function (mean_squared_error), dan metrik (mse
dan mae). Jika pesan bernilai True dan variabel idx didefinisikan dalam ruang nama global,
sebuah pesan dicetak dengan nilai saat ini dari idx dan idx dikurangi 1. Jika idx adalah
kelipatan 10, sebuah karakter baris baru akan dicetak sebelum pesan.
Model objek KerasRegressor dibuat dengan menggunakan argumen build_fn, yang diatur ke
fungsi build_model. Argumen verbose diatur ke 0, yang berarti tidak ada output yang akan
dicetak selama pelatihan.
Berikutnya, kode yang diatas diawali dengan mengimpor GridSearchCV dari modul
sklearn.model_selection dan mendefinisikan kamus param_grid yang berisi
hiperparameter dan nilai yang sesuai untuk dicari selama penyetelan hiperparameter.
Kode ini juga mendefinisikan sebuah variabel cv yang diatur ke [(slice(None), slice(None))],
yang mengabaikan K-Fold Cross Validation dan menggunakan seluruh dataset untuk
pelatihan dan pengujian. Sebagai alternatif, Anda dapat mengaturnya menjadi bilangan bulat
untuk menentukan jumlah lipatan yang digunakan untuk validasi silang.
Terakhir, kode tersebut membuat objek GridSearchCV bernama grid_search. Argumen
estimator diatur ke objek model yang telah dibuat sebelumnya, yang menggunakan fungsi
build_model untuk mendefinisikan arsitektur jaringan saraf. Argumen param_grid diatur ke
kamus param_grid yang telah didefinisikan sebelumnya. Argumen cv diatur ke variabel cv
yang telah didefinisikan sebelumnya. Argumen return_train_score diatur ke True, yang berarti
bahwa skor pelatihan akan dikembalikan begitu juga dengan skor validasi. Argumen verbose
diatur ke 1, yang berarti bahwa pesan kemajuan akan dicetak selama pencarian. Argumen
penilaian diatur ke 'neg_mean_squared_error', yang berarti bahwa rata-rata kesalahan kuadrat
akan digunakan sebagai metrik penilaian untuk pencarian.
Kode tersebut terdiri dari beberapa bagian yang melakukan tugas-tugas berikut:
1. Menghitung indeks pencarian (idx) dengan mengalikan jumlah nilai dalam setiap
hyperparameter di grid pencarian (param_grid) untuk mendapatkan jumlah iterasi
pencarian. Variabel search_steps bertindak sebagai akumulator yang menghitung
jumlah iterasi yang diperlukan.
2. Jika parameter cv bertipe integer, maka nilai idx dikalikan dengan nilai cv. Hal ini
menunjukkan bahwa cross-validation akan dilakukan sebanyak nilai cv.
3. Melakukan fitting dengan menggunakan grid search, yaitu mencari kombinasi
hyperparameter yang terbaik pada model.
4. Memulai waktu (start time) fitting dengan menggunakan fungsi add_savepoint dari
modul mylog.
5. Mengeksekusi grid_search.fit() untuk melakukan fitting model pada data training
(X_train dan y_train), dan menggunakan validation_split untuk validasi model.
6. Mengakhiri waktu (end time) fitting dengan menggunakan fungsi add_savepoint dari
modul mylog.
7. Menampilkan durasi waktu yang diperlukan untuk fitting model dengan
menggunakan fungsi add_duration dari modul mylog.
Secara keseluruhan, kode tersebut digunakan untuk melakukan grid search pada model dan
menghitung waktu yang dibutuhkan untuk menyelesaikan fitting model. Fungsi
add_savepoint dan add_duration dari modul mylog digunakan untuk merekam log waktu
yang dibutuhkan dalam melakukan fitting model.
Kode diatas terdiri dari dua bagian yang melakukan tugas berikut:
1. Menyimpan objek model terbaik yang ditemukan melalui grid search ke dalam
variabel final_model. Kode tersebut mengakses atribut best_estimator_ dari objek
grid_search untuk mendapatkan model terbaik, dan kemudian mengambil atribut
model dari model terbaik tersebut. Dengan cara ini, variabel final_model akan berisi
model yang memiliki kombinasi hyperparameter terbaik.
2. Menyimpan hasil grid search ke dalam DataFrame dengan menggunakan modul
pandas. Hasil tersebut disimpan dalam variabel df_cv dan dapat digunakan untuk
analisis selanjutnya. DataFrame tersebut akan berisi informasi tentang kombinasi
hyperparameter yang dicoba dan hasil evaluasi model untuk setiap kombinasi
tersebut.
Secara keseluruhan, kedua bagian kode tersebut digunakan untuk menyimpan model terbaik
dan hasil grid search dalam format yang dapat digunakan untuk analisis selanjutnya.
Kode tersebut berfungsi untuk menyimpan model terbaik dan hasil grid search ke dalam file.
Lebih spesifik, kode tersebut terdiri dari empat bagian yang melakukan tugas berikut:
Secara keseluruhan, kode tersebut digunakan untuk mempersiapkan data yang akan
digunakan untuk melakukan prediksi dengan model yang sudah disimpan sebelumnya. Proses
ini melibatkan pengubahan format data dari DataFrame ke numpy array, scaling data, dan
membuat tabel timestep yang akan digunakan sebagai input model. Variabel array_test_ts
berisi data yang sudah dipersiapkan dengan format numpy array dan jumlah timesteps yang
telah ditentukan. Variabel df_test digunakan untuk merekam log yang berisi hasil data yang
sudah dipersiapkan untuk prediksi. Berikut data output yang dihasilkan
Berikutnya, kode dibawah ini melakukan beberapa tugas berikut:
1. Memisahkan input (X_test) dan target (y_test) dari data uji (test_dataset) yang sudah
dipersiapkan sebelumnya dengan menghapus kolom yang tidak perlu (drop_col) dan
memilih kolom target (target_col) pada DataFrame df_test.
2. Mengubah DataFrame X_test dan y_test menjadi numpy array untuk digunakan
sebagai input dan target model.
3. Mencetak dimensi dari X_test dan y_test untuk memastikan ukuran yang sesuai.
4. Melakukan prediksi dengan menggunakan model yang sudah disimpan sebelumnya
dan menghitung nilai kebenaran (truth) berdasarkan data target yang sebenarnya
(y_test).
Kode tersebut digunakan untuk melakukan prediksi dengan menggunakan model yang sudah
disimpan sebelumnya dengan data uji yang sudah dipersiapkan sebelumnya. Hasil prediksi
kemudian digunakan untuk menghitung nilai kebenaran terhadap data target yang sebenarnya.
Variabel predict dan truth berisi hasil prediksi dan nilai kebenaran (yang diambil dari data
target yang sebenarnya) secara berturut-turut.
1. Membuat objek MinMaxScaler baru (sc_test) yang hanya akan digunakan untuk
scaling kolom output.
2. Mengambil parameter scaling (min_, scale_, data_min_, dan data_max_) yang
dihitung pada tahap training untuk kolom output.
3. Mengubah hasil prediksi (predict) dan nilai kebenaran (truth) dari skala yang telah
distandarisasi kembali ke skala aslinya.
4. Menyimpan hasil prediksi dan nilai kebenaran dalam sebuah DataFrame (diff_table).
5. Menghitung selisih (absolute) antara prediksi dan nilai kebenaran dan menyimpannya
sebagai kolom baru pada DataFrame (diff_table).
6. Mentranspose DataFrame (diff_table) untuk memudahkan pembacaan.
Kode tersebut digunakan untuk melakukan scaling balik dari hasil prediksi dan nilai
kebenaran ke skala aslinya, sehingga memungkinkan untuk dilakukan perbandingan antara
nilai prediksi dan nilai sebenarnya. Hasil prediksi dan nilai kebenaran kemudian disimpan
dalam sebuah DataFrame untuk memudahkan analisis perbandingan antara keduanya. Selain
itu, dengan menghitung selisih antara prediksi dan nilai kebenaran, kita dapat melihat
seberapa besar kesalahan prediksi yang dilakukan oleh model.
Pada blok kode tersebut dilakukan evaluasi performa model menggunakan metrik pada data
training dan data test.
1. Pertama, dilakukan evaluasi pada data training dengan memanggil method
final_model.evaluate() pada variabel metrics_train. Kemudian, dilakukan evaluasi
pada data test dengan memanggil method yang sama pada variabel metrics_test.
2. Selanjutnya, dilakukan loop untuk mencetak metrik yang tersedia beserta nilai metrik
untuk data training dan data test.
3. Setelah itu, dilakukan penghitungan nilai Mean Squared Error (MSE) dan Mean
Absolute Error (MAE) pada data test set setelah dikembalikan ke skala original
dengan menggunakan mean_squared_error dan mean_absolute_error dari scikit-learn.
Hasilnya dicetak pada layar menggunakan f-string.
Visualisasi pada grafik nilai prediksi dan observasi, terdapat kecenderungan nilai pada salah
satu variabel yang berada pada garis diagonal. Hal ini menunjukkan bahwa model cukup baik
dalam memprediksi kualitas air pada tahap tertentu data yang diberikan atau dengan kata lain
diketahui bahwa ‘final_model’ mampu mengikuti fluktuasi data observasi yang dilakukan.
Pada plot titik prediksi dan observasi, titik-titik yang mewakili nilai prediksi dan observasi
akan ditempatkan pada sumbu x ‘truth_value’ dan y ‘Prediction_value’. Nilai prediksi dan
observasi ditampulkan sesuai data dengan tampilan beberapa titik berada diposisi yang sama,
dibuktikan bahwa model dapat memprediksi nilai kualitas air dengan sangat baik. Dari dua
grafik diatas terlihat bahwa terdapat hasil prediksi yang negatif meski pada kejadian nyata
bahwa nilai negatif tidak mungkin untuk kualitas air.
(4.5) Nilai beda prediksi dan observasi (residu) mengukur akar rata-rata kuadrat perbedaan
antara nilai prediksi dan observasi. Semakin kecil nilai RMSE, semakin akurat model dalam
memprediksi kualitas air.
Dari statistik deskriptif diatas diketahui bahwa nilai median (50%) sebesar 0.136631 Dengan
rata-rata nilai beda sebesar 0.261498 perlu diperhatikan juga nilai standar deviasi 0.267359
Ini kembali lagi ke nilai toleransi/ketelitian pada parameter tersebut, apakah rata-rata 0.2
termasuk signifikan atau tidak.
Interpretasi model neural networks dengan codingan menghilangkan tanda ‘[ ]’ dan memilih
kolom yang akan digunakan untuk interpretasi kemudian mengurutkan value grid
‘rank_test_score’ sehingga berdasarkan GridSearchCV Diperoleh model terbaik dengan
parameter sebagaimana sigmoid sebagai activation dan adam untuk optimizer. Relu sebagai
activation dan adam untuk optimizer dengan model terburuk.
Evaluasi hasil GridSearchCV menurut data maka diperlukan sebanyak 20 hasil terbaik
evaluasi ‘grid_sorted’ dan menghitung nilai unik tiap kolom. Dari informasi diatas diketahui
bahwa aktivasi sigmoid memiliki performa lebih baik dibandingkan relu. Selain parameter
aktivasi, tidak ada perbedaan signifikan dengan pemilihan parameter model.
Dari kurva diatas bisa dilihat nilai beda antara rank_test_score mendekati 0.020 - 0.015
dimulai dari urutan ke 10.