aboutsummaryrefslogtreecommitdiff
path: root/frontend
diff options
context:
space:
mode:
Diffstat (limited to 'frontend')
-rw-r--r--frontend/package-lock.json33
-rw-r--r--frontend/package.json1
-rw-r--r--frontend/src/app/_data/Model.ts32
-rw-r--r--frontend/src/app/_pages/add-model/add-model.component.html73
-rw-r--r--frontend/src/app/_pages/add-model/add-model.component.ts25
-rw-r--r--frontend/src/app/app.module.ts5
6 files changed, 121 insertions, 48 deletions
diff --git a/frontend/package-lock.json b/frontend/package-lock.json
index 0bb72f0f..b5ca9d02 100644
--- a/frontend/package-lock.json
+++ b/frontend/package-lock.json
@@ -28,6 +28,7 @@
"csv-parser": "^3.0.0",
"d3-graphviz": "^2.6.1",
"mdb-angular-ui-kit": "^2.0.0",
+ "ng-multiselect-dropdown": "^0.3.8",
"ng-uikit-pro-standard": "^1.0.0",
"ng2-charts": "^3.0.8",
"ng2-search-filter": "^0.5.1",
@@ -8124,6 +8125,23 @@
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
},
+ "node_modules/ng-multiselect-dropdown": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/ng-multiselect-dropdown/-/ng-multiselect-dropdown-0.3.8.tgz",
+ "integrity": "sha512-b6WohT+ouGQfBqo+OpYPClJI25Qmj/nNWcyGUIMh2JCAHEpWEQRUVzHJB7pPVW+n5a/P26I/sLyOQekxfkW9aQ==",
+ "dependencies": {
+ "tslib": "^1.9.0"
+ },
+ "peerDependencies": {
+ "@angular/common": ">=2.0.0",
+ "@angular/core": ">=2.0.0"
+ }
+ },
+ "node_modules/ng-multiselect-dropdown/node_modules/tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ },
"node_modules/ng-uikit-pro-standard": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ng-uikit-pro-standard/-/ng-uikit-pro-standard-1.0.0.tgz",
@@ -17681,6 +17699,21 @@
"integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==",
"dev": true
},
+ "ng-multiselect-dropdown": {
+ "version": "0.3.8",
+ "resolved": "https://registry.npmjs.org/ng-multiselect-dropdown/-/ng-multiselect-dropdown-0.3.8.tgz",
+ "integrity": "sha512-b6WohT+ouGQfBqo+OpYPClJI25Qmj/nNWcyGUIMh2JCAHEpWEQRUVzHJB7pPVW+n5a/P26I/sLyOQekxfkW9aQ==",
+ "requires": {
+ "tslib": "^1.9.0"
+ },
+ "dependencies": {
+ "tslib": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz",
+ "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg=="
+ }
+ }
+ },
"ng-uikit-pro-standard": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/ng-uikit-pro-standard/-/ng-uikit-pro-standard-1.0.0.tgz",
diff --git a/frontend/package.json b/frontend/package.json
index e43cb721..9df48b0c 100644
--- a/frontend/package.json
+++ b/frontend/package.json
@@ -31,6 +31,7 @@
"csv-parser": "^3.0.0",
"d3-graphviz": "^2.6.1",
"mdb-angular-ui-kit": "^2.0.0",
+ "ng-multiselect-dropdown": "^0.3.8",
"ng-uikit-pro-standard": "^1.0.0",
"ng2-charts": "^3.0.8",
"ng2-search-filter": "^0.5.1",
diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts
index ff9f8329..1a16d960 100644
--- a/frontend/src/app/_data/Model.ts
+++ b/frontend/src/app/_data/Model.ts
@@ -31,7 +31,7 @@ export default class Model {
public username: string = '',
public nullValues: NullValueOptions = NullValueOptions.DeleteRows,
public nullValuesReplacers: NullValReplacer[] = [],
- public metrics: Metric[] = [], // TODO add to add-model form
+ public metrics: string[] = [], // TODO add to add-model form
public epochs: number = 5 // TODO add to add-model form
) { }
}
@@ -167,9 +167,35 @@ export class NullValReplacer {
"value" : string;
}
-export enum Metric {
+export enum Metrics {
MSE = 'mse',
MAE = 'mae',
RMSE = 'rmse'
- //...
+
+}
+export enum MetricsRegression
+{
+ Mse = 'mse',
+ Mae = 'mae',
+ Mape = 'mape',
+ Msle='msle',
+ CosineProximity='cosine'
+}
+export enum MetricsBinaryClassification
+{
+ Accuracy='binary_accuracy',
+ Auc="AUC",
+ Precision='precision_score',
+ Recall='recall_score',
+ F1='f1_score',
+
+
+}
+export enum MetricsMultiClassification
+{
+ Accuracy='categorical_accuracy',
+ Auc="AUC",
+ Precision='precision_score',
+ Recall='recall_score',
+ F1='f1_score',
}
diff --git a/frontend/src/app/_pages/add-model/add-model.component.html b/frontend/src/app/_pages/add-model/add-model.component.html
index 593d52b7..5e8372c9 100644
--- a/frontend/src/app/_pages/add-model/add-model.component.html
+++ b/frontend/src/app/_pages/add-model/add-model.component.html
@@ -234,6 +234,8 @@
</div>
<div class="row p-2">
+ <!--***********************************ENKODER*********************************************-->
+
<div class="col-1">
</div>
<div class="col-3">
@@ -247,6 +249,9 @@
</option>
</select>
</div>
+
+ <!--***********************************BROJ NEURONA SKRIVENOG SLOJA*********************************************-->
+
<div class="col-1">
</div>
<div class="col-3">
@@ -256,7 +261,8 @@
<input type="number" min="1" class="form-control" name="hiddenLayerNeurons"
[(ngModel)]="newModel.hiddenLayerNeurons">
</div>
- </div>
+ </div>
+<!--***********************************OPTIMIZACIJA*********************************************-->
<div class="row p-2">
<div class="col-1">
@@ -283,7 +289,7 @@
</div>
</div>
<!--***********************************LOSS FUNCTION*********************************************-->
- <div class="row p-2">
+ <div class="row justify-content-center">
<div class="col-1">
</div>
<div class="col-3">
@@ -291,7 +297,7 @@
</div>
<div class="col-2">
<select id=lossFunctionOptions class="form-control" name="lossFunction"
- [(ngModel)]="newModel.lossFunction">
+ [(ngModel)]="newModel.lossFunction" aria-checked="true">
<option
*ngFor="let option of Object.keys(lossFunction); let optionName of Object.values(lossFunction)"
[value]="option">
@@ -301,8 +307,27 @@
</div>
<div class="col-1">
</div>
-
+ </div>
<!-- ************************************************************************************************** -->
+
+<!--**********************************************METRIKE ZA KOMPAJLER I GRAFIKE***********************************************-->
+
+<hr>
+ <div class="form-check form-check-inline overflow-auto " style="width: max-content;">
+ <h3>Izaberite metrike:</h3>
+ <div id="divMetricsinput" >
+
+ <div *ngFor="let option of Object.keys(metrics); let optionName of Object.values(metrics) "class="form-check form-check-inline">
+
+ <input name="cbmetrics" class="form-check-input" type="checkbox" value="{{option}}" id="metrics_{{option}}" style="float: left;">
+ <label class="form-check-label" for="metrics_{{option}}" for="inlineCheckbox2">
+ {{optionName}}
+ </label>
+ </div>
+ </div>
+ </div>
+<!--************************************************************************************************* -->
+
<div class="col-3 mt-2">
<label for="type" class="form-check-label">Nasumičan redosled podataka?</label>
<input class="mx-3 form-check-input" type="checkbox" [(ngModel)]="newModel.randomOrder"
@@ -310,9 +335,9 @@
</div>
<div class="col-1">
</div>
- </div>
+
- <!--<div class="row p-2">
+ <div class="row p-2 justify-content-left">
<div class="col-3"></div>
<div class="col-3">
<label for="hiddenLayerActivationFunction" class="col-form-label">Funkcija aktivacije skrivenih
@@ -332,7 +357,7 @@
</div>
<div class="col-3"></div>
</div>
- -->
+
<div class="row p-2">
<div class="col-1">
</div>
@@ -353,36 +378,8 @@
[(ngModel)]="tempTestSetDistribution" [disabled]="!newModel.randomTestSet">
</div>
</div>
- <div class="col">
- trening
- <mat-slider min="10" max="90" step="10" value="10" name="randomTestSetDistribution" thumbLabel
- [disabled]="!newModel.randomTestSet" [(ngModel)]="tempTestSetDistribution">
- </mat-slider>
- test
- </div>
+
<!--***********************************AKTIVACIONE FUNKCIJE*********************************************-->
-<h3 >Aktivacione funkcije</h3>
-
- <div class="row p-2" style="align-self: center;">
- <div class="col-3"></div>
- <div class="col-3">
- <label for="hiddenLayerActivationFunction" class="col-form-label" style="text-align: center;">Funkcija aktivacije skrivenih
- slojeva:</label>
- </div>
- <div class="col-3">
- <div *ngFor="let item of [].constructor(newModel.hiddenLayers); let i = index">
- <select [id]="'hiddenLayerActivationFunctionOption_'+i" class="form-control"
- [(ngModel)]="newModel.hiddenLayerActivationFunctions[i]">
- <option
- *ngFor="let option of Object.keys(ActivationFunction); let optionName of Object.values(ActivationFunction)"
- [value]="option">
- {{ optionName }}
- </option>
- </select>
- </div>
- </div>
- <div class="col-3"></div>
- </div>
<div class="row p-2" style="align-self: center;">
<div class="col-1">
@@ -405,13 +402,13 @@
</div>
- <!--<div class="col">
+ <div class="col">
trening
<mat-slider min="10" max="90" step="10" value="10" name="randomTestSetDistribution" thumbLabel
[disabled]="!newModel.randomTestSet" [(ngModel)]="tempTestSetDistribution">
</mat-slider>
test
- </div>-->
+ </div>
<div class="col">
</div>
</div>
diff --git a/frontend/src/app/_pages/add-model/add-model.component.ts b/frontend/src/app/_pages/add-model/add-model.component.ts
index 4428c8c6..a1d36b42 100644
--- a/frontend/src/app/_pages/add-model/add-model.component.ts
+++ b/frontend/src/app/_pages/add-model/add-model.component.ts
@@ -1,6 +1,6 @@
import { Component, OnInit, ViewChild } from '@angular/core';
import Model, { LossFunctionBinaryClassification, LossFunctionMultiClassification, LossFunctionRegression, NullValReplacer, ReplaceWith } from 'src/app/_data/Model';
-import { ProblemType, Encoding, ActivationFunction, LossFunction, Optimizer, NullValueOptions } from 'src/app/_data/Model';
+import { ProblemType, Encoding, ActivationFunction, LossFunction, Optimizer, NullValueOptions,Metrics,MetricsRegression , MetricsBinaryClassification,MetricsMultiClassification} from 'src/app/_data/Model';
import { DatasetLoadComponent } from 'src/app/_elements/dataset-load/dataset-load.component';
import { ModelsService } from 'src/app/_services/models.service';
import shared from 'src/app/Shared';
@@ -10,6 +10,7 @@ import { DatasetsService } from 'src/app/_services/datasets.service';
import { NgxCsvParser } from 'ngx-csv-parser';
import { CsvParseService } from 'src/app/_services/csv-parse.service';
+
@Component({
selector: 'app-add-model',
templateUrl: './add-model.component.html',
@@ -27,7 +28,7 @@ export class AddModelComponent implements OnInit {
ProblemType = ProblemType;
Encoding = Encoding;
ActivationFunction = ActivationFunction;
- activationFunction:any=ActivationFunction
+ metrics:any=Metrics;
LossFunction = LossFunction;
lossFunction : any = LossFunction;
Optimizer = Optimizer;
@@ -54,7 +55,7 @@ export class AddModelComponent implements OnInit {
term: string = "";
selectedProblemType:string='';
-
+ selectedMetrics=[];
constructor(private models: ModelsService, private datasets: DatasetsService, private csv: CsvParseService) {
this.newModel = new Model();
@@ -108,6 +109,7 @@ export class AddModelComponent implements OnInit {
this.getCheckedInputCols();
this.getCheckedOutputCol();
+ this.getMetrics();
if (this.validationInputsOutput()) {
console.log('ADD MODEL: STEP 1 - UPLOAD FILE');
@@ -155,7 +157,7 @@ export class AddModelComponent implements OnInit {
if (this.selectedDataset) { //dataset je izabran
this.getCheckedInputCols();
this.getCheckedOutputCol();
-
+ this.getMetrics();
if (this.validationInputsOutput()) {
this.newModel.datasetId = this.selectedDataset._id;
@@ -473,17 +475,30 @@ export class AddModelComponent implements OnInit {
switch(this.problemtype){
case 'regresioni':
this.lossFunction=LossFunctionRegression;
+ this.metrics=MetricsRegression;
break;
case 'binarni-klasifikacioni':
this.lossFunction=LossFunctionBinaryClassification;
+ this.metrics=MetricsBinaryClassification;
break;
case 'multi-klasifikacioni':
this.lossFunction=LossFunctionMultiClassification;
+ this.metrics=MetricsMultiClassification;
break;
default:
break;
}
}
-
+ getMetrics() {
+ this.newModel.metrics=[];
+ let cb = document.getElementsByName("cbmetrics");
+
+ for (let i = 0; i < cb.length; i++) {
+ let chb = <HTMLInputElement>cb[i];
+ if (chb.checked == true)
+ this.newModel.metrics.push(chb.value);
+ }
+
+ }
}
diff --git a/frontend/src/app/app.module.ts b/frontend/src/app/app.module.ts
index d514d1f5..d90de54d 100644
--- a/frontend/src/app/app.module.ts
+++ b/frontend/src/app/app.module.ts
@@ -5,7 +5,7 @@ import { AppRoutingModule } from './app-routing.module';
import { HttpClientModule } from '@angular/common/http';
import { MatSliderModule } from '@angular/material/slider';
import { MatIconModule } from '@angular/material/icon';
-
+import { NgMultiSelectDropDownModule } from 'ng-multiselect-dropdown';
import { NgChartsModule } from 'ng2-charts';
import { Ng2SearchPipeModule } from 'ng2-search-filter';
import { AppComponent } from './app.component';
@@ -39,6 +39,7 @@ import { FilterDatasetsComponent } from './_pages/filter-datasets/filter-dataset
import { ReactiveBackgroundComponent } from './_elements/reactive-background/reactive-background.component';
import { ItemModelComponent } from './_elements/item-model/item-model.component';
import { AnnvisualComponent } from './_elements/annvisual/annvisual.component';
+
@NgModule({
declarations: [
AppComponent,
@@ -80,7 +81,7 @@ import { AnnvisualComponent } from './_elements/annvisual/annvisual.component';
MatSliderModule,
MatIconModule,
NgChartsModule,
- Ng2SearchPipeModule
+ Ng2SearchPipeModule,
],
providers: [],
bootstrap: [AppComponent]