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