Aplikasi Linear Discriminant Analysis (LDA)

Aplikasi Linear Discriminant Analysis (LDA)

Bahasa R

# Mengimpor dataset
dataset = read.csv('Wine.csv')

# Membagi dataset menjadi training set dan test set
# install.packages('caTools')
library(caTools)
set.seed(111)
split = sample.split(dataset$Customer_Segment, SplitRatio = 0.8)
training_set = subset(dataset, split == TRUE)
test_set = subset(dataset, split == FALSE)

# Proses feature scaling
training_set[1:13] = scale(training_set[1:13])
test_set[1:13] = scale(test_set[1:13])

# Menjalankan algoritma LDA
library(MASS)
lda = lda(formula = Customer_Segment ~ ., data = training_set)
training_set_lda = as.data.frame(predict(lda, training_set))
training_set_lda = training_set_lda[c(5, 6, 1)]
test_set_lda = as.data.frame(predict(lda, test_set))
test_set_lda = test_set_lda[c(5, 6, 1)]

# Menjalankan support vector machine ke training set
# install.packages('e1071')
library(e1071)
mesin_klasifikasi = svm(formula = class ~ .,
                 data = training_set_lda,
                 type = 'C-classification',
                 kernel = 'linear')

# Memprediksi hasil test set
y_pred = predict(mesin_klasifikasi, newdata = test_set_lda[1:2])

# Membuat Confusion Matrix
cm = table(test_set_lda[, 3], y_pred)

# Visualisasi Training set
library(ElemStatLearn)
set = training_set_lda
X1 = seq(min(set[, 1]) - 1, max(set[, 1]) + 1, by = 0.01)
X2 = seq(min(set[, 2]) - 1, max(set[, 2]) + 1, by = 0.01)
grid_set = expand.grid(X1, X2)
colnames(grid_set) = c('x.LD1', 'x.LD2')
y_grid = predict(mesin_klasifikasi, newdata = grid_set)
plot(set[, -3],
     main = 'SVM (Training set) - LDA',
     xlab = 'LD1', ylab = 'LD2',
     xlim = range(X1), ylim = range(X2))
contour(X1, X2, matrix(as.numeric(y_grid), length(X1), length(X2)), add = TRUE)
points(grid_set, pch = '.', col = ifelse(y_grid == 2, 'deepskyblue', ifelse(y_grid == 1, 'springgreen3', 'tomato')))
points(set, pch = 21, bg = ifelse(set[, 3] == 2, 'blue3', ifelse(set[, 3] == 1, 'green4', 'red3')))

# Visualisasi Test set
library(ElemStatLearn)
set = test_set_lda
X1 = seq(min(set[, 1]) - 1, max(set[, 1]) + 1, by = 0.01)
X2 = seq(min(set[, 2]) - 1, max(set[, 2]) + 1, by = 0.01)
grid_set = expand.grid(X1, X2)
colnames(grid_set) = c('x.LD1', 'x.LD2')
y_grid = predict(mesin_klasifikasi, newdata = grid_set)
plot(set[, -3], main = 'SVM (Test set) - LDA',
     xlab = 'LD1', ylab = 'LD2',
     xlim = range(X1), ylim = range(X2))
contour(X1, X2, matrix(as.numeric(y_grid), length(X1), length(X2)), add = TRUE)
points(grid_set, pch = '.', col = ifelse(y_grid == 2, 'deepskyblue', ifelse(y_grid == 1, 'springgreen3', 'tomato')))
points(set, pch = 21, bg = ifelse(set[, 3] == 2, 'blue3', ifelse(set[, 3] == 1, 'green4', 'red3')))

Penjelasan:

  • Line 2 mengimpor datasetnya.
  • Line 5 menginstall library caTools yang digunakan untuk membagi dataset ke dalam training set dan test set. Jika belum terinstall di RStudio, cukup hilangkan tanda pagar (#).
  • Line 6 menjalankan library caTools.
  • Line 7 mendefinisikan bilangan random dengan angka 111. Jika pembaca ingin mendapatkan hasil yang sama dengan yang ada di artikel ini, maka gunakan angka random yang sama.
  • Line 8 mendefinisikan objek split untuk membagi dataset ke training set dan test set dnegan komposisi 80:20.
  • Line 9 mendefisikan objek training_set dengan komposisi 80% dari dataset.
  • Line 10 mendefinisikan objek test_set dengan komposisi 20% dari dataset.
  • Line 13-14 melakukan proses feature scaling. Yang kita lakukan feature scaling adalah variabel independennya (kolom 1-13), dan bukan kolom terakhir (kolom ke 14).
  • Line 17 mengimpor library MASS untuk menjalankan algoritma LDA.
  • Line 18 mendefinisikan objek dengan nama lda untuk proses LDA itu sendiri. Selanjutnya kita gunakan perintah lda dengan Customer_Segment sebagai variabel dependennya. Diikuti oleh tanda ~ yang artinya R akan menyesuaikan semua kolom di dataset selain Customer_Segment sebagai variabel independennnya.
  • Line 19 mendefinisikan sebuah objek dengan nama training_set_lda yang merupakan hasil konversi training_set yang sudah dipasangkan (fitting) oleh model LDA. Kita gunakan perintah predict, dan di depannya kita tambahkan as.data.frame karena hasil dari lda di library MASS adalah berupa matriks, karena jika tidak kita rubah menjadi data.frame maka sulit untuk dibuat visualisasi 2D nya.
  • Lin 20 kita atur kembali urutan kolomnya dan buang kolom yang tidak perlu. Dengan demikian kolom 1 adalah LD1 (x.LD1), diikuti kolom ke 2 LD2 (x.LD2) dan variabel independennya (kelompok konsumen).
  • Line 21-22 melakukan hal yang sama seperti line 19-20. Hanya saja kali ini kita memproses test_set nya.
  • Line 25 mengimpor library e1071 untuk menjalankan teknik SVM (support vector machine). Jika belum terinstall di RStudio cukup hilangkan tanda pagar (#).
  • Line 26 menjalankan library e0171.
  • Line 27 mendefinisikan objek dengan nama mesin_klasifikasi yang nantinya akan menjadi model SVM kita. Untuk SVM kali ini kita gunakan type = ‘C-classification’ dan kernel = ‘linear’. Tentu saja pembaca bisa menggunakan kernel yang lain, dan bisa juga menggunakan teknik klasifikasi lainnya selain SVM.
  • Line 33 kita mencoba memprediksi test set dengan mendefinisikan objek y_pred. Nantinya kita akan bandingkan y_pred ini dengan test_set.
  • Line 36 mendefinisikan cm untuk membuat confusion matrix yang merupakan perbandingan antara test_set dengan y_pred. Hasilnya adalah sebagai berikut:
cm lda r
Confusion matrix LDA

Ternyata prediksi kita dengan menggunakan SVM yang sebelumnya melalui proses LDA sangatlah baik. Terlihat bahwa tidak ada kesalahan prediksi satupun (akurasi 100%).

Hasil confusion matrix ini jika kita bandingkan dengan hasil PCA maka sama-sama memberikan akurasi 100%. Walau demikian, jika diteliti secara visual, khususnya di training set, hasilnya berbeda.

Sekarang kita coba lihat visualisasinya.

  • Line 39-52 adalah perintah untuk melihat visualisasi training set hasil LDA (training_set_lda) dan SVM. Hasilnya sebagai berikut:
training set LDA R
Training set hasil LDA dan SVM

Terlihat pembagian ketiga kelompok juga sangat baik di training set dengan menggunakan LDA terlebih dahulu. Sekarang kita coba bandingkan dengan visualisasi hasil PCA sebagai berikut:

training set pca r
Training set hasil PCA dan SVM

Melalui ilustrasi di atas, terlihat bahwa jika kita gunakan PCA untuk klasifikasi, hasilnya tidak sebaik LDA. Di grafik PCA tersebut masih ada beberapa titik yang berada di zona yang salah.

Sekarang kita ingin lihat visualisasi LDA untuk test set.

  • Line 55-67 adalah perintah untuk membuat visualisasi test set. Hasilnya sebagai berikut:
test set lda r
Test set hasil LDA dan SVM

Sekarang kita coba bandingkan hasilnya dengan PCA sebagai berikut:

test set pca r
Test set hasil PCA dan SVM

Secara visual tidak terdapat banyak perbedaan antara hasil PCA maupun LDA. Keduanya sama-sama memberikan akurasi 100% untuk test set.


Setelah melihat ilustrasi LDA di atas kita bisa mengatakan bahwa penggunaan LDA di tahap awal sangat membantu kita untuk melakukan klasifikasi. Sehingga dengan menggunakan LDA yang nantinya dikombinasikan dengan teknik klasifikasi seperti SVM, logistic regression dan lain-lain dapat meningkatkan tingkat akurasi secara siginifikan.

Mengapa tingkat akurasinya bisa signifikan? Karena variabel independen yang sebelumnya banyak, kini dikecilkan menjadi hanya 2 saja. Namun 2 variabel independen ini sudah mewakili sekian banyak variabel independen awal tadi. Ditambah lagi 2 variabel independen ini sudah memperhitungkan jarak terjauh antar 2 kelompok yang berbeda yang diwakili oleh LD1 dan LD2.

Jadi sampai sini saya harap pembaca bisa memahami apa itu LDA dan bagaimana aplikasinya di dunia nyata. Saya juga berharap pembaca bisa menggunakan teknik ini untuk memecahkan permasalahan yang dihadapi. Cukup disesuaikan scriptnya dengan dataset yang dimiliki.

Semoga bermanfaat dan terus kunjungi website saya ini untuk belajar teknik-teknik machine learning dan aplikasi AI lainnya.

Tetap semangat belajar AI!

Pages: 1 2

Subscribe
Notify of
guest

7 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Eko
Eko
6 years ago

Selamat pagi, Pak
Bisa request teori dan implementasi survival analysis kaplan meier ???

Eko
Eko
Reply to  MB Herlambang
6 years ago

Mohon dipertimbangkan pak, karena topik ini menarik bagi saya (semoga yang lain juga), terima kasih banyak pak ??????

Usman Sudibyo
Usman Sudibyo
5 years ago

Assalamualaikum wr.wb. Bp. Bagus, perkenalkan saya Bp. Usman, mohon ijin bertanya:

line 20: training_set_lda = training_set_lda[

c

(5, 6, 1)]
c(5, 6, 1) fungsinya untuk apa ya? kenapa 5, 6, 1?
Line 35,36: Confusion Matrix di laporan tidak keluar
grid_set hasil dari proses apa? hasil eksekusi 1297076 obs. of 2 variables

Rial
Rial
2 years ago

Assalamualaikum, pak
Izin bertanya pak, Aplikasi yang bapak, gunakan untuk implementasi program diatas apa ya pak?
dan cara bapak memanggil hasil numpy array dari x_train dan x_test seperti pada line 19 bagaimana ya pak? soalnya saya gunakan visual code, tidak terpanggil hasil arraynya seperti yang dicontoh.

Last edited 2 years ago by Rial