From 59a0858ac40043c5a9c01665479ad8b68ca5010c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Natalia=20Wi=C5=9Bniewska?= Date: Wed, 3 Jun 2020 16:49:10 +0000 Subject: [PATCH] =?UTF-8?q?Zaktualizuj=20'Natalia=5FWi=C5=9Bniewska=5Fdrze?= =?UTF-8?q?wa=5Fdecyzyjne.md'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Natalia_Wiśniewska_drzewa_decyzyjne.md | 154 ++++++++++++------------ 1 file changed, 77 insertions(+), 77 deletions(-) diff --git a/Natalia_Wiśniewska_drzewa_decyzyjne.md b/Natalia_Wiśniewska_drzewa_decyzyjne.md index 2ae9024..884376f 100644 --- a/Natalia_Wiśniewska_drzewa_decyzyjne.md +++ b/Natalia_Wiśniewska_drzewa_decyzyjne.md @@ -1,78 +1,78 @@ -# *Sztuczna inteligencja - projekt zespołowy - Autonomiczny Traktor* - -#### autorzy: Aleksandra Werda, Natalia Wiśniewska, Kinga Jagodzińska, Aleksandra Jonas -*** -## Natalia Wiśniewska - podprojekt: drzewa decyzyjne -___ -Celem podprojektu jest ustalenie czy traktor powinien podlać dane pole. Wykorzystałam do tego drzewa decyzyjne w oparciu o algorytm CART. -## Zbiór uczący -Zbiorem uczącym jest tablica, która składa się z 25 przykładów w których dane kolejno to: -- informacja o tym czy gleba jest sucha lub nawodniona -- ile dni temu ostatnio podlewano pole -- co ile dni należy podlewać dane pole -- czy ma tego dnia padać -- kiedy ostatnio padało. -``` -training_data = [ - ['n', 2, 3, 't', 1], - ['s', 1, 3, 't', 1], - ['s', 5, 2, 'n', 1], - ['n', 3, 5, 'n', 1], -``` -## Tworzenie drzewa -Na samym początku program sprawdza czy odpowiednia wartość w danym przykładzie to liczba czy też litera. -``` -def is_numeric(value): - return isinstance(value, int) or isinstance(value, float) -``` -Dzięki temu w klasie **Question** ustalamy w jaki sposób porównujemy ze sobą dane oraz budujemy takie pytanie. -``` -class Question: - def __init__(self, column, value): - self.column = column - self.value = value - - def match(self, example): - val = example[self.column] - if is_numeric(val): - return val >= self.value - else: - return val == self.value - - def __repr__(self): - condition = "==" - if is_numeric(self.value): - condition = ">=" - return "Czy %s %s %s?" % ( - header[self.column], condition, str(self.value)) -``` -Funkcja **partition** tworzy kolejne gałęzie poprzez podział odpowiedzi na fałszywe i prawdziwe. -Następnie obliczamy wartość gini oraz przyrost informacji: -``` -def gini(rows): - counts = class_counts(rows) - impurity = 1 - for lbl in counts: - prob_of_lbl = counts[lbl] / float(len(rows)) - impurity -= prob_of_lbl**2 - return impurity - - -def info_gain(left, right, current_uncertainty): - p = float(len(left)) / (len(left) + len(right)) - return current_uncertainty - p * gini(left) - (1 - p) * gini(right) -``` -Dzięki temu program ile informacji uzyska po podziale na podzbiory i może zadecydować, o które dane powinien zapytać. - -Na sam koniec tworzymy nasze drzewo: -``` -def build_tree(rows): - gain, question = find_best_split(rows) - if gain == 0: - return Leaf(rows) - true_rows, false_rows = partition(rows, question) - true_branch = build_tree(true_rows) - false_branch = build_tree(false_rows) - return Decision_Node(question, true_branch, false_branch) -``` +# *Sztuczna inteligencja - projekt zespołowy - Autonomiczny Traktor* + +#### autorzy: Aleksandra Werda, Natalia Wiśniewska, Kinga Jagodzińska, Aleksandra Jonas +*** +## Natalia Wiśniewska - podprojekt: drzewa decyzyjne +___ +Celem podprojektu jest ustalenie czy traktor powinien podlać dane pole. Wykorzystałam do tego drzewa decyzyjne w oparciu o algorytm CART. +## Zbiór uczący +Zbiorem uczącym jest tablica, która składa się z 25 przykładów w których dane kolejno to: +- informacja o tym czy gleba jest sucha lub nawodniona +- ile dni temu ostatnio podlewano pole +- co ile dni należy podlewać dane pole +- czy ma tego dnia padać +- kiedy ostatnio padało. +``` +training_data = [ + ['n', 2, 3, 't', 1], + ['s', 1, 3, 't', 1], + ['s', 5, 2, 'n', 1], + ['n', 3, 5, 'n', 1], +``` +## Tworzenie drzewa +Na samym początku program sprawdza czy odpowiednia wartość w danym przykładzie to liczba czy też litera. +``` +def is_numeric(value): + return isinstance(value, int) or isinstance(value, float) +``` +Dzięki temu w klasie **Question** ustalamy w jaki sposób porównujemy ze sobą dane oraz budujemy takie pytanie. +``` +class Question: + def __init__(self, column, value): + self.column = column + self.value = value + + def match(self, example): + val = example[self.column] + if is_numeric(val): + return val >= self.value + else: + return val == self.value + + def __repr__(self): + condition = "==" + if is_numeric(self.value): + condition = ">=" + return "Czy %s %s %s?" % ( + header[self.column], condition, str(self.value)) +``` +Funkcja **partition** tworzy kolejne gałęzie poprzez podział odpowiedzi na fałszywe i prawdziwe. + +Następnie obliczamy wartość gini oraz przyrost informacji: +``` +def gini(rows): + counts = class_counts(rows) + impurity = 1 + for lbl in counts: + prob_of_lbl = counts[lbl] / float(len(rows)) + impurity -= prob_of_lbl**2 + return impurity + +def info_gain(left, right, current_uncertainty): + p = float(len(left)) / (len(left) + len(right)) + return current_uncertainty - p * gini(left) - (1 - p) * gini(right) +``` +Dzięki temu program ile informacji uzyska po podziale na podzbiory i może zadecydować, o które dane powinien zapytać. + +Na sam koniec tworzymy nasze drzewo: +``` +def build_tree(rows): + gain, question = find_best_split(rows) + if gain == 0: + return Leaf(rows) + true_rows, false_rows = partition(rows, question) + true_branch = build_tree(true_rows) + false_branch = build_tree(false_rows) + return Decision_Node(question, true_branch, false_branch) +``` Zawiera ono najbardziej opłacalne pytanie w korzeniu, a następnie dzieli drzewo na dwa podrzewa- takie, w którym odpowiedzią na pierwsze pytanie była prawda i takie, w którym był to fałsz. Następnie w tych węzłach program zadaje kolejne pytania tak jak w korzeniu. Odpowiedzi na ostatnie pytania nazywamy liśćmi. Na ich podstawie ustalamy czy pole należy podlać czy nie. \ No newline at end of file