# Pomoćni sadržaj

# Korišćeni podaci
# 
# Skup podataka "Wine Data Set"
# - repozitorijum skupova podataka "UC Irvine Machine Learning Repository":
#   Dua, D. and Graff, C. (2019). UCI Machine Learning Repository 
#   [http://archive.ics.uci.edu/ml]. Irvine, CA: University of California,
#   School of Information and Computer Science.
# - podaci o hemijskim analizama vina iz Italije
#   - izvorni vlasnik: Forina, M. et al, PARVUS - An Extendible Package for 
#     Data Exploration, Classification and Correlation. Institute of 
#     Pharmaceutical and Food Analysis and Technologies, Via Brigata Salerno, 
#     16147 Genoa, Italy.
#   - donator: Stefan Aeberhard, email: stefan '@' coral.cs.jcu.edu.au
#   - format podataka: CSV
#
# Internet strana:
# https://archive.ics.uci.edu/ml/datasets/Wine


# %% Biblioteke i inicijalizacija

import numpy as np
import pandas as pd
from keras.models import Sequential
from keras.layers import Dense
from keras.utils.np_utils import to_categorical

gpsv = np.random.default_rng(17)


# %% Priprema skupa podataka

podaci = pd.read_csv("wine.data", header=None, 
                     names=["klasa", "alkohol", "jabučna_kiselina",
                            "pepeo", "alkalnost_pepela", "magnezijum",
                            "ukupno_fenola", "flavanoidi",
                            "neflavanoidni_fenoli", "proantocijanini", 
                            "intenzitet_boje", "nijansa", "OD280_OD315",
                            "prolin"])

podaci["klasa"] = podaci["klasa"].values - 1

podaci["klasa_bin"] = podaci["klasa"]
podaci.loc[podaci["klasa_bin"] == 2, "klasa_bin"] = 0
kolona = podaci.pop("klasa_bin")
podaci.insert(1, "klasa_bin", kolona)

podaci = podaci.astype("float64")

podaci_obuka = podaci.sample(frac=0.8, random_state=gpsv.bit_generator)
podaci_obuka_ulazi = podaci_obuka.iloc[:, 2:]

podaci_test = podaci.drop(index=podaci_obuka.index)
podaci_test_ulazi = podaci_test.iloc[:, 2:]


# %% Zadatak 1

ulaz_dimenzija = podaci_obuka_ulazi.shape[1]

atribut_zavisni1 = "klasa_bin"
podaci_obuka_oznake = podaci_obuka[atribut_zavisni1]
podaci_test_oznake = podaci_test[atribut_zavisni1]

nm = Sequential()
nm.add(Dense(6, activation="tanh", kernel_initializer="zeros", 
             input_shape=(ulaz_dimenzija,)))
nm.add(Dense(1, activation="sigmoid"))

nm.compile(loss="binary_crossentropy", optimizer="adam", 
           metrics=["binary_accuracy"])

nm.summary()

nm.fit(podaci_obuka_ulazi, podaci_obuka_oznake, batch_size=71, epochs=200)

izlazi_test = nm.predict(podaci_test_ulazi)
print("Generisani izlazi za test podatke:")
print(izlazi_test.round(2))

ev = nm.evaluate(podaci_test_ulazi, podaci_test_oznake, verbose=0)
print("Performanse nad test podacima:")
print(ev)

# dodatno eksperimentisati s podešavanjima


# %% Zadatak 2

atribut_zavisni2 = "klasa"

klase_broj = podaci[atribut_zavisni2].unique().size

podaci_obuka_oznake2 = to_categorical(podaci_obuka[atribut_zavisni2], 
                                      klase_broj)
podaci_test_oznake2 = to_categorical(podaci_test[atribut_zavisni2],
                                     klase_broj)

nm2 = Sequential()
nm2.add(Dense(6, activation="tanh", kernel_initializer="zeros", 
              input_shape=(ulaz_dimenzija,)))
nm2.add(Dense(klase_broj, activation="softmax"))

nm2.compile(loss="categorical_crossentropy", optimizer="adam", 
            metrics=["categorical_accuracy"])

nm2.summary()

nm2.fit(podaci_obuka_ulazi, podaci_obuka_oznake2, batch_size=71, epochs=200)

izlazi_test2 = nm2.predict(podaci_test_ulazi)
print("Generisani izlazi za test podatke:")
print(izlazi_test2.round(2))

ev2 = nm2.evaluate(podaci_test_ulazi, podaci_test_oznake2, verbose=0)
print("Performanse nad test podacima:")
print(ev2)

# dodatno eksperimentisati s podešavanjima

