library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

Seleksi Fitur

Seleksi fitur adalah teknik yang dilakukan untuk memilih fitur yang terbaik. Tujuannya adalah untuk efisiensi dari suatu algoritma. Alih-alih menggunakan semua fitur yang ada, menggunakan metode ini kita cukup memilih sebagian fitur yang dianggap penting dan signifikan, sehingga cukup dengan fitur tersebut sudah diperoleh hasil yang diinginkan

Information Entropy & Information Gain

Information Entropy

Entropy informasi sering dibahas pada teori Decision Tree. Pada bahasan itu, informasi entropy dipahami sebagai tingkat variansi dari suatu node pada sebuah jaringan tree. Konsep ini digunakan untuk mengukur “seberapa informatifnya” sebuah node (yang biasanya disebut seberapa baiknya). Meskipun demikian, sesungguhnya, secara sederhana Entropy Informasi ini dapat dipahami sebagai tingkat kemudahan kumpulan data yang untuk dapat diprediksi. Sebagai contoh:

Formula untuk menghitung nilai entropy suatu fitur pada sebuah dataset adalah:

Nilai Entropy berada pada selang [0,1] sehingga:

Information Gain
Setelah mendapat nilai entropi, pemilihan fitur dilakukan dengan nilai information gain terbesar. Nilai Information Gain merupakan nilai seberapa besar Entropy yang dapat dihapus. Semakin tinggi nilainya, maka semakin banyak Entropy yang dapat dihapus.

Implementasi Pada R

Sebagai contoh, kita akan menggunakan dataset Setosa Iris sebagai berikut:

df <- iris
#df$Species<- unclass(df$Species)

Nilai Entropy pada setiap fitur/kolom dapat dihitung sebagai berikut:

entropy <- function(target) {
  freq <- table(target)/length(target)
  # Vektorisasi kolom dataframe
  vec <- as.data.frame(freq)[,2]
  #drop 0 to avoid NaN resulting from log2
  vec<-vec[vec>0]
  # Menghitung Nilai Entropy
  -sum(vec * log2(vec))
}
# Menghitung Nilai Entropy Kolom Species
print(entropy(df$Species))
## [1] 1.584963
# Menghitung Nilai Entropy Kolom Sepal.Width
print(entropy(df$Sepal.Width))
## [1] 4.023181

Kemudian, berikut adalah bagaimana menghitung nilai Information Gain dari setiao fitur/kolom dalam suatu dataset:

IG_numeric<-function(data, feature, target, bins=4) {
  #Hapus baris di mana fiturnya adalah NA
  data<-data[!is.na(data[,feature]),]
  #Menghitung entropi untuk induk(label data)
  e0<-entropy(data[,target])
  
  data$cat<-cut(data[,feature], breaks=bins, labels=c(1:bins))
  
  #gunakan dplyr untuk menghitung e dan p untuk setiap nilai fitur
  dd_data <- data %>% group_by(cat) %>% summarise(e=entropy(get(target)), 
                 n=length(get(target)),
                 min=min(get(feature)),
                 max=max(get(feature))
                 )
  
  #hitung p untuk setiap nilai fitur
  dd_data$p<-dd_data$n/nrow(data)
  #menghitung IG
  IG<-e0-sum(dd_data$p*dd_data$e)
  
  return(IG)
}

IG_numeric(df, "Sepal.Length", "Species", bins=5)
## [1] 0.6402424

Menmbuat DataFrame untuk Nilai Entropy & Information Gain Setiap Kolom dan Diurutkan:

Fitur_Exploration <- function(df, bin){
  E <- numeric()
  for (i in 1:ncol(df)){
    nama<-names(df)[i]
    E[i]<-entropy(df[,nama])
    }
  
  ig <- numeric()
  kol=ncol(df)-1
  for (i in 1:kol){
    ig[i]<-IG_numeric(df, names(df)[i], names(df)[ncol(df)], bins=bin)
  }
  ig[ncol(df)]<-0 #Masih dicek lagi
  Column_Name <- names(df)
  Entropy <- E
  IG <- ig
  df_E <- data.frame(Column_Name, Entropy, IG)
  df_E_sort <- df_E[order(-IG),]
  return(df_E_sort)
} 

Fitur_Exploration(df,5)
##    Column_Name  Entropy        IG
## 4  Petal.Width 4.049827 1.3245310
## 3 Petal.Length 5.034570 1.2662530
## 1 Sepal.Length 4.822018 0.6402424
## 2  Sepal.Width 4.023181 0.3914756
## 5      Species 1.584963 0.0000000

Referensi

https://rpubs.com/philjet/shannonentropy
https://victorzhou.com/blog/information-gain/
https://informatikalogi.com/algoritma-id3/