Seleksi Fitur

Seleksi Fitur adalah kegiatan untuk memilih / menyaring / memberi peringkat terhadap tiap tiap fitur dalam data agar nantinya fitur yang memiliki peringkat rendah dapat dibuang

Seleksi Fitur sangat berguna dalam Data Mining karena dapat menghemat waktu, biaya, dan tenaga dengan cara membuang fitur yang tidak penting. jika kita menganalisa banyak kolom dengan kita menyeleksi fitur data tersebut kita dapat mengurangi kolom data itu sehingga membuat waktu analisis lebih cepat

Information Gain

Ada banyak teknik untuk menyeleksi fitur. Information Gain bekerja dengan mendeteksi fitur yang paling banyak memiliki informasi berdasarkan kelas tertentu dengan menghitung nilai Entropy-nya

Rumus untuk mencari Entropy Target adalah: $$ Entropy(S):\sum_{i}^{c}-P_{i}\log_{2}P_{i} $$

Dimana c adalah jumlah nilai yang ada pada kelas kategori dan Pi adalah jumlah sampel untuk kelas i

from pandas import *
from IPython.display import HTML, display
from tabulate import tabulate
from math import log
from sklearn.feature_selection import mutual_info_classif

def table(df): display(HTML(tabulate(df, tablefmt='html', headers='keys', showindex=False)))
df = read_csv('newdata.csv', sep=';')
table(df)
outlook temperature humidity windy play
sunny hot high False no
sunny hot high True no
overcast hot high False yes
rainy mild high False yes
rainy cool normal False yes
rainy cool normal True no
overcast cool normal True yes
sunny mild high False no
sunny cool normal False yes
rainy mild normal False yes
sunny mild normal True yes
overcast mild high True yes
overcast hot normal False yes
rainy mild high True no

Mencari Entropy Target

def findEntropy(column):
    rawGroups = df.groupby(column)
    targetGroups = [[key, len(data), len(data)/df[column].size] for key,data in rawGroups]
    targetGroups = DataFrame(targetGroups, columns=['value', 'count', 'probability'])
    return sum([-x*log(x,2) for x in targetGroups['probability']]), targetGroups, rawGroups

entropyTarget, groupTargets, _ = findEntropy('play')
table(groupTargets)
print('entropy target =', entropyTarget)
value count probability
no 5 0.357143
yes 9 0.642857
entropy target = 0.9402859586706309

Dari atas kita tahu bahwa Entropy Target adalah hasil dari penjumlahan Entropy kelas no dan yes

Kemudian untuk mencari Entropy setiap fitur / atribut dalam data digunakan rumus: $$ Gain(S,A)=Entropy(S)-\sum_{values(A)}\frac{|S_{v}|}{|S|}Entropy(S_{v}) $$

A adalah Atribut dan |Sv| adalah jumlah sampel untuk nilai v, |S| adalah jumlah seluruh sampel serta Entropy(Sv) adalah Entropy dari sampel yang memiliki nilai v

Rumus ini digunakan untuk semua kolom

def findGain(column):
    entropyOutlook, groupOutlooks, rawOutlooks = findEntropy(column)
    table(groupOutlooks)
    gain = entropyTarget-sum(len(data)/len(df)*sum(-x/len(data)*log(x/len(data),2) 
                for x in data.groupby('play').size()) for key,data in rawOutlooks)
    print("gain of",column,"is",gain)
    return gain

gains = [[x,findGain(x)] for x in ['outlook','temperature','humidity','windy']]
value count probability
overcast 4 0.285714
rainy 5 0.357143
sunny 5 0.357143
gain of outlook is 0.2467498197744391
value count probability
cool 4 0.285714
hot 4 0.285714
mild 6 0.428571
gain of temperature is 0.029222565658954647
value count probability
high 7 0.5
normal 7 0.5
gain of humidity is 0.15183550136234136
value count probability
False 8 0.571429
True 6 0.428571
gain of windy is 0.04812703040826927

Hasil daripada setiap kolomnya:

table(DataFrame(gains, columns=["Feature", "Gain Score"]).sort_values("Gain Score")[::-1])
Feature Gain Score
outlook 0.24675
humidity 0.151836
windy 0.048127
temperature 0.0292226

Setelah mengetahui hasil dari setiap kolom, maka akan terlihat mana kolom yang memiliki hasil tertinggi dan terendah.

Karena kita sudah mengetahui kolom dengan nilai yang terendah adalah temperatur maka tidak apa apa untuk menghilangkan kolom temperatur dari data

Referensi

  1. https://edrianhadinata.wordpress.com/tag/reduksi-dimensi/
  2. https://www.researchgate.net/publication/326571453_Seleksi_Fitur_Information_Gain_untuk_Klasifikasi_Penyakit_Jantung_Menggunakan_Kombinasi_Metode_K-Nearest_Neighbor_dan_Naive_Bayes
  3. https://informatikalogi.com/algoritma-id3