commit_natalia3

This commit is contained in:
Natalia 2020-05-24 19:25:48 +02:00
parent 3c8c663597
commit 209e085e6c

View File

@ -14,87 +14,76 @@ Tematem realizowanego projektu indywidualnego jest stworzenie sztucznej intelige
- StringIO
##Realizacja projektu ##
#### Dane wejściowe: ####
col_names = ['age', 'sex', 'fat', 'fiber', 'spicy', 'number']
model_tree = pd.read_csv("Nowy.csv", header=None, names=col_names)
model_tree.head()
feature_cols = ['age', 'sex', 'fat', 'fiber', 'spicy']
X = model_tree[feature_cols]
y = model_tree.number
Na początku dane są pobierane z pliku "Nowy.csv" gdzie zostały przygotowane 121 wiersze o kolumnach z kolejno podanymi nazwami. Następnie model zostal podzielony na cechy i etykietę ['number'], która oznacza polecane danie.
##### Dane: #####
Aby utworzyć model utworzyłam 121 wierszy z 6 kolejnych liczb oznaczających:
Do utworzenia modelu przygotowałam zestaw danych składający się z 60 krotek, każda składająca się z 6 liczb oznaczających odpowiednio:
- wiek klienta (7 - 80);
- zawartość tłuszczu w daniu (0 - 16);
- zawartość błonnika w daniu (0 - 16);
- płeć osoby zamawiającej (0 - kobieta lub 1 - mężczyzna);
- ostrość dania (0 - 5);
- polecane danie o danym numerze:
1. zupa z soczewicy
2. frytki pieczone
3. makaron z sosem brokułowym
4. pikantne skrzydełka zasmażane
5. ostre zasmażane tofu
6. hiszpańska zapiekanka ziemniaczana
7. pieczone warzywa
- wiek osoby zamawiającej danie (z przedziału 10 do 60);
- zawartość tłuszczu w daniu (z przedziału 0 do 16);
- zawartość błonnika w daniu (z przedziału 0 do 16);
- płeć osoby zamawiającej (0 - mężczyzna lub 1 - kobieta);
- wskazanie czy danie jest ostre czy nie (0 - nieostre lub 1 - ostre);
- wskazanie czy danie jest ciężkostrawne czy nie (0 - nie lub 1 - tak);
Liczby oddzielone są przecinkami i zapisane w pliku z rozszerzeniem .csv.
Poszczególne liczby są oddzielone przecinkami, a wiersze znakiem nowej linii, plik z rozszerzeniem .csv.
#### Proces uczenia: ####
Na początku dane są importowane do programu:
Następnie następuje podział danych na zestaw treningowy i testowy. Zestaw treningowy to 70% danych, testowy 30%. X to zestaw cech, Y zestaw wyników - tutaj etykieta "number".
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3,
random_state=1)
##### Drzewa decyzyjne: #####
Do stworzenia modelu drzew została wykorzystana funkcja **DecisionTreeClassifier.** Pierwsze drzewo przyjmuje jako kryterium indeks Gini (domyślny), drugie drzewo entropię.
```python
def dataImport():
dataset = pd.read_csv('learnData4.csv', sep=',', header=None)
return dataset
clf = DecisionTreeClassifier()
clf = DecisionTreeClassifier(criterion="entropy")
```
Do modelu drzewa zostały wczytane dane, dzięki funkcji **fit**.
```python
clf = clf.fit(X_train, y_train)
```
Generowane przewidywania są agregowane w zmiennej y_pred, dzięki funckji **predict**.
```python
y_pred = clf.predict(X_test)
```
Następnie wyświetlana jest akuratność dla modelu danych o wybranym kryterium, dzięki funkcji **accuracy_score**.
```python
print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
```
Drzewo decyzyjne ma swoją reprezentację graficzną, która utworzona została dzięki bibliotece IPython, graphviz, StringIO.
```python
dot_data = StringIO()
export_graphviz(clf, out_file=dot_data,
filled=True, rounded=True,
special_characters=True, feature_names=feature_cols,
class_names=['1', '2', '3', '4', '5', '6', '7'])
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_png('polecanie_1.png')
Image(graph.create_png())
```
Na końcu model (z większym wskaźnikiem trafności) zostaje zapisany do pliku z rozszerzeniem sav.
```python
file_name = 'final_model.sav'
joblib.dump(clf, file_name)
```
Następnie dane są dzielone odpowiednio na zestaw cech (*X*) i zestaw klas - "wyników" (*Y*). Zbiory te są jeszcze, przy pomocy funkcji **train_test_split** (z biblioteki scikit - learn) dodatkowo dzielone na zestawy do uczenia i zestawy do testowania (*x_train*, *x_test*, *y_train*, *y_test*):
```python
def splitDataSet(dataset):
X = dataset.values[:, 0:5]
Y = dataset.values[:, 5]
x_train, x_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=100)
return X, Y, x_train, x_test, y_train, y_test
```
Zbiór danych testowych składa się z 0.3 krotek zestawu początkowego.
Korzystając z funkcji **DecisionTreeClassifier** utworzony zostaje model w postaci drzewa, do którego następnie zostają załadowane uprzednio przygotowane zbiory danych:
```python
model = tree.DecisionTreeClassifier()
model2 = tree.DecisionTreeClassifier(criterion="entropy")
model.fit(x_train, y_train)
model2.fit(x_train, y_train)
```
Funkcja **DecisionTreeClassifier** domyślnie wykorzystuje indeks Gini jako kryterium podziału. Ja jednakże, wygenerowałam dodatkowo model, gdzie jako kryterium podziału została przyjęta entropia.
Następnie modele zostają poddane testowi i obliczony zostaje wskaźnik trafności wygenerowanych, na zbiorze testowym, wyników:
```python
pred = model.predict(x_test)
pred2 = model2.predict(x_test)
acc = accuracy_score(y_test, pred) * 100
acc2 = accuracy_score(y_test, pred2) * 100
print("akuratnosc dla modelu Gini: " + str(acc)) # aprox. 77.78%
print("akuratnosc dla modelu Entropy: " + str(acc2)) # aprox. 83.33%
```
#### Operacje na wygenerowanym modelu: ####
W tym przypadku, model z entropią daje nam większą trafność. Zatem to on zostanie wykorzystany w głównym programie. Model drzewa zostaje zapisany w pliku .sav:
```python
filename = 'finalized_model.sav'
joblib.dump(model2, filename)
```
Dodatkowo zostaje wygenerowane (przy pomocy biblioteki Graphviz i IPython) graficzne przedstawienie drzewa i zapisane w pliku .png:
```python
dot_data2 = tree.export_graphviz(model2, out_file=None, feature_names=["age", "fat", "fiber", "sex", "spicy"], class_names=["easty to digest", "hard to digest"], filled=True, rounded=True, special_characters=True)
graph2 pydotplus.graph_from_dot_data(dot_data2)
Image(graph2.create_png())
graph2.write_png("digest_entropy.png")
```
<img src="https://git.wmi.amu.edu.pl/s444412/DSZI_2020_Projekt/raw/master/Restaurant/Marta/digest_entropy.png" >
<img src="https://git.wmi.amu.edu.pl/s444412/DSZI_2020_Projekt/raw/master/Restaurant/Natalia/polecanie_1.png" >
## Integracja z projektem ##