From 1231a8f914a8d3ed7d12f2b5f1e4882d01fc6964 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Jakub=20D=C4=99bski?= Date: Mon, 15 Jun 2020 14:10:43 +0200 Subject: [PATCH] ok --- Customertree.md | 73 ++++++++++++ customertree.py | 105 +++++++++++++++++ graphs/drink_model.pdf | Bin 0 -> 24453 bytes graphs/food_model.pdf | Bin 0 -> 28493 bytes learning_db.py | 235 ++++++++++++++++++++++++++++++++++++++ main.py | 87 +++++++++++++- models/drink_model.joblib | Bin 0 -> 5636 bytes models/food_model.joblib | Bin 0 -> 10516 bytes 8 files changed, 499 insertions(+), 1 deletion(-) create mode 100644 Customertree.md create mode 100644 customertree.py create mode 100644 graphs/drink_model.pdf create mode 100644 graphs/food_model.pdf create mode 100644 learning_db.py create mode 100644 models/drink_model.joblib create mode 100644 models/food_model.joblib diff --git a/Customertree.md b/Customertree.md new file mode 100644 index 0000000..b46f54a --- /dev/null +++ b/Customertree.md @@ -0,0 +1,73 @@ +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 + za pomocą którego wygenerowane została reprezentacja wizualna drzew decyzyjnych + food_tree.pdf oraz drink_tree.pdf znajdujących się w folderze graphs. + +### Dane + + 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: + - 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 : + - food - dania ( 35 wyborów ) + - drink - napoje ( 8 wyborów ) + 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). + 2. Za pomocą funkcji pandas.factorize() program dostosowuje dane w każdej kolumnie do naszych + potrzeb i obliczeń. + 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() + ( 25% - food , 40% - drink) i treningowy ( 75% - food , 60% - 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ę) + 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. + 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 użycia w głównym ciele projektu. + 8. Kroki 3-7 zostały powtórzone dla drzewa napojów, a odpowiednie wizualizacje drzew decyzyjnych + zapisane są w folderze graphs. + +### Synchronizacja w projekcie + + Modele food_model i drink_model zostaną załadowane do programu z folderu models. + Do obsługi stworzonego modelu stworzona jest klasa Client oraz funkcja client_ordering(ctr) + Klasa Client poprzez swój konstruktor automatycznie losuje wszystkie cechy, na podstawie + których funkcja predict() wybiera danie oraz napój, natomiast funkcja client_ordering(ctr) 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 wyniki. diff --git a/customertree.py b/customertree.py new file mode 100644 index 0000000..98c1518 --- /dev/null +++ b/customertree.py @@ -0,0 +1,105 @@ +import pandas as pandas +import graphviz +import pydot +from learning_db import * +from joblib import dump +from sklearn import tree +from sklearn.metrics import accuracy_score +from sklearn.externals.six import StringIO +from sklearn.tree import DecisionTreeClassifier +from sklearn.metrics import accuracy_score +from sklearn.model_selection import train_test_split + +customers = pandas.DataFrame({"gender": gender, + "age": age, + "outfit": outfit, + "cash": cash, + "time": time, + "vege": vege, + "food": food, + "drink": drink + }) + + +customers["gender"], gender_objects = pandas.factorize(customers["gender"]) +customers["age"], age_objects = pandas.factorize(customers["age"]) +customers["outfit"], outfit_objects = pandas.factorize(customers["outfit"]) +customers["cash"], cash_objects = pandas.factorize(customers["cash"]) +customers["time"], time_objects = pandas.factorize(customers["time"]) +customers["vege"], vege_objects = pandas.factorize(customers["vege"]) +customers["food"], food_objects = pandas.factorize(customers["food"]) +customers["drink"], drink_objects = pandas.factorize(customers["drink"]) + +objects = [] +objects.append(gender_objects) +objects.append(age_objects) +objects.append(outfit_objects) +objects.append(cash_objects) +objects.append(time_objects) +objects.append(vege_objects) +objects.append(food_objects) +objects.append(drink_objects) + + +#X = customers.drop(["food","drink"], axis=1) +#y = customers["food"] + +#X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, random_state=None) + +#food_classifier = DecisionTreeClassifier(criterion = "entropy", random_state=1) +#food_classifier.fit(X_train, y_train) + +#porównanie kryterium: index Giniego i entropia + +#food_classifier1 = DecisionTreeClassifier() +#food_classifier1.fit(X_train, y_train) + +#food_classifier2 = DecisionTreeClassifier(criterion = "entropy") +#food_classifier2.fit(X_train, y_train) + +#y_pred1 = food_classifier1.predict(X_test) +#y_pred2 = food_classifier2.predict(X_test) + + +#if accuracy_score(y_test, y_pred1) > accuracy_score(y_test, y_pred2): +# dump(food_classifier,'models/food_model.joblib') +#else: +# dump(food_classifier2,'models/food_model.joblib') + +#dot_data=StringIO() +#tree = tree.export_graphviz(food_classifier, out_file = dot_data, +# feature_names = X.columns, +# class_names = food_objects, +# filled = True, rounded = True) +#graph = pydot.graph_from_dot_data(dot_data.getvalue()) +#graph[0].write_pdf("graphs/food_model.pdf") + +#X = customers.drop(["food","drink"], axis=1) +#y = customers["drink"] + +#X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.45, random_state=1) + +#drink_classifier = DecisionTreeClassifier(criterion = "entropy") +#drink_classifier.fit(X_train, y_train) + +#drink_classifier1 = DecisionTreeClassifier() +#drink_classifier1.fit(X_train, y_train) + +#drink_classifier2 = DecisionTreeClassifier(criterion = "entropy") +#drink_classifier2.fit(X_train, y_train) + +#y_pred1 = drink_classifier1.predict(X_test) +#y_pred2 = drink_classifier2.predict(X_test) + +#if accuracy_score(y_test, y_pred1) > accuracy_score(y_test, y_pred2): +# dump(drink_classifier1,'models/drink_model.joblib') +#else: +# dump(drink_classifier2,'models/drink_model.joblib') + +#dot_data=StringIO() +#tree = tree.export_graphviz(drink_classifier, out_file = dot_data, +# feature_names = X.columns, +# class_names = drink_objects, +# filled = True, rounded = True) +#graph = pydot.graph_from_dot_data(dot_data.getvalue()) +#graph[0].write_pdf("graphs/drink_model.pdf") diff --git a/graphs/drink_model.pdf b/graphs/drink_model.pdf new file mode 100644 index 0000000000000000000000000000000000000000..59d776f8473e6cd02a5433d6887af5a867ad6081 GIT binary patch literal 24453 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 MV=^*6R*}a1ABM=qx&QzG literal 0 HcmV?d00001 diff --git a/graphs/food_model.pdf b/graphs/food_model.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bec96fc34ab91e256869f9f995393b9f0955e465 GIT binary patch literal 28493 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 H6@mFbjeT>* literal 0 HcmV?d00001 diff --git a/learning_db.py b/learning_db.py new file mode 100644 index 0000000..fa0b749 --- /dev/null +++ b/learning_db.py @@ -0,0 +1,235 @@ +gender = ["M","M","M","M","M","M","M","M","M","M", + "M","M","M","M","M","M","M","M","M","M", + "M","M","M","M","M","M","M","M","M","M", + "M","M","M","M","M","M","M","M","M","M", + "M","M","M","M","M","M","M","M","M","M", + "M","M","M","M","M","M","M","M","M","M", + "M","M","M","M","M","M","M","M","M","M", + "M","M","M","M","M","M","M","M","M","M", + "M","M","M","M","M","M","M","M","M","M", + "M","M","M","M","M","M","M","M","M","M", + "W","W","W","W","W","W","W","W","W","W", + "W","W","W","W","W","W","W","W","W","W", + "W","W","W","W","W","W","W","W","W","W", + "W","W","W","W","W","W","W","W","W","W", + "W","W","W","W","W","W","W","W","W","W", + "W","W","W","W","W","W","W","W","W","W", + "W","W","W","W","W","W","W","W","W","W", + "W","W","W","W","W","W","W","W","W","W", + "W","W","W","W","W","W","W","W","W","W", + "W","W","W","W","W","W","W","W","W","W" + ] + +age = ["Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Child","Child","Child","Child","Child","Child","Child","Child","Child","Child", + + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult","Adult", + "Child","Child","Child","Child","Child","Child","Child","Child","Child","Child" + ] + +outfit = ["Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant", + "Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant", + "Casual","Casual","Casual","Casual","Casual","Elegant","Elegant","Elegant","Elegant","Elegant", + + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual","Casual", + "Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant", + "Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant","Elegant", + "Casual","Casual","Casual","Casual","Casual","Elegant","Elegant","Elegant","Elegant","Elegant" + ] + +cash = ["+","+","+","+","+","+","+","+","+","+", + "+","+","+","+","+","+","+","+","+","+", + "+","+","+","+","+","+","+","+","+","+", + "-","-","-","-","-","-","-","-","-","-", + "-","-","-","-","-","-","-","-","-","-", + "-","-","-","-","-","-","-","-","-","-", + "+","+","+","+","+","+","+","+","+","+", + "+","+","+","+","+","+","+","+","+","+", + "+","+","+","+","+","+","+","+","+","+", + "-","+","-","+","-","+","-","+","-","+", + + "+","+","+","+","+","+","+","+","+","+", + "+","+","+","+","+","+","+","+","+","+", + "+","+","+","+","+","+","+","+","+","+", + "-","-","-","-","-","-","-","-","-","-", + "-","-","-","-","-","-","-","-","-","-", + "-","-","-","-","-","-","-","-","-","-", + "+","+","+","+","+","+","+","+","+","+", + "+","+","+","+","+","+","+","+","+","+", + "+","+","+","+","+","+","+","+","+","+", + "-","+","-","+","-","+","-","+","-","+" + ] + + +time = ["Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening", + "Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon", + "Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening", + "Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon", + "Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening", + "Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon", + "Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening", + "Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon", + "Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening", + "Afternoon","Afternoon","Evening","Evening","Afternoon","Afternoon","Evening","Evening","Afternoon","Afternoon", + + "Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening", + "Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon", + "Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening", + "Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon", + "Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening", + "Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon", + "Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening", + "Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon","Afternoon", + "Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening","Evening", + "Afternoon","Afternoon","Evening","Evening","Afternoon","Afternoon","Evening","Evening","Afternoon","Afternoon" + ] + +vege = ["No","No","No","No","No","No","No","No","No","No", + "No","No","No","No","No","No","No","No","No","No", + "No","No","No","No","No","Yes","Yes","Yes","Yes","Yes", + "No","No","No","No","No","Yes","Yes","Yes","Yes","Yes", + "No","No","No","No","No","Yes","Yes","Yes","Yes","Yes", + "No","No","No","No","No","No","No","No","No","No", + "No","No","No","No","No","Yes","Yes","Yes","Yes","Yes", + "No","No","No","No","No","No","No","No","No","No", + "No","No","No","No","No","Yes","Yes","Yes","Yes","Yes", + "No","No","No","No","No","No","No","No","Yes","Yes", + + "No","No","No","No","No","No","No","No","No","No", + "No","No","No","No","No","No","No","No","No","No", + "No","No","No","No","No","Yes","Yes","Yes","Yes","Yes", + "No","No","No","No","No","Yes","Yes","Yes","Yes","Yes", + "No","No","No","No","No","Yes","Yes","Yes","Yes","Yes", + "No","No","No","No","No","No","No","No","No","No", + "No","No","No","No","No","Yes","Yes","Yes","Yes","Yes", + "No","No","No","No","No","No","No","No","No","No", + "No","No","No","No","No","Yes","Yes","Yes","Yes","Yes", + "No","No","No","No","No","No","No","No","Yes","Yes" + ] + +food = ['club_sandwich','steak','hot_dog','hamburger','hot_dog', + 'hot_dog','hot_dog','club_sandwich','steak','club_sandwich', + 'hamburger','steak','hamburger','club_sandwich','hot_dog', + 'hot_dog','steak','hot_dog','apple_pie','ice_cream', + 'pizza','hot_dog','hamburger','steak','club_sandwich', + + 'ice_cream','waffles','greek_salad','greek_salad','greek_salad', + 'lasagna','lasagna','ice_cream','ice_cream','steak', + 'greek_salad','waffles','greek_salad','apple_pie','waffles', + 'hamburger','pizza','lasagna','hamburger','hamburger', + 'ice_cream','waffles','greek_salad','club_sandwich','ice_cream', + + 'pizza','ice_cream','pizza','greek_salad','ice_cream', + 'lasagna','pizza','pizza','hamburger','club_sandwich', + 'club_sandwich','pizza','club_sandwich','apple_pie','club_sandwich', + 'ice_cream','waffles','greek_salad','apple_pie','greek_salad', + 'club_sandwich','steak','pizza','hamburger','hot_dog', + + 'hamburger','steak','hot_dog','steak','hot_dog', + 'hot_dog','hot_dog','hamburger','steak','club_sandwich', + 'greek_salad','waffles','waffles','apple_pie','greek_salad', + 'club_sandwich','club_sandwich','pizza','waffles','apple_pie', + 'hot_dog','ice_cream','greek_salad','apple_pie','ice_cream', + + 'club_sandwich','steak','steak','hamburger','hot_dog', + 'hot_dog','hot_dog','club_sandwich','steak','club_sandwich', + 'hamburger','steak','steak','lasagna','hot_dog', + 'hot_dog','ice_cream','greek_salad','pizza','ice_cream', + 'hot_dog','hot_dog','hamburger','steak','club_sandwich', + + 'waffles','waffles','greek_salad','waffles','greek_salad', + 'lasagna','lasagna','lasagna','lasagna','lasagna', + 'ice_cream','waffles','waffles','apple_pie','greek_salad', + 'pizza','pizza','hamburger','hamburger','ice_cream', + 'ice_cream','waffles','greek_salad','apple_pie','ice_cream', + + 'lasagna','ice_cream','hamburger','hamburger','ice_cream', + 'hamburger','hamburger','pizza','pizza','ice_cream', + 'lasagna','hot_dog','hamburger','steak','club_sandwich', + 'ice_cream','waffles','greek_salad','apple_pie','ice_cream', + 'club_sandwich','steak','hot_dog','hamburger','hot_dog', + + 'hamburger','steak','hot_dog','hamburger','hot_dog', + 'hot_dog','steak','hamburger','steak','club_sandwich', + 'ice_cream','waffles','greek_salad','apple_pie','greek_salad', + 'ice_cream','ice_cream','lasagna','apple_pie','apple_pie', + 'hot_dog','ice_cream','hot_dog','apple_pie','waffles' + ] + +drink = ["Whisky","Whisky","Whisky","Whisky","Whisky", + "Whisky","Whisky","Beer","Beer","Beer", + "Cola","Water","Orange Juice","Water","Beer", + "Cola","Water","Orange Juice","Cola","Beer", + "Beer","Beer","Beer","Beer","Beer", + + "Beer","Beer","Beer","Beer","Beer", + "Cola","Water","Orange Juice","Water","Beer", + "Cola","Water","Orange Juice","Cola","Beer", + "Beer","Beer","Beer","Beer","Beer", + "Beer","Beer","Beer","Beer","Beer", + + "Cola","Water","Orange Juice","Water","Beer", + "Cola","Water","Orange Juice","Cola","Beer", + "Whisky","Whisky","Whisky","Whisky","Whisky", + "Whisky","Whisky","Whisky","Beer","Beer", + "Beer","Beer","Beer","Beer","Beer", + + "Cola","Water","Orange Juice","Water","Beer", + "Beer","Beer","Beer","Beer","Beer", + "Beer","Beer","Beer","Beer","Beer", + "Orange Juice","Orange Juice","Cola","Cola","Cola", + "Cola","Cola","Cola","Cola","Cola", + + "Whisky","Whisky","Whisky","Red Wine","Red Wine", + "Red Wine","Red Wine","Red Wine","Red Wine","Whisky", + "Water","Water","Orange Juice","Orange Juice","Cola", + "Water","Water","Orange Juice","Orange Juice","Cola", + "Red Wine","Red Wine","Red Wine","Red Wine","Red Wine", + + "Whisky","Whisky","Whisky","Red Wine","Red Wine", + "Water","Water","Orange Juice","Orange Juice","Cola", + "Water","Water","Orange Juice","Orange Juice","Cola", + "Red Wine","Red Wine","Red Wine","Red Wine","Red Wine", + "Red Wine","Red Wine","Red Wine","Red Wine","Red Wine", + + "Water","Water","Orange Juice","Orange Juice","Cola", + "Water","Water","Orange Juice","Orange Juice","Cola", + "Red Wine","Red Wine","Red Wine","Red Wine","Red Wine", + "Red Wine","Red Wine","Whisky","Whisky","Whisky", + "Water","Water","Orange Juice","Orange Juice","Cola", + + "Water","Water","Orange Juice","Orange Juice","Cola", + "Red Wine","Red Wine","Red Wine","Red Wine","Red Wine", + "Red Wine","Red Wine","Red Wine","Red Wine","Red Wine", + "Orange Juice","Orange Juice","Orange Juice","Orange Juice","Orange Juice", + "Orange Juice","Orange Juice","Orange Juice","Cola","Cola" + ] diff --git a/main.py b/main.py index 549e020..76a7166 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,9 @@ import numpy as np from data import * from choice_tree import * +from joblib import load +from customertree import objects + import tensorflow as tf from keras import * import h5py @@ -36,6 +39,9 @@ CATEGORIES = [ "waffles" ] +food_model = load("models/food_model.joblib") +drink_model = load("models/drink_model.joblib") + model = tf.keras.models.load_model('final1') with h5py.File('food_10_64x3_test.hdf5', "r") as f: @@ -104,6 +110,84 @@ def client_ordering(): ### +class Client: + def __init__(self): + self.gender = random.choice(["Man","Woman"]) + self.outfit = random.choice(["Casual","Elegant"]) + self.cash = random.choice([20,20,20,30,30,50,50,70,80,90,100,100,120, + 120,150,200,300,500]) + self.time = random.choice(["Afternoon","Evening"]) + self.vege = random.choice(["No","No","No","No","Yes"]) + self.age = random.randint(12,80) + + def __str__(self): + return (self.gender + " Age: " + str(self.age) +" "+ self.outfit+ + " $"+ str(self.cash)+ " Vege: "+ self.vege) + +def order_drink(clt): + frame = [] + if clt.gender == "Man": + frame.append(0) + else: + frame.append(1) + if clt.age > 17: + frame.append(0) + else: + frame.append(1) + if clt.outfit == "Casual": + frame.append(0) + else: + frame.append(1) + if clt.cash > 100: + frame.append(0) + else: + frame.append(1) + if clt.time == "Evening": + frame.append(0) + else: + frame.append(1) + if clt.vege == "No": + frame.append(0) + else: + frame.append(1) + + drink_predict = drink_model.predict([frame]) + drink_index = drink_predict[0] + + return objects[-1][drink_index] + +def order_food(clt): + frame = [] + if clt.gender == "Man": + frame.append(0) + else: + frame.append(1) + if clt.age > 17: + frame.append(0) + else: + frame.append(1) + if clt.outfit == "Casual": + frame.append(0) + else: + frame.append(1) + if clt.cash > 100: + frame.append(0) + else: + frame.append(1) + if clt.time == "Evening": + frame.append(0) + else: + frame.append(1) + if clt.vege == "No": + frame.append(0) + else: + frame.append(1) + + food_predict = food_model.predict([frame]) + food_index = food_predict[0] + + return objects[-2][food_index] + ### class Node: def __init__(self, state, parent, action): @@ -553,7 +637,8 @@ while True: restaurant.tiles[waiter.y][waiter.x].clientState = "wait" waiter.orders = (waiter.x, waiter.y) DEFINE += 1 - waiter.order_list.insert(0, random.choice(CATEGORIES)) + cl = Client() + waiter.order_list.insert(0,client_ordering_food(cl)) if (waiter.x, waiter.y) == KITCHEN: if waiter.orders: restaurant.kitchen.append([waiter.orders[0], waiter.orders[1], 50]) diff --git a/models/drink_model.joblib b/models/drink_model.joblib new file mode 100644 index 0000000000000000000000000000000000000000..65f8a27491fad6d9190c0cf6b136af37c200adb8 GIT binary patch literal 5636 zcmbVQZ)_A*5Wn)LloO<2g#raiIp_g$*7C0+@)ioBuAEp9)@ZWs?QPl9`!{=gY7I?l z3<0Dmz)<%jJh)n$bd~LOz}H={!s~rcp8B6ntprb{Xp_GwI}g z7iPqbxpXd*%9;f$lTSMZlbb<{KE-HNW@w;;FjH?b+U3NPPU?{Bn}eQZ`!ouZ1H!xM zEGJ_YWo)fM$MTDwQ-B-dT<2NYWG-VCe9L!WR@}Hz;+Vae%_S*vcHFp`X=z}oOuk4r zIz&UZJ;y3IaO2n#^Hh)se~ws)r_&T+LTj8SDNh5*c|OcF!qk?g!E$V28zs9wqZh>-psADX0GVxi+;g`n`vHH)@21vm~TIpOQchYShkqS51ILt zO)DLaGhw^uSwjasE1zdIT|jHvJ`4+^qH4ticL9rRZWzucEd~$6Vq-e>UvRCw108zv z5m>?%IWI|Tywqr-ll`!a>yrKu1$9afTnfW-V+w_&`k+e>=}kvr#Q;R2`c!VX6;{UM z@q7QH#0Nd(!>R<|qm@qQo-{KVD-YeriV5n16I+fE^T}wcU?J9Oj99FUWS%N%iHe|N zcFuERnPS>ciR~3^D{awitac;)EzQC<1ZzsLb^vZMW>dxZPBLK~Edg7Dof{Kk$~j`% zFgrY9xK(d3F%pQgUG9Cb&c7d+Pw)iTOSZ+u~84nzS?M zo3@)uCxIBO&pdvnght~XD~}Is=MCz+w1M3m#qZz^gU18<`8mq+1B9m;b{Y$)PjLdA zq^ZpA^5L#w*d29=8_`20xZBm}LrV$naktZl))L(7?r=rp4EBL8Hgewp?4cWRYg;Cs z(A!IJzuWKb(K}19*WF3IL`(31yNhaiN-$8=`}8Kg)rWlvo_K7dHX0=(Y#$+&N&M=% z!=?4pw5(8wapYkQ+m2@VjZ(k$*<0sGT)v!(3*=L073#m+A*?J;!E^?W4 z356WDYZw>1b{XONLMoHKSwoLTKE6OYg+h*+hR1+i4UBMoA(hFge>&#AT)0RU356WD zXxNbKT4#iQgj6PikCOS~L5`a=c7n&#H7Q8Ind1*Ej{JP;B4PLD81)9)owZ*)e)YTEFyX-|Rimb*-j;?6zgpAy`fQ<~{xW zFW(UlVJl-E_e;!!)>blR4|3UEn5%A8yx=Xi8 z--a5r8=Z8&RNu#=Wc*#mp4IzI#5qc;>l4!OJT8+PsrFkYxqY8*T~hj&sQC<9@1x7z z8-D!i?@8ygI*!rGeG{z{XW!-LnvNg3La?s{Y_rxS@hc@)>pty`H$NI2xzmb}c!a?~dxrcu$i7obOf^U(0mE>zAUoZJ)$q~O%$|2+-K`l~7Jo>ALmu3}K zgRjg?{DAnFHu1cwMLcqKUX>%7&~!?!&a3jM{FK5xsPpyYR;}L5#QOH@#8`d6lbplo5w=AlC!}@5jKtRPc@7lh_9h=U=YV@O~s7`&#U3f>Gk|9AKU& zKynqXkLLvU5rjuOhLWPdFa?OBW3OcWh6rw-+8NCSv~s-#=}J literal 0 HcmV?d00001 diff --git a/models/food_model.joblib b/models/food_model.joblib new file mode 100644 index 0000000000000000000000000000000000000000..0ff914ae5e7e73d306a2e2aa9cbd15a91fac5dc3 GIT binary patch literal 10516 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 literal 0 HcmV?d00001