diff options
| author | TAMARA JERINIC <tamara.jerinic@gmail.com> | 2022-03-14 23:20:38 +0100 | 
|---|---|---|
| committer | TAMARA JERINIC <tamara.jerinic@gmail.com> | 2022-03-14 23:20:38 +0100 | 
| commit | ee8bd6d858df94263953d07b8c950b0d8de41c7a (patch) | |
| tree | 52479687b92fdbc9d1240fa25f9dbea52276cfbf /backend | |
| parent | 4dfd2ef4f3bb1821111def5c41e09c780e0fbc93 (diff) | |
Izmenjen je mlservice.py fajl. Promenjive su povezane sa neuronstellar\backend\microservice\PythonServer\project\api\api.py fajlom i omogućeno je prihvatanje vrednosti sa servera. Kreirana je klasa za povratne vrednosti.
Diffstat (limited to 'backend')
| -rw-r--r-- | backend/microservice/mlservice.py | 515 | 
1 files changed, 282 insertions, 233 deletions
| diff --git a/backend/microservice/mlservice.py b/backend/microservice/mlservice.py index 0780697c..f8e98184 100644 --- a/backend/microservice/mlservice.py +++ b/backend/microservice/mlservice.py @@ -1,286 +1,335 @@ +from typing_extensions import Self  import pandas as pd  import tensorflow as tf  import keras  import numpy as np -import matplotlib.pyplot as plt    -### 1)Ucitavanje vrednosti - -#print(1) -data1=pd.read_csv('titanic.csv') -data=data1.copy() -#print(data.head()) - -### U promenjivoj kolone nalaze se nazivi svih kolona seta podataka -kolone=data.columns -#print(kolone[1]) -#print(data[kolone[1]].isnull().sum()) -#print(data[kolone[1]].head(10)) - - -### 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? ") -if(brisanje=='da'): -    data=data.dropna(axis=1) -elif(brisanje=='ne'): -    brisanjer=input("DA LI ZELITE DA IZBRISETE SVE REDOVE SA NULL VREDNOSTINA ") -    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 ") -                    if(popunjavanje=='medijana'): -                        medijana=kolona.mean() -                        data[kolone[i]]=data[kolone[i]].fillna(medijana) -                    if(popunjavanje=='srednjavrednost'): -                        sv=data[kolone[i]].sum()/data[kolone[i]].count() -                        data[kolone[i]]=sv -                    if(popunjavanje=='brisanjekolone'): -                        data=data.dropna(axis=1) - -                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)) - -### 4)izbor tipa enkodiranja -kolone=data.columns ### Azuriranje postojecih kolona nakon moguceg brisanja - -enc=input("UNETI TIP ENKODIRANJA ") -onehot=0 - -### 5)Enkodiranje svih kategorijskih promenjivih label-encode metodom - -if(enc=='label'): -    from sklearn.preprocessing import LabelEncoder -    encoder=LabelEncoder() -    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)) - -### 6)Enkodiranje svih kategorijskih promenjivih onehot metodom - -elif(enc=='onehot'): -    ### PART2### -    onehot==1 -    kategorijskekolone=[] -    for k in range(len(kolone)): -        if(data[kolone[k]].dtype==np.object_): -             -            kategorijskekolone.append(kolone[k]) ###U kategorijske kolone smestaju se nazivi svih kolona sa kategorijskim podacima +from copyreg import constructor +import flask +from flask import request, jsonify, render_template +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 +        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 + +    ### 1)Ucitavanje vrednosti +def obuka(data,params): +    import numpy as np +    import pandas as pd +    import tensorflow as tf +    import matplotlib.pyplot as plt    +    #print(1) +    #data1=pd.read_csv('titanic.csv') +    #data=data1.copy() +    #print(data.head()) + +    ### U promenjivoj kolone nalaze se nazivi svih kolona seta podataka +    kolone=data.columns +    #print(kolone[1]) +    #print(data[kolone[1]].isnull().sum()) +    #print(data[kolone[1]].head(10)) + + +    ### 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? ") -    print(kategorijskekolone) - -    ### Enkodiranje  -    data=pd.get_dummies(data,columns=kategorijskekolone,prefix=kategorijskekolone) -    print(data.head(10)) - -kolone=data.columns ### Azuriranje kolona nakon moguceg dodavanja - -### 7)Podela skupa na skup za trening i skup za testiranje - -predvidetikol=input("UNETI NAZIV KOLONE ČIJU VREDNOST TREBA PREDVIDETI ") - -xkolone=[] -for k in range(len(kolone)): -        if(kolone[k]!=predvidetikol): +    brisanje=True +    if(brisanje=='da'): +        data=data.dropna(axis=1) +    elif(brisanje=='ne'): +        brisanjer=input("DA LI ZELITE DA IZBRISETE SVE REDOVE SA NULL VREDNOSTINA ") +        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() -            xkolone.append(kolone[k])###U xkolone se smestaju nazivi kolona cije vrednosti nije potrebno predvideti !!!Prefiks one-hot!!! - -### 7.1)Podela na x i y -###Dodavanje vrednosti u x -x=data[xkolone].values -###Dodavanje vrednosti u y, samo za label enkodiranje, bez prefiksa -y=data[predvidetikol].values - -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")) - -###Provera unetih velicina -if(trening<=0 or trening>=100): -    print("POGREŠAN UNOS VELIČINE SKUPA ZA TRENING") -if(trening>1): -    trening=trening/100 - -### 7.3)Da li korisnik zeli nasumicno rasporedjivanje podataka? -nasumicno=input("DA LI ŽELITE NASUMIČNO RASPOREDJIVANJE PODATAKA U TRENING I TEST SKUP? ") -###!!!Dugme za nasumici izbor -if(nasumicno=='da'): -    random=50 -else: -    random=0 +                    if(tippodataka==np.float64 or tippodataka==np.int64): +                        popunjavanje=input("UNETI NACIN POPUNJAVANJA PROMENJIVIH SA NULL VREDNOSTIMA ") +                        if(popunjavanje=='medijana'): +                            medijana=kolona.mean() +                            data[kolone[i]]=data[kolone[i]].fillna(medijana) +                        if(popunjavanje=='srednjavrednost'): +                            sv=data[kolone[i]].sum()/data[kolone[i]].count() +                            data[kolone[i]]=sv +                        if(popunjavanje=='brisanjekolone'): +                            data=data.dropna(axis=1) + +                    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]) -### 7.4)Podela podataka -from sklearn.model_selection import train_test_split -x_train,x_test,y_train,y_test=train_test_split(x,y,train_size=trening,random_state=random) -### 8)Skaliranje podataka -from sklearn.preprocessing import StandardScaler -scaler=StandardScaler() -scaler.fit(x_train) -x_test=scaler.transform(x_test) -x_train=scaler.transform(x_train) +    print(data.head(10)) -#####ZAVRSENA PRIPREMA PODATAKA##### +    ### 4)izbor tipa enkodiranja +    kolone=data.columns ### Azuriranje postojecih kolona nakon moguceg brisanja + +    #enc=input("UNETI TIP ENKODIRANJA ") +    enc=params["encoding"] +    onehot=0 + +    ### 5)Enkodiranje svih kategorijskih promenjivih label-encode metodom + +    if(enc=='label'): +        from sklearn.preprocessing import LabelEncoder +        encoder=LabelEncoder() +        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)) + +    ### 6)Enkodiranje svih kategorijskih promenjivih onehot metodom + +    elif(enc=='onehot'): +        ### PART2### +        onehot==1 +        kategorijskekolone=[] +        for k in range(len(kolone)): +            if(data[kolone[k]].dtype==np.object_): +                 +                kategorijskekolone.append(kolone[k]) ###U kategorijske kolone smestaju se nazivi svih kolona sa kategorijskim podacima +         +        print(kategorijskekolone) -#####OBUCAVANJE MODELA##### +        ### Enkodiranje  +        data=pd.get_dummies(data,columns=kategorijskekolone,prefix=kategorijskekolone) +        print(data.head(10)) -### 9)Inicijalizacija vestacke neuronske mreze +    kolone=data.columns ### Azuriranje kolona nakon moguceg dodavanja -classifier=tf.keras.Sequential() +    ### 7)Podela skupa na skup za trening i skup za testiranje -### 10)Dodavanje prvog,ulaznog sloja -aktivacijau=input("UNETI ŽELJENU AKTIVACIONU FUNKCIJU ULAZNOG SLOJA ") -brojnu=int(input("UNETI BROJ NEURONA ULAZNOG SLOJA ")) +    #predvidetikol=input("UNETI NAZIV KOLONE ČIJU VREDNOST TREBA PREDVIDETI ") +    ###sta se cuva od promenjivih broj kolone ili naziv kolone??? +    predvidetikol=params["columnToPredict"] -classifier.add(tf.keras.layers.Dense(units=brojnu,activation=aktivacijau,input_dim=x_train.shape[1])) +    xkolone=[] +    for k in range(len(kolone)): +            if(kolone[k]!=predvidetikol): +                 +                xkolone.append(kolone[k])###U xkolone se smestaju nazivi kolona cije vrednosti nije potrebno predvideti !!!Prefiks one-hot!!! -### 11)Dodavanje drugog, skrivenog sloja -aktivacijas=input("UNETI ŽELJENU AKTIVACIONU FUNKCIJU SKRIVENOG SLOJA ") -brojns=int(input("UNETI BROJ NEURONA SKRIVENOG SLOJA ")) +    ### 7.1)Podela na x i y +    ###Dodavanje vrednosti u x +    x=data[xkolone].values +    ###Dodavanje vrednosti u y, samo za label enkodiranje, bez prefiksa +    y=data[predvidetikol].values -classifier.add(tf.keras.layers.Dense(units=brojns,activation=aktivacijas)) +    print(data[xkolone].head(10)) +    print(data[predvidetikol].head(10)) -### 12) Dodavanje treceg, izlaznog sloja -aktivacijai=input("UNETI ŽELJENU AKTIVACIONU FUNKCIJU IZLAZNOG SLOJA ") +    ### 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 -classifier.add(tf.keras.layers.Dense(units=1,activation=aktivacijai)) +    ### 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"] +    ###!!!Dugme za nasumici izbor +    if(nasumicno): +        random=50 +    else: +        random=0 +    ### 7.4)Podela podataka +    from sklearn.model_selection import train_test_split +    x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=test,random_state=random) -### 13) Kompajliranje neuronske mreze -#gubici=input("UNETI FUNKCIJU OBRADE GUBITAKA ") -optimizator=input("UNETI ŽELJENI OPTIMIZATOR ") +    ### 8)Skaliranje podataka +    from sklearn.preprocessing import StandardScaler +    scaler=StandardScaler() +    scaler.fit(x_train) +    x_test=scaler.transform(x_test) +    x_train=scaler.transform(x_train) -### 13.1)Izbor metrike za kompajler PART2 -metrike=[] -while(1): -    m=input("UNETI ZELJENE METRIKE ") -     -    if(m=='KRAJ'): -        break    -    metrike.append(m) -classifier.compile(optimizer=optimizator, loss='binary_crossentropy',metrics = metrike) +    #####ZAVRSENA PRIPREMA PODATAKA##### -### 14)  -uzorci=int(input("UNETI KOLIKO UZORAKA ĆE BITI UNETO U ISTO VREME ")) +    #####OBUCAVANJE MODELA##### -history=classifier.fit(x_train,y_train,batch_size=uzorci,epochs=10) +    ### 9)Inicijalizacija vestacke neuronske mreze -### 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() +    classifier=tf.keras.Sequential() -#print(metrikedf) +    ### 10)Dodavanje prvog,ulaznog sloja +    #aktivacijau=input("UNETI ŽELJENU AKTIVACIONU FUNKCIJU ULAZNOG SLOJA ") +    #brojnu=int(input("UNETI BROJ NEURONA ULAZNOG SLOJA ")) -#metrikedf.to_csv("metrike.csv") +    aktivacijau=params["inputLayerActivationFunction"] +    brojnu=params["inputNeurons"] +    classifier.add(tf.keras.layers.Dense(units=brojnu,activation=aktivacijau,input_dim=x_train.shape[1])) -### 15) Predvidjanje -y_pred=classifier.predict(x_test) +    ### 11)Dodavanje drugog, skrivenog sloja +    #aktivacijas=input("UNETI ŽELJENU AKTIVACIONU FUNKCIJU SKRIVENOG SLOJA ") +    #brojns=int(input("UNETI BROJ NEURONA SKRIVENOG SLOJA ")) -print(y_pred) +    aktivacijas=params["hiddenLayerActivationFunction"] +    brojns=params["hiddenLayerNeurons"] -### 15.1) Formatiranje podataka za metrike PART2 -y_pred=(y_pred>=0.5).astype('int') -y_pred=y_pred.flatten() +    classifier.add(tf.keras.layers.Dense(units=brojns,activation=aktivacijas)) -#print(y_pred) +    ### 12) Dodavanje treceg, izlaznog sloja +    #aktivacijai=input("UNETI ŽELJENU AKTIVACIONU FUNKCIJU IZLAZNOG SLOJA ") -#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}) -print(rezultat.head(20)) +    aktivacijai=params["outputLayerActivationFunction"] -#####METRIKE##### PART2 +    classifier.add(tf.keras.layers.Dense(units=1,activation=aktivacijai)) -import  sklearn.metrics as sm -           -### 16)Tacnost -tacnost=sm.accuracy_score(y_test,y_pred) -print('tacnost ',tacnost) +    ### 13) Kompajliranje neuronske mreze +    #gubici=input("UNETI FUNKCIJU OBRADE GUBITAKA ") +    #optimizator=input("UNETI ŽELJENI OPTIMIZATOR ") -### 17)Preciznost -preciznost=sm.precision_score(y_test,y_pred) -print('preciznost ',preciznost) +    optimizator=params["optimizer"] -### 18)Recall -recall=sm.recall_score(y_test,y_pred) -print('recall ',recall) +    ### 13.1)Izbor metrike za kompajler PART2 +    metrike=[] +    while(1): +        m=params['lossFunction'] +         +        if(m=='KRAJ'): +            break    +        metrike.append(m) +    classifier.compile(optimizer=optimizator, loss='binary_crossentropy',metrics = metrike) -### 19)Specificity -tn, fp, fn, tp = sm.confusion_matrix(y_test,y_pred).ravel() -spec = tn / (tn+fp) -print('spec ',spec) +    ### 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) -### 20)F1 -f1=sm.f1_score(y_test,y_pred) -print('f1 ',f1) +    ### 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() -### 21)Classification report -classificationreport=sm.classification_report(y_test,y_pred) -print('classification ',classificationreport) +    #print(metrikedf) -### 22)Mean squared error (mse) -mse=sm.mean_squared_error(y_test,y_pred) -print('mse ',mse) +    #metrikedf.to_csv("metrike.csv") -### 23)Mean absolute error (mae) -mae=sm.mean_absolute_error(y_test,y_pred) -print('mae ',mae) -### 24)Mean absolute percentage error (mape) -mape=sm.mean_absolute_percentage_error(y_test,y_pred) -print('mape ',mape) +    ### 15) Predvidjanje +    y_pred=classifier.predict(x_test) -### 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(y_pred) -### 26)Confusion matrix -cmatrix=sm.confusion_matrix(y_test,y_pred) -print('cmatrix ',cmatrix) +    ### 15.1) Formatiranje podataka za metrike PART2 +    y_pred=(y_pred>=0.5).astype('int') +    y_pred=y_pred.flatten() -### 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]) -plt.xlabel('False Positive Rate') -plt.ylim([0.0, 1.0]) -plt.ylabel('True Positive Rate') -plt.show() +    #print(y_pred) +    #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}) +    #print(rezultat.head(20)) +    #####METRIKE##### PART2 +    import  sklearn.metrics as sm +             +    ### 16)Tacnost +    tacnost=sm.accuracy_score(y_test,y_pred) +    print('tacnost ',tacnost) + +    ### 17)Preciznost +    preciznost=sm.precision_score(y_test,y_pred) +    print('preciznost ',preciznost) + +    ### 18)Recall +    recall=sm.recall_score(y_test,y_pred) +    print('recall ',recall) + +    ### 19)Specificity +    tn, fp, fn, tp = sm.confusion_matrix(y_test,y_pred).ravel() +    spec = tn / (tn+fp) +    print('spec ',spec) + +    ### 20)F1 +    f1=sm.f1_score(y_test,y_pred) +    print('f1 ',f1) + +    ### 21)Classification report +    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) + +    ### 23)Mean absolute error (mae) +    mae=sm.mean_absolute_error(y_test,y_pred) +    print('mae ',mae) + +    ### 24)Mean absolute percentage error (mape) +    mape=sm.mean_absolute_percentage_error(y_test,y_pred) +    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) + +    ### 26)Confusion matrix +    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]) +    plt.xlabel('False Positive Rate') +    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) +     +    return "Done" | 
