Kesalahan Scaling Data di Machine Learning Menggunakan Scikit-Learn

Ulrich Wake
3 min readSep 1, 2019

--

Sumber google image

Dalam mengerjakan sebuah model machine learning, Anda pastinya dihadapkan dengan preprocessing data. Hal yang paling umum dilakukan ialah melakukan scaling data. Di machine learning, orang-orang umumnya akan menggunakan scikit-learn dalam pembuatan model mulai dari preprocessing hingga training dan testing model.

Dalam tulisan saya kali ini, saya ingin membahas kesalahan yang saya tidak sadari bahwa itu adalah sebuah kesalahan dan mengakibatkan kesalahan fatal dalam pembuatan model machine learning saya.

Anda pastinya mengetahui bahwa scikit-learn mempunyai fitur preprocessing seperti StandardScaler yang membuat tiap fitur memiliki nilai rata-rata 0 dan variansi 1. Ada juga RobustScaler yang memiliki fungsi hampir mirip dengan StandardScaler namun menggunakan nilai median dan quartiles. Tujuannya agar tidak rentan terhadap pencilan. Orang-orang juga biasa menggunakan MinMaxScaler yang berfungsi untuk mengubah data berada di rentang 0 sampai 1. Agar lebih mudah mengilustrasikan kesalahan ini, saya akan menggunakan MinMaxScaler. Saya sebelumnya pernah menulis tentang pentingnya scaling di machine learning di sini.

Oke, sekarang saya akan memperlihatkan kesalahan yang saya maksud. Saya menggunakan breast cancer dataset yang telah disediakan oleh scikit-learn.

Load dan membagi dataset

Output:

Dimensi data  (569, 30)
DImensi label (569,)
Dimensi training set (455, 30)
Dimensi test set (114, 30)

Total sampel data ialah 569 sampel dengan 30 fitur/kolom. Saya membaginya menjadi 80/20. Sekarang training dataset berdimensi (455, 30) dan test dataset berdimensi (114, 30). Pada artikel ini, saya tidak akan membahas lebih lanjut mengenai breast cancer dataset. Pembaca dapat melihatnya sendiri di sini jika penasaran.

Langkah selanjutnya yaitu membuat model dan melatih model menggunakan hasil sebelumnya. Model yang digunakan yaitu SVC. Sebelum pelatihan model, data terlebih dahulu dinormalisasi menggunakan MinMaxScaler. Namun, karena tidak sadar saya melakukan sebuah kesalahan fatal. Perhatikan kode berikut.

Penggunaan scaler yang salah

Output:

prediksi hasil training : 0.9824175824175824
prediksi hasil testing : 0.8947368421052632

Wow, hasil yang cukup bagus. Akurasi model 90%. Namun, saya melakukan sebuah kesalahan fatal. Dapatkah Anda melihatnya?

Kesalahan saya ialah saya membuat dua buah scaler. Satu scaler untuk training dataset dan satunya lagi test dataset. Seharusnya saya hanya membuat satu scaler saja dan menggunakan scaler tersebut untuk merubah training dataset dan test dataset. Belum paham ya? Wajar. Sebelum saya tunjukkan distribusi datanya, berikut kode yang benar.

Penggunaan scaler yang benar

Output:

prediksi hasil training : 0.9824175824175824
prediksi hasil testing : 0.9824561403508771

Kode di atas hanya menggunakan satu scaler. Apa sih maksudnya satu scaler atau dua scaler? Jadi ketika kita membuat sebuah scaler dan memanggil fit method maka kita sebenarnya sedang membuat sebuat scaler. Maka dari itu, memanggil fit method dua kali menyebabkan terbentuknya dua scaler seperti kode penggunaan scaler yang salah.

Berikut perbandingan distribusi data antara penggunaan scaler yang benar, salah, dan tanpa melakukan normalisasi data.

Output:

Perbandingan hasil normalisasi data

Gambar kiri adalah distribusi data sebelum normalisasi. Bandingkan distribusi data gambar kiri dan tengah. Jika melakukan normalisasi, harusnya distribusi datanya sama namun dengan skala yang lebih kecil. Akan tetapi, distribusi data gambar tengah sangat berbeda dengan distribusi gambar kiri. Perbedaannya jelas terlihat. Hal ini dikarenakan saya menormalisasi training dataset dan test dataset menggunakan dua buah scaler yang berbeda satu sama lain. Jadi setelah melakukan normalisasi, sebenarnya data sudah berbeda. Maka dari itu, model yang kita buat akan sia-sia saja.

Sekarang perhatikan gambar kanan dan gambar kiri lalu bandingkan kedua gambar tersebut. Kedua gambar tersebut sama persis, hanya berbeda di skala saja. Inilah cara melakukan normalisasi yang benar yaitu dengan menggunakan sebuah scaler saja.

Dengan menggunakan pipeline, maka kita akan lebih tahan terhadap kesalahan semacam ini. Pipeline sendiri akan saya bahas di masa yang akan datang.

--

--