2020-06-15 14:10:43 +02:00
|
|
|
Piotr Jakub Dębski 01.06.2020
|
|
|
|
|
|
|
|
|
|
|
|
## Automatyczny kelner: raport podprojektu indywidualnego
|
|
|
|
|
|
|
|
W tym dokumencie opisane zostały podstawy i najważniejsze informacje dotyczące powstania
|
|
|
|
oraz funkcjonowania podprojektu indywidualnego.
|
|
|
|
|
|
|
|
### Cel projektu
|
|
|
|
|
|
|
|
Celem projektu jest dodanie do projektu Zautomatyzowanego Kelnera sztucznej inteligencji u
|
|
|
|
klientów restauracji, która na podstawie kilku przypisanych do obiektu klienta cech pozwoli mu
|
|
|
|
na samodzielne wybranie zamówionego dania oraz napoju. Osobny moduł będzie miał za zadanie
|
|
|
|
stworzyć modele drzewa decyzyjnego, które będą używane w głownym pliku projektu.
|
|
|
|
|
|
|
|
### Biblioteki
|
|
|
|
|
|
|
|
Do wykonania projektu wykorzystane zostały następujące biblioteki Pythona:
|
|
|
|
- random
|
|
|
|
- joblib
|
|
|
|
- pandas
|
|
|
|
- sklearn
|
|
|
|
- pydot
|
|
|
|
oraz dodatkowo:
|
|
|
|
- graphviz
|
2020-06-15 14:46:40 +02:00
|
|
|
za pomocą którego wygenerowane została reprezentacja wizualna modelów drzew decyzyjnych
|
2020-06-15 14:10:43 +02:00
|
|
|
food_tree.pdf oraz drink_tree.pdf znajdujących się w folderze graphs.
|
|
|
|
|
|
|
|
### Dane
|
|
|
|
|
2020-06-15 14:46:40 +02:00
|
|
|
Dane na których podstawie algorytm ma stworzyć modele drzew decyzyjnych umieszczone zostały
|
|
|
|
w pliku learning_db.py i podzielone na 6 binarnych kategorii:
|
2020-06-15 14:10:43 +02:00
|
|
|
- gender - płeć ( M - mężczyzna K - kobieta )
|
|
|
|
- age - wiek ( Adult - dorosły Child - dziecko )
|
|
|
|
- outfit - ubiór ( Casual - codzienny Elegant - reprezentacyjny )
|
|
|
|
- cash - pieniądze ( "+" - dużo "-" - mało )
|
|
|
|
- vege - dieta wegetariańska ( "Yes" "No" )
|
|
|
|
- time - czas ( "Afternoon" - popołudnie "Evening" - wieczór )
|
|
|
|
oraz na 2 kategorie, które mają zostać sklasyfikowane :
|
2020-06-15 14:46:40 +02:00
|
|
|
- food - dania ( 10 wyborów )
|
|
|
|
- drink - napoje ( 5 wyborów )
|
2020-06-15 14:10:43 +02:00
|
|
|
Dane zawierają 200 przykładów.
|
|
|
|
|
|
|
|
### Tworzenie drzewa
|
|
|
|
|
|
|
|
1. Za pomocą funkcji pandas.DataFrame() program łączy ze sobą wszystkie przykłady w
|
|
|
|
dwuwymiarową strukturę danych o wymiarach 9x200 (kategorie+index)x(przykłady).
|
2020-06-15 14:46:40 +02:00
|
|
|
2. Za pomocą funkcji pandas.factorize() program dostosowuje dane w każdej kolumnie do
|
|
|
|
naszych potrzeb i obliczeń.
|
2020-06-15 14:10:43 +02:00
|
|
|
3. Następnie model danych zostaje podzielony na X - zbiór przykładów oraz y - odpowiadający
|
|
|
|
przykładom wynik czyli rodzaj dania.
|
|
|
|
4. Zestaw danych zostaje podzielony na testowy dzięki funkcji train_test_split()
|
2020-06-15 14:46:40 +02:00
|
|
|
( 10% - food , 40% - drink) i treningowy ( 55% - food , 45% - drink )
|
|
|
|
5. Dzięki funkcji DecisionTreeClassifier() oraz tą samą funkcją z argumentem wymagającym
|
|
|
|
przyjęcia do kryterium entropii tworzą się dwa klasyfikatory (wyniki będą porównywane by
|
|
|
|
wybrać dokładniejszą metodę)
|
2020-06-15 14:10:43 +02:00
|
|
|
6. Zestaw treningowy przekazany zostaje do funkcji fit() dzięki czemu można teraz
|
|
|
|
przeprowadzić predykcję za pomocą funkcji predict(), której w miejsce argumentu wprowadzamy
|
|
|
|
zestaw testowy.
|
2020-06-15 14:46:40 +02:00
|
|
|
7. W wyniku wielokrotnych porównań dokładności funkcji predict() na klasyfikatorach,
|
|
|
|
entropia okazuje się lepszym kryterium od indeksu Giniego na zadanym zestawie danych, więc
|
|
|
|
model drzewa korzystający z tego kryterium zostaje zapisany do późniejszego stosowania.
|
|
|
|
8. Kroki 3-7 zostały powtórzone dla drzewa napojów, a odpowiednie wizualizacje drzew
|
|
|
|
decyzyjnych zapisane są w folderze graphs.
|
2020-06-15 14:10:43 +02:00
|
|
|
|
|
|
|
### Synchronizacja w projekcie
|
|
|
|
|
|
|
|
Modele food_model i drink_model zostaną załadowane do programu z folderu models.
|
2020-06-15 14:46:40 +02:00
|
|
|
Do obsługi stworzonego modelu stworzona jest klasa Client oraz funkcja client_ordering(clt)
|
|
|
|
Klasa Client poprzez swój konstruktor automatycznie losuje wszystkie cechy oraz pobiera
|
|
|
|
aktualną godzinę, natomiast funkcja client_ordering(clt) wymaga w swoim argumencie
|
|
|
|
posiadania obiektu klasy Client, z której pobierze wszystkie wartości cech i przeniesie je
|
|
|
|
do funkcji predict() zwracając otrzymane przez klienta zamówienie.
|
|
|
|
<!--stackedit_data:
|
|
|
|
eyJoaXN0b3J5IjpbLTc0NzY1NDM0MiwxMDUxMDAwNjk2LDExNT
|
|
|
|
Q5MzU2MTZdfQ==
|
|
|
|
-->
|