78 lines
2.5 KiB
Markdown
78 lines
2.5 KiB
Markdown
|
# Drzewa decyzyjne, algorytm ID3
|
||
|
|
||
|
### autor Justyna Zarzycka
|
||
|
|
||
|
## Opis projektu
|
||
|
Projekt implementuje tworzenie drzewa decyzyjnego wykorzystującego algorytm ID3, ktióre pomaga określić chęci do pracy agenta na podstawie warunków panujących na planszy.
|
||
|
|
||
|
### Tworzenie drzewa decyzyjnego
|
||
|
|
||
|
funkcja budująca drzewo za pomocą algorymu ID3:
|
||
|
|
||
|
```py
|
||
|
def ID3(data, original_data, features, target_attribute_name, parent_node_class=None):
|
||
|
|
||
|
item_values = [info_gain(data, feature, target_attribute_name) for feature in
|
||
|
features]
|
||
|
best_feature_index = np.argmax(item_values)
|
||
|
best_feature = features[best_feature_index]
|
||
|
tree = {best_feature: {}}
|
||
|
features = [i for i in features if i != best_feature]
|
||
|
for value in np.unique(data[best_feature]):
|
||
|
|
||
|
sub_data = data.where(data[best_feature] == value).dropna()
|
||
|
subtree = ID3(sub_data, data, features, target_attribute_name, parent_node_class)
|
||
|
|
||
|
tree[best_feature][value] = subtree
|
||
|
|
||
|
return (tree)
|
||
|
```
|
||
|
|
||
|
Drzewo budowane jest w oparciu o najlepsze możliwe podziały:
|
||
|
|
||
|
```py
|
||
|
#obliczanie wartości przyrostu informacji
|
||
|
def info_gain(data, split_attribute_name, target_name):
|
||
|
|
||
|
# Wartość entropii zbioru
|
||
|
total_entropy = entropy(data[target_name])
|
||
|
|
||
|
# Wyodrębnienie poszczególnych "podzbiorów"
|
||
|
vals, counts = np.unique(data[split_attribute_name], return_counts=True)
|
||
|
|
||
|
# Średnia ważona entropii każdego podzbioru
|
||
|
weighted_entropy = np.sum(
|
||
|
[(counts[i] / np.sum(counts)) * entropy(data.where(data[split_attribute_name] == vals[i]).dropna()[target_name])
|
||
|
for i in range(len(vals))])
|
||
|
|
||
|
# Przyrost informacji
|
||
|
information_gain = total_entropy - weighted_entropy
|
||
|
|
||
|
return information_gain
|
||
|
```
|
||
|
|
||
|
Entropia:
|
||
|
|
||
|
```py
|
||
|
def entropy(target_col):
|
||
|
values, counts = np.unique(target_col, return_counts=True)
|
||
|
entropy = np.sum(
|
||
|
[(-counts[i] / np.sum(counts)) * np.log2(counts[i] / np.sum(counts)) for i in range(len(values))])
|
||
|
return entropy
|
||
|
```
|
||
|
|
||
|
### Zestaw uczący
|
||
|
|
||
|
Zestaw budujący drzewo to lista zawierająca 20 przykładów waruków panujących na polu. Atrybyty zapisane są w formacie ['pogoda', 'ile_chwastow', 'ile_burakow', 'czy_chce_pracowac'].
|
||
|
|
||
|
```py
|
||
|
['slonecznie', 'duzo', 'bardzo_malo', 'srednio'],
|
||
|
['deszcz', 'bardzo_duzo', 'malo', 'nie'],
|
||
|
['grad', 'bardzo_duzo', 'bardzo_malo', 'nie'],
|
||
|
['zachmurzenie', 'srednio', 'srednio', 'tak']
|
||
|
```
|
||
|
|
||
|
### Implementacja w projekcie
|
||
|
Podprojet uruchamiany jest za pomocą klawisza *F5*.
|
||
|
|