commit_natalia3
This commit is contained in:
parent
3c8c663597
commit
209e085e6c
@ -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 ##
|
||||
|
Loading…
Reference in New Issue
Block a user