Feature scaling

Feature scaling

Ada hal yang perlu diperhatikan ketika melakukan pemodelan ML yaitu memastikan kita memiliki skala yang sama untuk setiap kolom atau variabel yang kita miliki. Sebagai contoh mudah, kita lihat proses preprocessing dan pembagian training dan test set sebelumnya. Dataset yang kita miliki adalah sebagai berikut:

Pada kolom ‘Usia’, rentangnya adalah dari 30-an sampai 50-an. Maka selisihnya kurang lebih 20 poin. Sekarang kita lihat kolom ‘Gaji’. Rentangnya sangat besar mulai  dari 500K sampai 800K, maka selisihnya sekitar 300K. Jika kita tidak menyamakan skalanya ini akan menjadi maslaah bagi model ML kita. Apa masalahnya?

Pada model ML secara umum, skala yang digunakan adalah jarak euclidean (euclidean distance). jarak euclidean adalah jarak antara dua titik yang merupakan hasil dari akar dari penjumlahan selisih kuadrat keduanya. Ilustrai mudahnya dapat dilihat melalui gambar di bawah ini:

Mari kita ambil contoh baris ke-2 dengan baris ke-8, di mana kolom usia sebagai X dan kolom Gaji sebagai Y. Maka jarak euclideannya adalah

X = kudrat dari 48-27 =  441

Y = kuadrat dari 48000-79000 = 961 juta

Jika kita ambil akar dari X dan Y, maka sudah jelas koordinat X tidak berarti apa-apa karena terlalu kecil. Sementara koordinat Y dengan nilai jutaan jelas mendominasi, yang nantinya membuat model ML kita menjadi tidak optimal. Tentunya kita tidak menginginkan ini. Oleh karena itu perlu proses yang disebut dengan feature scaling yaitu dengan mentransformasikan kolom ‘Usia’ dan ‘Gaji’ menjadi nilai dengan rentang dari -1 sampai 1 melalui aritmatika standardisasi atau normalisasi.

Proses feature scaling dilakukan dengan menulis script sebagai berikut:

Bahasa Python

# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

Penjelasan:

  • Line kedua adalah proses impor class StandardScaler dari library scikit-learn dan sublibrary preprocessing
  • Line ketiga adalah mendefinisikan sc_X (dibaca scale of X) sebagai variabel proses dari StandarScaler nantinya. Kita ingin menormalisasi variabel X (independen).
  • Line keempat adalah proses mengonversi X_train menjadi X_train yang sudah di rescale
  • Line kelima adalah proses konversi untuk X_test. Perlu diperhatikan kita tidak memakai fit_transform, melainkan cukup transform saja karena X_test secara otomatis sudah melalui proses fit terhadap X_train. Proses pertama yang kita lakukan adalah sc_X.fit_transform(X_train), maka secara otomatis sc_X sudah di fit-kan terhadap X_train.

Penjelasan lebih mudahnya adalah seperti ini;

fit” menghitung nilai rataan dan standar deviasi untuk NANTI-nya digunakan saat proses scaling. Ia hanya menghitung nilai rataan dan standar deviasi saja, tanpa memberikan apa-apa ke kita.

Sementara “transform” menggunakan hasil perhitungan rataan dan standar deviasi sebelumnya (dari ‘fit’) untuk diterapkan ke datanya (mengurangkan semua data dengan nilai rataan, kemudian dibagi dengan standar deviasi – lihat rumus standardisasi di atas).

“fit_transform” melakukan keduanya sekaligus. Lebih mudah menulis fit_transform karena hanya 1 baris, daripada menuliskannya 2 kali melalui fit kemudian transform.

Untuk X_training, kita memerlukan fit_transform, karena kita hitung rataan, standar deviasi lalu mengaplikasikannya ke dataset X_train itu sendiri. Sementara X_text tidak perlu, karena nilai rataan dan standar deviasi tadi sudah dihitung (dan disimpan di memory), sehingga kita cukup mengaplikasikan hasil perhitungan tadi dengan cukup menggunakan transform ke X_test. Bisa dipahami ya.

Muncul pertanyaan, apakah y (variabel dependen) memerlukan feature scaling? Dalam konteks contoh di atas tidak perlu, karena datanya hanya terdiri dari dua kategori yaitu 0 dan 1. Namun ketika variabel dependen memiliki rentang yang besar, misal seperti permasalahan pada regresi (dibahas di bagian lain), maka feature scaling juga harus dilakukan.

Bahasa R

# Feature Scaling
training_set[,2:3] = scale(training_set[,2:3])
test_set[,2:3] = scale(test_set[,2:3])
Bagikan artikel ini:
Subscribe
Notify of
guest
18 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
hanru
hanru
7 months ago

done

andi
andi
2 months ago

Kemudian jika kita sudah punya Training dan test set, bagaimana tahapan untuk menguji nya?

andi
andi
Reply to  MB Herlambang
2 months ago

Jadi misalnya data di training set (pada contoh diatas) difitting menggunakan multiple linear regression (salah satu contoh model machine learning). Begitu ya mas ?
Mohon maaf masih pemula banget

Adi Purnawan
Adi Purnawan
2 months ago

Saya punya dataset untuk knee disorders normal dan abnormal, saya ingin memulai tahapan preprocessing sblm ke Machine learning, bagaimana caranya ya mas?

Egy
Egy
2 months ago

Halo mas, mau tanya untuk proses pembagian Ratio secara manual untuk data Set menjadi data training dan testing , jika saya punya data hanya 40 bolehkah menggunakan presentasi 90:10 mas, apa ada ketentuannya berdasarkan jumlah data yg kita punya, makasih mas sebelumnya hehe

Egy
Egy
Reply to  MB Herlambang
2 months ago

Thanks mas infonya, iya data nya dpt dr kuesioner jd dikit

Kimebmen Simbolon
Kimebmen Simbolon
2 months ago

Kalau dalam proses manual scaling, normalisasi atau standarisasi terlebih dahulu yang dikerjakan pak?

Kimebmen Simbolon
Kimebmen Simbolon
Reply to  MB Herlambang
2 months ago

Terimakasih atas jawabannya pak 😀

Yudi Hendra
Yudi Hendra
1 month ago

Mas Herlambang, bgmn cara melakukan scale thd data frame dg dimensi 1 baris (dlm R)? Saya ingin melakukan new prediction thd model ANN yg telah dibuat, dimana new data tsb dimasukkan dlm data frame baru dg dimensi 1 baris tsb. Trims penjelasannya.

Afrizal
Afrizal
1 month ago

Assalamualaikum, saya ingin menanyakan beberapa hal pak :
1. Apakah feature scaling wajib dilakukan terutama pada supervised learning (regresi dan klasifikasi) atau ada pengecualian sehingga feature scaling tidak perlu dilakukan.?
2. Apakah dengan melakukan feature scaling (standarisasi) membuat data kita berdistribusi normal itu juga berarti menghilangkan outlier pada data kita.?
Mohon pencerahannya pak.

Kimebmen Simbolon
Kimebmen Simbolon
1 month ago

Halo Pak, saya mau bertanya, untuk feature scaling lebih baik dilakukan sebelum atau sesudah spliting data?
Terimakasih, mohon bantuannya pak.

Kimebmen Simbolon
Kimebmen Simbolon
Reply to  MB Herlambang
29 days ago

Terimakasih banyak pak 😀