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 dengan rentang 0 sampai 1 dengan aritmatika 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_test 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
26 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
hanru
hanru
2 years ago

done

andi
andi
1 year ago

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

andi
andi
Reply to  MB Herlambang
1 year 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
1 year 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
1 year 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
1 year ago

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

Shafa
Shafa
Reply to  MB Herlambang
2 months ago

Halo mas, kalau data saya 105 ingin menggunakan logistic regression dan neural network untuk thesis. Bagaimana menurut mas apakah datanya terlalu sedikit? Karena saya lihat ada yang menggunakan data 38 saja

Kimebmen Simbolon
Kimebmen Simbolon
1 year ago

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

Kimebmen Simbolon
Kimebmen Simbolon
Reply to  MB Herlambang
1 year ago

Terimakasih atas jawabannya pak 😀

Shafa
Shafa
Reply to  MB Herlambang
2 months ago

Kalau kasus saya prediksi menggunakan metode logistic regression dan neural network (Metode Machine Learning), apakah tepat jika menggunakan feature scaling normalisasi? Terima kasih

Shafa
Shafa
Reply to  MB Herlambang
2 months ago

Baik, terima kasih atas jawabannya pak 😀

Yudi Hendra
Yudi Hendra
1 year 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 year 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 year 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
1 year ago

Terimakasih banyak pak 😀

Muthia Zahra Nurfatiha
Muthia Zahra Nurfatiha
1 year ago

Halo pak, terimakasih banyak ilmu nya, semoga berkah ya pak.
Disini saya mau bertanya pak, kan kalau standardisasi itu membuat nilai menjadi antara rentang [-1, 1]. Setelah di transformasikan dengan X_test = sc_X.transform(X_test) nilai saya data:image/png;base64,— menjadi seperti itu pak, apakah itu normal? apa ternyata perlu menggunakan fit_transform?
terimakasih pak sebelumnya.

khairi
khairi
1 year ago

mau bertanya pak, untuk feature scaling kan datanya kalau d standarisasi berkisar antara -1 smpai 1. jika kita melakukan predict nntinya apakah data yang dihasilkan berada d rentang tersebut ?