# Iris - example using Keras

import warnings
warnings.filterwarnings("ignore")

import pandas as pd                             # data processing, CSV file I/O (e.g. pd.read_csv)
import seaborn as sns                           #visualisation 
import matplotlib.pyplot as plt                 #visualisation
import numpy as np                              # linear algebra
from sklearn import preprocessing

data=pd.read_csv("../Iris.csv")
print("Info of the data:",data.info())

#-------------------------------------------------------------------------
sns.lmplot(x='sepal.length', y='sepal.width', data=data, fit_reg=False, hue="variety", scatter_kws={"marker": "D", "s": 50})
plt.title('SepalLength vs SepalWidth')

sns.lmplot(x='petal.length', y='petal.width', data=data, fit_reg=False, hue="variety", scatter_kws={"marker": "D", "s": 50})
plt.title('PetalLength vs PetalWidth')

sns.lmplot(x='sepal.length', y='petal.length', data=data, fit_reg=False, hue="variety", scatter_kws={"marker": "D", "s": 50})
plt.title('SepalLength vs PetalLength')

sns.lmplot(x='sepal.width', y='petal.width', data=data, fit_reg=False, hue="variety", scatter_kws={"marker": "D", "s": 50})
plt.title('SepalWidth vs PetalWidth')
plt.show()
#-------------------------------------------------------------------------

data=data.loc[np.random.permutation(len(data))]


enc = preprocessing.OneHotEncoder(handle_unknown='ignore')
enc_data = enc.fit_transform(data[["variety"]]).toarray ().astype(int)
data.drop("variety", axis= 1 , inplace= True )

data[["c1","c2","c3"]] = enc_data

# Converting data to numpy array in order for processing
x=data.iloc[:,0:4].values
y=data.iloc[:,4:7].values

x_normalized=preprocessing.normalize(x,axis=0)

total_length=len(data)
train_length=int(0.8*total_length)
test_length=int(0.2*total_length)

x_train=x_normalized[:train_length]
x_test=x_normalized[train_length:]
y_train=y[:train_length]
y_test=y[train_length:]

#Neural network module
import keras
from keras.models import Sequential 
from keras.layers import Dense

model=Sequential()
model.add(Dense(20, input_dim=4, activation='relu'))
model.add(Dense(3,activation='softmax'))
model.compile(loss='mse', optimizer='adam')

callback = keras.callbacks.EarlyStopping(monitor="loss", mode="min", verbose=1, patience=100, min_delta=0.001)
model.fit(x_train, y_train, batch_size=20, epochs=10000, verbose=1, callbacks=[callback])

prediction=model.predict(x_test)
length=len(prediction)
y_label=np.argmax(y_test,axis=1)
predict_label=np.argmax(prediction,axis=1)

accuracy=np.sum(y_label==predict_label)/length * 100 
print("Accuracy of the dataset",accuracy )

