Mengapa Scaling Diperlukan

Model berbasis jarak dan gradien membutuhkan skala seragam, model pohon tidak.

Daftar isi

Beberapa algoritma machine learning mengukur jarak antarsampel atau menghitung gradien terhadap setiap fitur, sehingga rentang nilai fitur ikut menentukan hasilnya. Topik ini menjelaskan kelompok model yang sensitif terhadap skala dan kelompok yang tidak, kemudian membuktikannya dengan pengukuran pada dataset wine. Hasil akhirnya berupa aturan praktis tentang kapan scaling diperlukan dan kapan boleh dilewati.

Model berbasis jarak dan gradien#

Model berbasis jarak menghitung kedekatan antarsampel, dan ukuran yang paling umum digunakan adalah jarak Euclidean:

d(p,q)=∑i=1n(pi−qi)2 d(\mathbf{p}, \mathbf{q}) = \sqrt{\sum_{i=1}^{n} (p_i - q_i)^2}

Setiap fitur menyumbang kuadrat selisihnya ke jumlah yang sama, sehingga fitur dengan rentang terbesar mendominasi nilai jarak. Fitur pengeluaran tahunan yang bergerak hingga jutaan akan menenggelamkan fitur usia yang hanya berkisar 0 sampai 80, sekalipun fitur usia jauh lebih informatif. Diagram berikut memperlihatkan dominasi itu pada dua fitur. Selisih yang kecil pada fitur berskala kecil nyaris tidak menyumbang jarak, sedangkan selisih pada fitur berskala besar menentukan hampir seluruh jarak.

fitur A (rentang 0 sampai 1)fitur B (rentang 0 sampai 1000)0101000sampel 1sampel 2jarak antartitik didominasioleh selisih pada fitur B
Jarak antartitik didominasi oleh fitur dengan rentang nilai terbesar

KNeighborsClassifier mengklasifikasikan sampel berdasarkan tetangga terdekatnya, sehingga sepenuhnya bergantung pada jarak dan dikenal dengan singkatan KNN (K-nearest neighbors). KMeans mengukur jarak sampel ke pusat klaster, SVM menentukan margin antarkelas, sedangkan model gradien seperti regresi logistik dan jaringan saraf memperbarui bobot dengan besaran yang bergantung pada skala fitur. Pada keempat kelompok tersebut, skala yang timpang menggeser keputusan ke fitur berskala besar atau memperlambat pembaruan bobot.

Model gradien memberi alasan yang sedikit berbeda. Pembaruan bobot pada regresi logistik maupun jaringan saraf bergerak sebesar gradien yang dikalikan laju belajar, dan gradien itu dihitung terhadap nilai fitur. Fitur berskala besar menghasilkan gradien besar, sedangkan fitur berskala kecil menghasilkan gradien kecil, sehingga satu laju belajar yang sama terlalu agresif untuk fitur pertama dan terlalu lambat untuk fitur kedua. Penyetaraan skala membuat langkah pembaruan sebanding antarfitur, sehingga pelatihan berjalan lebih stabil.

Berbeda dengan kelompok di atas, pohon keputusan membandingkan satu fitur dengan satu ambang pada setiap simpul, misalnya proline di atas 1000. Operasi pembandingan tunggal tidak berubah oleh penyetaraan skala, sehingga keluarga model pohon tidak menuntut scaling.

Demonstrasi KNN pada data wine#

Perbedaan sensitivitas itu dapat diukur langsung. Data wine dipecah menjadi data latih dan data uji dengan random_state=42, kemudian KNeighborsClassifier dilatih dalam dua kondisi, yaitu tanpa transformasi dan dengan StandardScaler. Scaler dilatih hanya pada data latih, lalu transformasi yang sama diterapkan ke data uji.

python knn-vs-scaling.py
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

data = load_wine()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, stratify=y, random_state=42
)

# kondisi pertama: KNN dilatih pada data mentah tanpa scaling
knn = KNeighborsClassifier().fit(X_train, y_train)
print("Akurasi KNN tanpa scaling :", round(knn.score(X_test, y_test), 3))

# kondisi kedua: scaler dilatih hanya pada data latih, lalu diterapkan ke data uji
scaler = StandardScaler().fit(X_train)
X_train_t = scaler.transform(X_train)
X_test_t = scaler.transform(X_test)
knn_t = KNeighborsClassifier().fit(X_train_t, y_train)
print("Akurasi KNN dengan scaling:", round(knn_t.score(X_test_t, y_test), 3))
text Keluaran
Akurasi KNN tanpa scaling : 0.778
Akurasi KNN dengan scaling: 0.933

Selisihnya besar. Tanpa scaling, akurasi hanya 0,778 karena jarak antarsampel didominasi fitur proline dan fitur berskala besar lainnya. Setelah skala disetarakan, akurasi naik ke 0,933 tanpa perubahan apa pun pada algoritma, jumlah tetangga, atau pemecahan data. Satu-satunya perubahan adalah menyetarakan skala fitur, sehingga seluruh kenaikan itu berasal dari praproses.

Penyebab kenaikan itu terbaca dari rentang fitur pada data wine. Fitur proline bergerak dari 278 hingga 1680, sedangkan fitur flavanoids hanya bergerak dari 0,34 hingga 5,08, sehingga kuadrat selisih proline mendominasi jumlah pada rumus jarak Euclidean. Dua sampel yang mirip pada mayoritas fitur dapat dianggap jauh hanya karena selisih nilai proline pada keduanya besar. Setelah skala disetarakan, seluruh fitur menyumbang jarak secara seimbang, sehingga tetangga yang ditemukan benar-benar mirip secara keseluruhan.

Model pohon tidak terpengaruh#

Pernyataan bahwa pohon keputusan kebal terhadap skala juga dapat diuji. Kode yang sama persis dijalankan dengan model yang diganti menjadi DecisionTreeClassifier, tanpa mengubah pemecahan data maupun pengaturan lainnya. Skor yang dinantikan adalah kesamaan penuh, karena urutan nilai tidak bergeser oleh penyetaraan skala.

python Contoh: pohon keputusan dengan dan tanpa scaling
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.tree import DecisionTreeClassifier

data = load_wine()
X, y = data.data, data.target
X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.25, stratify=y, random_state=42
)

pohon = DecisionTreeClassifier(random_state=42).fit(X_train, y_train)
print("Akurasi pohon keputusan tanpa scaling :", round(pohon.score(X_test, y_test), 3))

scaler = StandardScaler().fit(X_train)
pohon_t = DecisionTreeClassifier(random_state=42).fit(scaler.transform(X_train), y_train)
print("Akurasi pohon keputusan dengan scaling:", round(pohon_t.score(scaler.transform(X_test), y_test), 3))
text Keluaran
Akurasi pohon keputusan tanpa scaling : 0.956
Akurasi pohon keputusan dengan scaling: 0.956

Kedua akurasi identik di angka 0,956. StandardScaler adalah transformasi monoton naik, yaitu tidak membalik urutan nilai, sedangkan pemisahan pohon hanya bergantung pada urutan nilai dalam satu fitur. Ambang pemisahan yang tadinya 1000 berubah menjadi angka yang lebih kecil, tetapi sampel yang terpisah tetap sama. Sifat ini bukan kebetulan pada data wine, melainkan konsekuensi struktural keluarga model pohon, termasuk RandomForestClassifier.

Kesalahan umum#

Kesalahan pertama adalah membiarkan KNN atau SVM bekerja pada fitur berskala timpang karena tidak ada error yang muncul. Model tetap terlatih dan akurasi tetap tercetak, hanya nilainya jauh di bawah kemampuan sebenarnya. Kelemahan semacam ini baru terasa ketika model dibandingkan dengan baseline, yaitu model tolok ukur yang skalanya sudah disetarakan.

Kesalahan kedua adalah menskalakan target. Scaling ditujukan bagi fitur, sedangkan label klasifikasi berupa kelas yang tidak boleh diubah angkanya. Pada regresi, penskalaan target bersifat opsional dan harus dibalik dengan inverse_transform sebelum hasilnya dilaporkan.

Kesalahan ketiga adalah mengira scaling wajib untuk semua model. Model pohon seperti DecisionTreeClassifier dan RandomForestClassifier bekerja dengan pemisahan satu fitur pada satu ambang, sehingga scaling hanya menambah langkah tanpa mengubah hasilnya, sebagaimana terukur pada data wine.

Ringkasan#

  • Model berbasis jarak seperti KNN, KMeans, dan SVM serta model gradien sensitif terhadap skala fitur, sehingga scaling memengaruhi skor dan jalannya pelatihan.
  • Pada data wine, akurasi KNeighborsClassifier naik dari 0,778 menjadi 0,933 hanya karena StandardScaler, dengan fit hanya pada data latih.
  • Model pohon membandingkan satu fitur dengan satu ambang, sehingga penyetaraan skala tidak mengubah pohonnya.
  • Scaling mengubah jarak tanpa mengubah urutan nilai, dan itulah sebabnya efeknya berbeda antarkeluarga model.

Referensi#