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 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
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:
Sekumpulan data yang hanya memiliki satu kelas (katakanlah, biru) sangat mudah diprediksi. Di dalam kumpulan data ini pasti berwarna biru. Situasi ini akan menghasilkan nilai entropi yang rendah.
Sebaliknya, sekumpulan data dengan banyak kelas campuran tidak dapat dengan mudah diprediksi: elemen tertentu dapat berupa warna apa saja! Ini akan memiliki nilai entropi yang tinggi.
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.
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/