diff options
Diffstat (limited to 'backend/microservice')
-rw-r--r-- | backend/microservice/mlservice.py | 112 |
1 files changed, 58 insertions, 54 deletions
diff --git a/backend/microservice/mlservice.py b/backend/microservice/mlservice.py index f8e98184..7f5ab9f2 100644 --- a/backend/microservice/mlservice.py +++ b/backend/microservice/mlservice.py @@ -11,22 +11,27 @@ from sklearn.preprocessing import LabelEncoder import csv import json class Response: - def __init__(self,history,rezultat,tacnost,preciznost,recall,spec,f1,classificationreport,mse,mae,mape,rmse,cmatrix,fpr,tpr): - self.history=history - self.rezultat=rezultat + def __init__(self,tacnost,preciznost,recall,spec,f1,mse,mae,mape,rmse,fpr,tpr): + self.tacnost=tacnost self.preciznost=preciznost self.recall=recall self.spec=spec self.f1=f1 - self.classificationreport=classificationreport self.mse=mse self.mae=mae self.mape=mape self.rmse=rmse - self.cmatrix=cmatrix self.fpr=fpr self.tpr=tpr +class fCallback(tf.keras.callbacks.Callback): + def __init__(self, x_test, y_test): + self.x_test = x_test + self.y_test = y_test + + + def on_epoch_end(self, epoch, logs=None): + print('Evaluation: ', self.model.evaluate(self.x_test)) ### 1)Ucitavanje vrednosti def obuka(data,params): @@ -49,28 +54,27 @@ def obuka(data,params): ### 2)Proveravanje svih kolona za null vrednosti i popunjavanje medijanom ili srednjom vrednosti ili birisanje #####Part2 ##### - ''' - brisanje=input("DA LI ZELITE DA IZBRSETE SVE KOLONE SA NULL VREDNOSTIMA? ") - brisanje=True + #brisanje=input("DA LI ZELITE DA IZBRSETE SVE KOLONE SA NULL VREDNOSTIMA? ") + brisanje='ne' if(brisanje=='da'): data=data.dropna(axis=1) elif(brisanje=='ne'): - brisanjer=input("DA LI ZELITE DA IZBRISETE SVE REDOVE SA NULL VREDNOSTINA ") + # brisanjer=input("DA LI ZELITE DA IZBRISETE SVE REDOVE SA NULL VREDNOSTIMA? ") + brisanjer='ne' if(brisanjer=='da'): data=data.dropna() elif(brisanjer=='ne'): for i in range(len(kolone)): - if(isinstance(data[kolone[i]].dtype, pd.CategoricalDtype)): - print('cat') if(data[kolone[i]].isnull().any()): tippodataka=data[kolone[i]].dtype kolona=data[kolone[i]].copy() if(tippodataka==np.float64 or tippodataka==np.int64): - popunjavanje=input("UNETI NACIN POPUNJAVANJA PROMENJIVIH SA NULL VREDNOSTIMA ") + #popunjavanje=input("UNETI NACIN POPUNJAVANJA PROMENJIVIH SA NULL VREDNOSTIMA ") + popunjavanje='medijana' if(popunjavanje=='medijana'): medijana=kolona.mean() data[kolone[i]]=data[kolone[i]].fillna(medijana) @@ -83,16 +87,14 @@ def obuka(data,params): elif(tippodataka==np.object_): najcescavrednost=kolona.value_counts().index[0] data[kolone[i]]=data[kolone[i]].fillna(najcescavrednost) - - ''' + ### 3)Izbacivanje kolona koje ne uticu na rezultat PART2 nredova=data.shape[0] for i in range(len(kolone)): if((data[kolone[i]].nunique()>(nredova/2)) and( data[kolone[i]].dtype==np.object_)): data.pop(kolone[i]) - - print(data.head(10)) + #print(data.head(10)) ### 4)izbor tipa enkodiranja kolone=data.columns ### Azuriranje postojecih kolona nakon moguceg brisanja @@ -109,7 +111,7 @@ def obuka(data,params): for k in range(len(kolone)): if(data[kolone[k]].dtype==np.object_): data[kolone[k]]=encoder.fit_transform(data[kolone[k]]) - print(data.head(20)) + #print(data.head(20)) ### 6)Enkodiranje svih kategorijskih promenjivih onehot metodom @@ -122,11 +124,11 @@ def obuka(data,params): kategorijskekolone.append(kolone[k]) ###U kategorijske kolone smestaju se nazivi svih kolona sa kategorijskim podacima - print(kategorijskekolone) + #print(kategorijskekolone) ### Enkodiranje data=pd.get_dummies(data,columns=kategorijskekolone,prefix=kategorijskekolone) - print(data.head(10)) + #print(data.head(10)) kolone=data.columns ### Azuriranje kolona nakon moguceg dodavanja @@ -148,22 +150,18 @@ def obuka(data,params): ###Dodavanje vrednosti u y, samo za label enkodiranje, bez prefiksa y=data[predvidetikol].values - print(data[xkolone].head(10)) - print(data[predvidetikol].head(10)) + #print(data[xkolone].head(10)) + #print(data[predvidetikol].head(10)) ### 7.2)Unos velicina za trening i test skup #trening=int(input('UNETI VELIČINU TRENING SKUPA ')) #test=int(input("UNETI VELICINU TESTNOG SKUPA")) test=params["randomTestSetDistribution"] - ###Provera unetih velicina - if(test<=0 or test>=100): - print("POGREŠAN UNOS VELIČINE SKUPA ZA TRENING") - if(test>1): - test=test/100 + ### 7.3)Da li korisnik zeli nasumicno rasporedjivanje podataka? #nasumicno=input("DA LI ŽELITE NASUMIČNO RASPOREDJIVANJE PODATAKA U TRENING I TEST SKUP? ") - nasumicno=params["randomTestSet"] + nasumicno=params["randomOrder"] ###!!!Dugme za nasumici izbor if(nasumicno): random=50 @@ -194,7 +192,7 @@ def obuka(data,params): #brojnu=int(input("UNETI BROJ NEURONA ULAZNOG SLOJA ")) aktivacijau=params["inputLayerActivationFunction"] - brojnu=params["inputNeurons"] + brojnu=len(kolone) classifier.add(tf.keras.layers.Dense(units=brojnu,activation=aktivacijau,input_dim=x_train.shape[1])) @@ -204,14 +202,16 @@ def obuka(data,params): aktivacijas=params["hiddenLayerActivationFunction"] brojns=params["hiddenLayerNeurons"] - - classifier.add(tf.keras.layers.Dense(units=brojns,activation=aktivacijas)) + brojskrivenih=params["hiddenLayers"] + for i in range(brojskrivenih): + classifier.add(tf.keras.layers.Dense(units=brojns,activation=aktivacijas)) + ### 12) Dodavanje treceg, izlaznog sloja #aktivacijai=input("UNETI ŽELJENU AKTIVACIONU FUNKCIJU IZLAZNOG SLOJA ") aktivacijai=params["outputLayerActivationFunction"] - + classifier.add(tf.keras.layers.Dense(units=1,activation=aktivacijai)) @@ -222,29 +222,30 @@ def obuka(data,params): optimizator=params["optimizer"] ### 13.1)Izbor metrike za kompajler PART2 - metrike=[] + metrike=['mae','mse'] + ''' while(1): m=params['lossFunction'] if(m=='KRAJ'): break - metrike.append(m) - classifier.compile(optimizer=optimizator, loss='binary_crossentropy',metrics = metrike) - + metrike.append(m)''' + classifier.compile(optimizer=optimizator, loss='binary_crossentropy',metrics =metrike) + performance_simple = fCallback(x_test, y_test) ### 14) #uzorci=int(input("UNETI KOLIKO UZORAKA ĆE BITI UNETO U ISTO VREME ")) #epohe=int(input("UNETI BROJ EPOHA")) uzorci=params["batchSize"] epohe=params["epochs"] - history=classifier.fit(x_train,y_train,batch_size=uzorci,epochs=epohe) + history=classifier.fit(x_train,y_train,batch_size=uzorci,epochs=epohe,callbacks=[performance_simple],validation_split=0.2) ### 14.1)Parametri grafika iz history PART2 metrikedf=pd.DataFrame() ###DataFrame u kom se nalaze podaci o rezultatima metrika za iscrtavanje na grafiku. Svaka kolona sadrzi vrednost metrike po epohama for i in range(len(metrike)): metrikedf[metrike[i]]=history.history[metrike[i]] #print(history.history[metrike[i]]) - plt.plot(history.history[metrike[i]]) - plt.show() + #plt.plot(history.history[metrike[i]]) + #plt.show() #print(metrikedf) @@ -254,7 +255,7 @@ def obuka(data,params): ### 15) Predvidjanje y_pred=classifier.predict(x_test) - print(y_pred) + #print(y_pred) ### 15.1) Formatiranje podataka za metrike PART2 y_pred=(y_pred>=0.5).astype('int') @@ -264,7 +265,7 @@ def obuka(data,params): #print(y_test) ### 15.2) Kreiranje DataFrame-a u kom se nalaze kolone koje predstavljaju stvarne i predvidjene vrednosti, potrebne za iscrtavanje grafika i metrike PART2 - rezultat=pd.DataFrame({"Stvarna vrednost ":y_test,"Predvidjena vrednost":y_pred}) + #rezultat=pd.DataFrame({"Stvarna vrednost ":y_test,"Predvidjena vrednost":y_pred}) #print(rezultat.head(20)) #####METRIKE##### PART2 @@ -274,52 +275,54 @@ def obuka(data,params): ### 16)Tacnost tacnost=sm.accuracy_score(y_test,y_pred) - print('tacnost ',tacnost) + #print('tacnost ',tacnost) ### 17)Preciznost preciznost=sm.precision_score(y_test,y_pred) - print('preciznost ',preciznost) + #print('preciznost ',preciznost) ### 18)Recall recall=sm.recall_score(y_test,y_pred) - print('recall ',recall) + #print('recall ',recall) ### 19)Specificity tn, fp, fn, tp = sm.confusion_matrix(y_test,y_pred).ravel() spec = tn / (tn+fp) - print('spec ',spec) + #print('spec ',spec) ### 20)F1 f1=sm.f1_score(y_test,y_pred) - print('f1 ',f1) + #print('f1 ',f1) ### 21)Classification report - classificationreport=sm.classification_report(y_test,y_pred) - print('classification ',classificationreport) + #classificationreport=sm.classification_report(y_test,y_pred) + #print('classification ',classificationreport) ### 22)Mean squared error (mse) mse=sm.mean_squared_error(y_test,y_pred) - print('mse ',mse) + #print('mse ',mse) ### 23)Mean absolute error (mae) mae=sm.mean_absolute_error(y_test,y_pred) - print('mae ',mae) + #print('mae ',mae) ### 24)Mean absolute percentage error (mape) mape=sm.mean_absolute_percentage_error(y_test,y_pred) - print('mape ',mape) + #print('mape ',mape) ### 25)Root mean square error (rmse) *** da bi se iskoristila u history, salje se u metrics preko funkcije import numpy as np rmse=np.sqrt(sm.mean_squared_error(y_test,y_pred)) - print("rmse ",rmse) + #print("rmse ",rmse) ### 26)Confusion matrix - cmatrix=sm.confusion_matrix(y_test,y_pred) - print('cmatrix ',cmatrix) + #cmatrix=sm.confusion_matrix(y_test,y_pred) + #print('cmatrix ',cmatrix) + ### 27)ROC fpr, tpr, _ = sm.roc_curve(y_test,y_pred) + ''' plt.plot(fpr, tpr, color='blue') plt.title('ROC') plt.xlim([0.0, 1.0]) @@ -327,8 +330,9 @@ def obuka(data,params): plt.ylim([0.0, 1.0]) plt.ylabel('True Positive Rate') plt.show() + ''' - r=Response(history,rezultat,tacnost,preciznost,recall,spec,f1,classificationreport,mse,mae,mape,rmse,cmatrix,fpr,tpr) + r=Response(tacnost,preciznost,recall,spec,f1,mse,mae,mape,rmse,fpr,tpr) return "Done" |