commit_natalia3
This commit is contained in:
parent
3c8c663597
commit
209e085e6c
@ -14,87 +14,76 @@ Tematem realizowanego projektu indywidualnego jest stworzenie sztucznej intelige
|
|||||||
- StringIO
|
- StringIO
|
||||||
##Realizacja projektu ##
|
##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);
|
Poszczególne liczby są oddzielone przecinkami, a wiersze znakiem nowej linii, plik z rozszerzeniem .csv.
|
||||||
- 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.
|
|
||||||
|
|
||||||
#### Proces uczenia: ####
|
#### 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
|
```python
|
||||||
def dataImport():
|
clf = DecisionTreeClassifier()
|
||||||
dataset = pd.read_csv('learnData4.csv', sep=',', header=None)
|
clf = DecisionTreeClassifier(criterion="entropy")
|
||||||
return dataset
|
|
||||||
```
|
```
|
||||||
|
Do modelu drzewa zostały wczytane dane, dzięki funkcji **fit**.
|
||||||
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
|
```python
|
||||||
def splitDataSet(dataset):
|
clf = clf.fit(X_train, y_train)
|
||||||
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
|
|
||||||
```
|
```
|
||||||
|
Generowane przewidywania są agregowane w zmiennej y_pred, dzięki funckji **predict**.
|
||||||
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
|
```python
|
||||||
model = tree.DecisionTreeClassifier()
|
y_pred = clf.predict(X_test)
|
||||||
model2 = tree.DecisionTreeClassifier(criterion="entropy")
|
|
||||||
|
|
||||||
model.fit(x_train, y_train)
|
|
||||||
model2.fit(x_train, y_train)
|
|
||||||
```
|
```
|
||||||
|
Następnie wyświetlana jest akuratność dla modelu danych o wybranym kryterium, dzięki funkcji **accuracy_score**.
|
||||||
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
|
```python
|
||||||
pred = model.predict(x_test)
|
print("Accuracy:", metrics.accuracy_score(y_test, y_pred))
|
||||||
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%
|
|
||||||
```
|
```
|
||||||
|
Drzewo decyzyjne ma swoją reprezentację graficzną, która utworzona została dzięki bibliotece IPython, graphviz, StringIO.
|
||||||
#### 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
|
```python
|
||||||
filename = 'finalized_model.sav'
|
dot_data = StringIO()
|
||||||
joblib.dump(model2, filename)
|
export_graphviz(clf, out_file=dot_data,
|
||||||
```
|
filled=True, rounded=True,
|
||||||
|
special_characters=True, feature_names=feature_cols,
|
||||||
Dodatkowo zostaje wygenerowane (przy pomocy biblioteki Graphviz i IPython) graficzne przedstawienie drzewa i zapisane w pliku .png:
|
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
|
```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)
|
file_name = 'final_model.sav'
|
||||||
|
joblib.dump(clf, file_name)
|
||||||
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 ##
|
## Integracja z projektem ##
|
||||||
|
Loading…
Reference in New Issue
Block a user