master
parent 4d5a8b9796
commit 877575a375
  1. BIN
      __pycache__/run.cpython-37.pyc
  2. 1
      cachedir/joblib/run/create_global_function/72a755383fba437e4dead6ff3e3d81e3/metadata.json
  3. 1
      cachedir/joblib/run/create_global_function/72a755383fba437e4dead6ff3e3d81e3/output.pkl
  4. 11
      cachedir/joblib/run/create_global_function/func_code.py
  5. 1
      cachedir/joblib/run/executeModel/72a755383fba437e4dead6ff3e3d81e3/metadata.json
  6. BIN
      cachedir/joblib/run/executeModel/72a755383fba437e4dead6ff3e3d81e3/output.pkl
  7. 17
      cachedir/joblib/run/executeModel/func_code.py
  8. 2
      frontend/index.html
  9. 8
      frontend/src/components/About.vue
  10. 351
      frontend/src/components/AlgorithmHyperParam.vue
  11. 1113
      frontend/src/components/Algorithms.vue
  12. 309
      frontend/src/components/CrossoverMutationSpace.vue
  13. 86
      frontend/src/components/FeatureSpace1.vue
  14. 86
      frontend/src/components/FeatureSpace2.vue
  15. 86
      frontend/src/components/FeatureSpace3.vue
  16. 86
      frontend/src/components/FeatureSpace4.vue
  17. 312
      frontend/src/components/HyperParameterSpace.vue
  18. 415
      frontend/src/components/Main.vue
  19. 8
      frontend/src/components/NotFound.vue
  20. 846
      frontend/src/components/Parameters.vue
  21. 148
      frontend/src/components/PerformanceMetrics.vue
  22. 454
      frontend/src/components/Predictions.vue
  23. 408
      frontend/src/components/VotingResults.vue
  24. 946
      run.py

Binary file not shown.

@ -0,0 +1,11 @@
# first line: 447
@memory.cache
def create_global_function():
global estimator
def estimator(C, gamma):
# initialize model
model = SVC(C=C, gamma=gamma, degree=1, random_state=RANDOM_SEED)
# set in cross-validation
result = cross_validate(model, XData, yData, cv=crossValidation)
# result is mean of test_score
return np.mean(result['test_score'])

@ -0,0 +1 @@
{"duration": 4.569021940231323, "input_args": {}}

@ -0,0 +1,17 @@
# first line: 457
@memory.cache
def executeModel():
create_global_function()
global estimator
params = {"C": (0.0001, 10000), "gamma": (0.0001, 10000)}
svc_bayesopt = BayesianOptimization(estimator, params)
svc_bayesopt.maximize(init_points=5, n_iter=20, acq='ucb')
bestParams = svc_bayesopt.max['params']
estimator = SVC(C=bestParams.get('C'), gamma=bestParams.get('gamma'), probability=True)
estimator.fit(XData, yData)
yPredict = estimator.predict(XData)
yPredictProb = cross_val_predict(estimator, XData, yData, cv=crossValidation, method='predict_proba')
return 'Everything Okay'

@ -3,7 +3,7 @@
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>HyperSearVis</title>
<title>FeatureEnVi</title>
</head>
<body>
<div id="app"></div>

@ -1,8 +0,0 @@
<!-- About page for the application. -->
<template>
<div>
<img src="@/assets/isovis.jpg">
<p>HyperSearVis is a visual analytics tool created by Angelos Chatzimparmpas, member of the ISOVIS Group, Linnaeus University, Sweden.</p>
</div>
</template>

@ -1,351 +0,0 @@
<template>
<div id="PCP" class="parcoords" style="min-height: 285px;"></div>
</template>
<script>
import 'parcoord-es/dist/parcoords.css';
import ParCoords from 'parcoord-es';
import * as d3Base from 'd3'
// attach all d3 plugins to the d3 library
const d3 = Object.assign(d3Base)
import { EventBus } from '../main.js'
export default {
name: 'AlgorithmHyperParam',
data () {
return {
ModelsPerformance: 0,
selAlgorithm: 0,
keyAllOrClass: true,
listClassPerf: [],
pc: 0,
factors: [1,0,0
,1,0,0,1,0
,0,1,0,0,0
,0,0,1,0,0
,0,1,1,1
],
SVCModels: 576,
GausNBModels: 736,
MLPModels: 1236,
LRModels: 1356,
LDAModels: 1996,
QDAModels: 2196,
RFModels: 2446,
ExtraTModels: 2606,
AdaBModels: 2766,
GradBModels: 2926,
}
},
methods: {
reset () {
d3.selectAll("#PCP > *").remove();
},
PCPView () {
d3.selectAll("#PCP > *").remove();
if (this.selAlgorithm != '') {
var colors = ['#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a','#b15928']
var colorGiv = 0
var factorsLocal = this.factors
var divide = 0
factorsLocal.forEach(element => {
divide = element + divide
});
var McKNN = []
const performanceAlgKNN = JSON.parse(this.ModelsPerformance[6])
for (let j = 0; j < Object.values(performanceAlgKNN['mean_test_accuracy']).length; j++) {
let sumKNN
sumKNN = (factorsLocal[0] * Object.values(performanceAlgKNN['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgKNN['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgKNN['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgKNN['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgKNN['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgKNN['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgKNN['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgKNN['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgKNN['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgKNN['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgKNN['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgKNN['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgKNN['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgKNN['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgKNN['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgKNN['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgKNN['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgKNN['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgKNN['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgKNN['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgKNN['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgKNN['log_loss'])[j]))
McKNN.push((sumKNN/divide)*100)
}
var McSVC = []
const performanceAlgSVC = JSON.parse(this.ModelsPerformance[15])
for (let j = 0; j < Object.values(performanceAlgSVC['mean_test_accuracy']).length; j++) {
let sumSVC
sumSVC = (factorsLocal[0] * Object.values(performanceAlgSVC['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgSVC['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgSVC['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgSVC['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgSVC['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgSVC['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgSVC['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgSVC['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgSVC['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgSVC['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgSVC['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgSVC['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgSVC['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgSVC['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgSVC['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgSVC['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgSVC['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgSVC['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgSVC['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgSVC['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgSVC['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgSVC['log_loss'])[j]))
McSVC.push((sumSVC/divide)*100)
}
var McGausNB = []
const performanceAlgGausNB = JSON.parse(this.ModelsPerformance[24])
for (let j = 0; j < Object.values(performanceAlgGausNB['mean_test_accuracy']).length; j++) {
let sumGausNB
sumGausNB = (factorsLocal[0] * Object.values(performanceAlgGausNB['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgGausNB['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgGausNB['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgGausNB['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgGausNB['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgGausNB['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgGausNB['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgGausNB['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgGausNB['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgGausNB['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgGausNB['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgGausNB['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgGausNB['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgGausNB['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgGausNB['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgGausNB['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgGausNB['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgGausNB['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgGausNB['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgGausNB['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgGausNB['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgGausNB['log_loss'])[j]))
McGausNB.push((sumGausNB/divide)*100)
}
var McMLP = []
const performanceAlgMLP = JSON.parse(this.ModelsPerformance[33])
for (let j = 0; j < Object.values(performanceAlgMLP['mean_test_accuracy']).length; j++) {
let sumMLP
sumMLP = (factorsLocal[0] * Object.values(performanceAlgMLP['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgMLP['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgMLP['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgMLP['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgMLP['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgMLP['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgMLP['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgMLP['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgMLP['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgMLP['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgMLP['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgMLP['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgMLP['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgMLP['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgMLP['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgMLP['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgMLP['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgMLP['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgMLP['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgMLP['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgMLP['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgMLP['log_loss'])[j]))
McMLP.push((sumMLP/divide)*100)
}
var McLR = []
const performanceAlgLR = JSON.parse(this.ModelsPerformance[42])
for (let j = 0; j < Object.values(performanceAlgLR['mean_test_accuracy']).length; j++) {
let sumLR
sumLR = (factorsLocal[0] * Object.values(performanceAlgLR['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgLR['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgLR['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgLR['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgLR['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgLR['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgLR['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgLR['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgLR['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgLR['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgLR['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgLR['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgLR['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgLR['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgLR['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgLR['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgLR['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgLR['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgLR['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgLR['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgLR['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgLR['log_loss'])[j]))
McLR.push((sumLR/divide)*100)
}
var McLDA = []
const performanceAlgLDA = JSON.parse(this.ModelsPerformance[51])
for (let j = 0; j < Object.values(performanceAlgLDA['mean_test_accuracy']).length; j++) {
let sumLDA
sumLDA = (factorsLocal[0] * Object.values(performanceAlgLDA['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgLDA['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgLDA['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgLDA['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgLDA['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgLDA['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgLDA['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgLDA['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgLDA['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgLDA['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgLDA['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgLDA['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgLDA['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgLDA['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgLDA['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgLDA['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgLDA['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgLDA['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgLDA['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgLDA['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgLDA['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgLDA['log_loss'])[j]))
McLDA.push((sumLDA/divide)*100)
}
var McQDA = []
const performanceAlgQDA = JSON.parse(this.ModelsPerformance[60])
for (let j = 0; j < Object.values(performanceAlgQDA['mean_test_accuracy']).length; j++) {
let sumQDA
sumQDA = (factorsLocal[0] * Object.values(performanceAlgQDA['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgQDA['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgQDA['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgQDA['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgQDA['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgQDA['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgQDA['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgQDA['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgQDA['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgQDA['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgQDA['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgQDA['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgQDA['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgQDA['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgQDA['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgQDA['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgQDA['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgQDA['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgQDA['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgQDA['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgQDA['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgQDA['log_loss'])[j]))
McQDA.push((sumQDA/divide)*100)
}
var McRF = []
const performanceAlgRF = JSON.parse(this.ModelsPerformance[69])
for (let j = 0; j < Object.values(performanceAlgRF['mean_test_accuracy']).length; j++) {
let sumRF
sumRF = (factorsLocal[0] * Object.values(performanceAlgRF['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgRF['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgRF['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgRF['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgRF['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgRF['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgRF['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgRF['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgRF['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgRF['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgRF['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgRF['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgRF['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgRF['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgRF['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgRF['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgRF['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgRF['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgRF['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgRF['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgRF['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgRF['log_loss'])[j]))
McRF.push((sumRF/divide)*100)
}
var McExtraT = []
const performanceAlgExtraT = JSON.parse(this.ModelsPerformance[78])
for (let j = 0; j < Object.values(performanceAlgExtraT['mean_test_accuracy']).length; j++) {
let sumExtraT
sumExtraT = (factorsLocal[0] * Object.values(performanceAlgExtraT['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgExtraT['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgExtraT['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgExtraT['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgExtraT['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgExtraT['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgExtraT['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgExtraT['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgExtraT['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgExtraT['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgExtraT['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgExtraT['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgExtraT['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgExtraT['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgExtraT['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgExtraT['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgExtraT['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgExtraT['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgExtraT['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgExtraT['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgExtraT['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgExtraT['log_loss'])[j]))
McExtraT.push((sumExtraT/divide)*100)
}
var McAdaB = []
const performanceAlgAdaB = JSON.parse(this.ModelsPerformance[87])
for (let j = 0; j < Object.values(performanceAlgAdaB['mean_test_accuracy']).length; j++) {
let sumAdaB
sumAdaB = (factorsLocal[0] * Object.values(performanceAlgAdaB['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgAdaB['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgAdaB['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgAdaB['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgAdaB['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgAdaB['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgAdaB['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgAdaB['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgAdaB['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgAdaB['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgAdaB['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgAdaB['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgAdaB['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgAdaB['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgAdaB['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgAdaB['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgAdaB['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgAdaB['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgAdaB['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgAdaB['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgAdaB['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgAdaB['log_loss'])[j]))
McAdaB.push((sumAdaB/divide)*100)
}
var McGradB = []
const performanceAlgGradB = JSON.parse(this.ModelsPerformance[96])
for (let j = 0; j < Object.values(performanceAlgGradB['mean_test_accuracy']).length; j++) {
let sumGradB
sumGradB = (factorsLocal[0] * Object.values(performanceAlgGradB['mean_test_accuracy'])[j]) + (factorsLocal[1] * Object.values(performanceAlgGradB['geometric_mean_score_micro'])[j]) + (factorsLocal[2] * Object.values(performanceAlgGradB['geometric_mean_score_macro'])[j])
+ (factorsLocal[3] * Object.values(performanceAlgGradB['geometric_mean_score_weighted'])[j]) + (factorsLocal[4] * Object.values(performanceAlgGradB['mean_test_precision_micro'])[j]) + (factorsLocal[5] * Object.values(performanceAlgGradB['mean_test_precision_macro'])[j]) + (factorsLocal[6] * Object.values(performanceAlgGradB['mean_test_precision_weighted'])[j]) + (factorsLocal[7] * Object.values(performanceAlgGradB['mean_test_recall_micro'])[j])
+ (factorsLocal[8] * Object.values(performanceAlgGradB['mean_test_recall_macro'])[j]) + (factorsLocal[9] * Object.values(performanceAlgGradB['mean_test_recall_weighted'])[j]) + (factorsLocal[10] * Object.values(performanceAlgGradB['f5_micro'])[j]) + (factorsLocal[11] * Object.values(performanceAlgGradB['f5_macro'])[j]) + (factorsLocal[12] * Object.values(performanceAlgGradB['f5_weighted'])[j]) + (factorsLocal[13] * Object.values(performanceAlgGradB['f1_micro'])[j])
+ (factorsLocal[14] * Object.values(performanceAlgGradB['f1_macro'])[j]) + (factorsLocal[15] * Object.values(performanceAlgGradB['f1_weighted'])[j]) + (factorsLocal[16] * Object.values(performanceAlgGradB['f2_micro'])[j]) + (factorsLocal[17] * Object.values(performanceAlgGradB['f2_macro'])[j]) + (factorsLocal[18] * Object.values(performanceAlgGradB['f2_weighted'])[j]) + (factorsLocal[19] * Math.abs(Object.values(performanceAlgGradB['matthews_corrcoef'])[j]))
+ (factorsLocal[20] * Object.values(performanceAlgGradB['mean_test_roc_auc_ovo_weighted'])[j]) + (factorsLocal[21] * (1 - Object.values(performanceAlgGradB['log_loss'])[j]))
McGradB.push((sumGradB/divide)*100)
}
var Combined = 0
if (this.selAlgorithm == 'KNN') {
Combined = JSON.parse(this.ModelsPerformance[1])
colorGiv = colors[0]
} else if (this.selAlgorithm == 'SVC') {
Combined = JSON.parse(this.ModelsPerformance[10])
colorGiv = colors[1]
} else if (this.selAlgorithm == 'GauNB') {
Combined = JSON.parse(this.ModelsPerformance[19])
colorGiv = colors[2]
} else if (this.selAlgorithm == 'MLP') {
Combined = JSON.parse(this.ModelsPerformance[28])
colorGiv = colors[3]
} else if (this.selAlgorithm == 'LR') {
Combined = JSON.parse(this.ModelsPerformance[37])
colorGiv = colors[4]
} else if (this.selAlgorithm == 'LDA') {
Combined = JSON.parse(this.ModelsPerformance[46])
colorGiv = colors[5]
} else if (this.selAlgorithm == 'QDA') {
Combined = JSON.parse(this.ModelsPerformance[55])
colorGiv = colors[6]
} else if (this.selAlgorithm == 'RF') {
Combined = JSON.parse(this.ModelsPerformance[64])
colorGiv = colors[7]
} else if (this.selAlgorithm == 'ExtraT') {
Combined = JSON.parse(this.ModelsPerformance[73])
colorGiv = colors[8]
} else if (this.selAlgorithm == 'AdaB') {
Combined = JSON.parse(this.ModelsPerformance[82])
colorGiv = colors[9]
} else {
Combined = JSON.parse(this.ModelsPerformance[91])
colorGiv = colors[10]
}
var valuesPerf = Object.values(Combined['params'])
var ObjectsParams = Combined['params']
var newObjectsParamsΚΝΝ = []
var newObjectsParamsSVC = []
var newObjectsParamsGausNB = []
var newObjectsParamsMLP = []
var newObjectsParamsLR = []
var newObjectsParamsLDA = []
var newObjectsParamsQDA = []
var newObjectsParamsRF = []
var newObjectsParamsExtraT = []
var newObjectsParamsAdaB = []
var newObjectsParamsGradB = []
var ArrayCombined = []
var temp
for (var i = 0; i < valuesPerf.length; i++) {
if (this.keyAllOrClass) {
if (this.selAlgorithm === 'KNN') {
newObjectsParamsΚΝΝ.push({model: i,'# Perf (%) #': McKNN[i],'n_neighbors':ObjectsParams[i].n_neighbors,'metric':ObjectsParams[i].metric,'algorithm':ObjectsParams[i].algorithm,'weights':ObjectsParams[i].weights})
ArrayCombined[i] = newObjectsParamsΚΝΝ[i]
} else if (this.selAlgorithm === 'SVC') {
newObjectsParamsSVC.push({model: this.SVCModels + i,'# Perf (%) #': McSVC[i],'C':ObjectsParams[i].C,'kernel':ObjectsParams[i].kernel})
ArrayCombined[i] = newObjectsParamsSVC[i]
} else if (this.selAlgorithm === 'GauNB') {
newObjectsParamsGausNB.push({model: this.GausNBModels + i,'# Perf (%) #': McGausNB[i],'var_smoothing':ObjectsParams[i].var_smoothing})
ArrayCombined[i] = newObjectsParamsGausNB[i]
} else if (this.selAlgorithm === 'MLP') {
newObjectsParamsMLP.push({model: this.MLPModels + i,'# Perf (%) #': McMLP[i],'alpha':ObjectsParams[i].alpha,'tol':ObjectsParams[i].tol,'activation':ObjectsParams[i].activation,'max_iter':ObjectsParams[i].max_iter,'solver':ObjectsParams[i].solver})
ArrayCombined[i] = newObjectsParamsMLP[i]
} else if (this.selAlgorithm === 'LR') {
newObjectsParamsLR.push({model: this.LRModels + i,'# Perf (%) #': McLR[i],'C':ObjectsParams[i].C,'max_iter':ObjectsParams[i].max_iter,'solver':ObjectsParams[i].solver,'penalty':ObjectsParams[i].penalty})
ArrayCombined[i] = newObjectsParamsLR[i]
} else if (this.selAlgorithm === 'LDA') {
newObjectsParamsLDA.push({model: this.LDAModels + i,'# Perf (%) #': McLDA[i],'shrinkage':ObjectsParams[i].shrinkage,'solver':ObjectsParams[i].solver})
ArrayCombined[i] = newObjectsParamsLDA[i]
} else if (this.selAlgorithm === 'QDA') {
newObjectsParamsQDA.push({model: this.QDAModels + i,'# Perf (%) #': McQDA[i],'reg_param':ObjectsParams[i].reg_param,'tol':ObjectsParams[i].tol})
ArrayCombined[i] = newObjectsParamsQDA[i]
} else if (this.selAlgorithm === 'RF') {
newObjectsParamsRF.push({model: this.RFModels + i,'# Perf (%) #': McRF[i],'n_estimators':ObjectsParams[i].n_estimators,'criterion':ObjectsParams[i].criterion})
ArrayCombined[i] = newObjectsParamsRF[i]
} else if (this.selAlgorithm === 'ExtraT') {
newObjectsParamsExtraT.push({model: this.ExtraTModels + i,'# Perf (%) #': McExtraT[i],'n_estimators':ObjectsParams[i].n_estimators,'criterion':ObjectsParams[i].criterion})
ArrayCombined[i] = newObjectsParamsExtraT[i]
} else if (this.selAlgorithm === 'AdaB') {
newObjectsParamsAdaB.push({model: this.AdaBModels + i,'# Perf (%) #': McAdaB[i],'n_estimators':ObjectsParams[i].n_estimators,'learning_rate':ObjectsParams[i].learning_rate,'algorithm':ObjectsParams[i].algorithm})
ArrayCombined[i] = newObjectsParamsAdaB[i]
} else {
newObjectsParamsGradB.push({model: this.GradBModels + i,'# Perf (%) #': McGradB[i],'n_estimators':ObjectsParams[i].n_estimators,'criterion':ObjectsParams[i].criterion,'learning_rate':ObjectsParams[i].learning_rate})
ArrayCombined[i] = newObjectsParamsGradB[i]
}
} else {
if (this.selAlgorithm === 'KNN') {
newObjectsParamsΚΝΝ.push({model: i,'# Perf (%) #': this.listClassPerf[0][i],'n_neighbors':ObjectsParams[i].n_neighbors,'metric':ObjectsParams[i].metric,'algorithm':ObjectsParams[i].algorithm,'weights':ObjectsParams[i].weights})
ArrayCombined[i] = newObjectsParamsΚΝΝ[i]
} else if (this.selAlgorithm === 'SVC') {
newObjectsParamsSVC.push({model: this.SVCModels + i,'# Perf (%) #': this.listClassPerf[1][i],'C':ObjectsParams[i].C,'kernel':ObjectsParams[i].kernel})
ArrayCombined[i] = newObjectsParamsSVC[i]
} else if (this.selAlgorithm === 'GauNB') {
newObjectsParamsGausNB.push({model: this.GausNBModels + i,'# Perf (%) #': this.listClassPerf[2][i],'var_smoothing':ObjectsParams[i].var_smoothing})
ArrayCombined[i] = newObjectsParamsGausNB[i]
} else if (this.selAlgorithm === 'MLP') {
newObjectsParamsMLP.push({model: this.MLPModels + i,'# Perf (%) #': this.listClassPerf[3][i],'alpha':ObjectsParams[i].alpha,'tol':ObjectsParams[i].tol,'activation':ObjectsParams[i].activation,'max_iter':ObjectsParams[i].max_iter,'solver':ObjectsParams[i].solver})
ArrayCombined[i] = newObjectsParamsMLP[i]
} else if (this.selAlgorithm === 'LR') {
newObjectsParamsLR.push({model: this.LRModels + i,'# Perf (%) #': this.listClassPerf[4][i],'C':ObjectsParams[i].C,'max_iter':ObjectsParams[i].max_iter,'solver':ObjectsParams[i].solver,'penalty':ObjectsParams[i].penalty})
ArrayCombined[i] = newObjectsParamsLR[i]
} else if (this.selAlgorithm === 'LDA') {
newObjectsParamsLDA.push({model: this.LDAModels + i,'# Perf (%) #': this.listClassPerf[5][i],'shrinkage':ObjectsParams[i].shrinkage,'solver':ObjectsParams[i].solver})
ArrayCombined[i] = newObjectsParamsLDA[i]
} else if (this.selAlgorithm === 'QDA') {
newObjectsParamsQDA.push({model: this.QDAModels + i,'# Perf (%) #': this.listClassPerf[6][i],'reg_param':ObjectsParams[i].reg_param,'tol':ObjectsParams[i].tol})
ArrayCombined[i] = newObjectsParamsQDA[i]
} else if (this.selAlgorithm === 'RF') {
newObjectsParamsRF.push({model: this.RFModels + i,'# Perf (%) #': this.listClassPerf[7][i],'n_estimators':ObjectsParams[i].n_estimators,'criterion':ObjectsParams[i].criterion})
ArrayCombined[i] = newObjectsParamsRF[i]
} else if (this.selAlgorithm === 'ExtraT') {
newObjectsParamsExtraT.push({model: this.ExtraTModels + i,'# Perf (%) #': this.listClassPerf[8][i],'n_estimators':ObjectsParams[i].n_estimators,'criterion':ObjectsParams[i].criterion})
ArrayCombined[i] = newObjectsParamsExtraT[i]
} else if (this.selAlgorithm === 'AdaB') {
newObjectsParamsAdaB.push({model: this.AdaBModels + i,'# Perf (%) #': this.listClassPerf[9][i],'n_estimators':ObjectsParams[i].n_estimators,'learning_rate':ObjectsParams[i].learning_rate,'algorithm':ObjectsParams[i].algorithm})
ArrayCombined[i] = newObjectsParamsAdaB[i]
} else {
newObjectsParamsGradB.push({model: this.GradBModels + i,'# Perf (%) #': this.listClassPerf[10][i],'n_estimators':ObjectsParams[i].n_estimators,'criterion':ObjectsParams[i].criterion,'learning_rate':ObjectsParams[i].learning_rate})
ArrayCombined[i] = newObjectsParamsGradB[i]
}
}
}
EventBus.$emit('AllAlModels', ArrayCombined.length)
this.pc = ParCoords()("#PCP")
.data(ArrayCombined)
.color(colorGiv)
.hideAxis(['model'])
.bundlingStrength(0) // set bundling strength
.smoothness(0)
.showControlPoints(false)
.render()
.brushMode('1D-axes')
.reorderable()
.interactive();
this.pc.on("brushend", function(d) {
EventBus.$emit('AllSelModels', d.length)
EventBus.$emit('UpdateBoxPlot', d)
});
}
},
sliders () {
},
clear () {
d3.selectAll("#PCP > *").remove();
},
},
mounted() {
EventBus.$on('ReturningBrushedPointsModels', this.brushed)
EventBus.$on('emittedEventCallingModelSelect', data => { this.selAlgorithm = data })
EventBus.$on('emittedEventCallingModel', data => { this.ModelsPerformance = data })
EventBus.$on('emittedEventCallingModel', this.PCPView)
EventBus.$on('ResponsiveandChange', this.PCPView)
EventBus.$on('emittedEventCallingModelClear', this.clear)
EventBus.$on('CallFactorsView', data => { this.factors = data })
EventBus.$on('CallFactorsView', this.PCPView)
EventBus.$on('boxplotSet', data => { this.listClassPerf = data })
EventBus.$on('boxplotCall', data => { this.keyAllOrClass = data })
// reset view
EventBus.$on('resetViews', this.reset)
EventBus.$on('clearPCP', this.reset)
}
}
</script>

File diff suppressed because it is too large Load Diff

@ -1,309 +0,0 @@
<template>
<div>
<div align="center">
Projection method: <select id="selectBarChartCM" @change="selectVisualRepresentationCM()">
<option value="mdsCM" selected>MDS</option>
<option value="tsneCM">t-SNE</option>
<option value="umapCM">UMAP</option>
</select>
&nbsp;&nbsp;
Action: <button
id="Remove"
v-on:click="Remove">
<font-awesome-icon icon="dna" />
{{ CrossoverMutateText }}
</button>
</div>
<div id="OverviewPlotlyCM" class="OverviewPlotlyCM"></div>
</div>
</template>
<script>
import * as Plotly from 'plotly.js'
import * as d3Base from 'd3'
import { EventBus } from '../main.js'
// attach all d3 plugins to the d3 library
const d3 = Object.assign(d3Base)
export default {
name: 'CrossoverMutationSpace',
data () {
return {
CrossoverMutateText: 'Unselected points\' crossover & mutation',
WH: [],
ScatterPlotResults: '',
representationDef: 'mdsCM',
}
},
methods: {
reset () {
Plotly.purge('OverviewPlotlyCM')
},
selectVisualRepresentationCM () {
const representationSelectionDocum = document.getElementById('selectBarChartCM')
this.representationSelection = representationSelectionDocum.options[representationSelectionDocum.selectedIndex].value
EventBus.$emit('RepresentationSelectionCM', this.representationSelection)
},
clean(obj) {
var propNames = Object.getOwnPropertyNames(obj);
for (var i = 0; i < propNames.length; i++) {
var propName = propNames[i];
if (obj[propName] === null || obj[propName] === undefined) {
delete obj[propName];
}
}
},
ScatterPlotView () {
Plotly.purge('OverviewPlotlyCM')
var modelId = JSON.parse(this.ScatterPlotResults[0])
var colorsforScatterPlot = JSON.parse(this.ScatterPlotResults[1])
var parametersLoc = JSON.parse(this.ScatterPlotResults[2])
var parameters = JSON.parse(parametersLoc)
var MDSData= JSON.parse(this.ScatterPlotResults[9])
var TSNEData = JSON.parse(this.ScatterPlotResults[10])
var UMAPData = JSON.parse(this.ScatterPlotResults[11])
EventBus.$emit('sendPointsNumberCM', modelId.length)
var stringParameters = []
for (let i = 0; i < parameters.length; i++) {
this.clean(parameters[i])
stringParameters.push(JSON.stringify(parameters[i]).replace(/,/gi, '<br>'))
}
var classifiersInfoProcessing = []
for (let i = 0; i < modelId.length; i++) {
if (i < 100) {
classifiersInfoProcessing[i] = '<b>Model ID:</b> ' + modelId[i] + '<br><b>Algorithm:</b> k-nearest neighbor' + '<br><b>Parameters:</b> ' + stringParameters[i]
}
else {
classifiersInfoProcessing[i] = '<b>Model ID:</b> ' + modelId[i] + '<br><b>Algorithm:</b> logistic regression' + '<br><b>Parameters:</b> ' + stringParameters[i]
}
}
var DataGeneral, maxX, minX, maxY, minY, layout
var width = this.WH[0]*8 // interactive visualization
var height = this.WH[1]*4 // interactive visualization
if (this.representationDef == 'mdsCM') {
maxX = Math.max(MDSData[0])
minX = Math.min(MDSData[0])
maxY = Math.max(MDSData[1])
minY = Math.max(MDSData[1])
DataGeneral = [{
type: 'scatter',
mode: 'markers',
x: MDSData[0],
y: MDSData[1],
hovertemplate:
"%{text}<br><br>" +
"<extra></extra>",
text: classifiersInfoProcessing,
marker: {
line: { color: 'rgb(0, 0, 0)', width: 3 },
color: colorsforScatterPlot,
size: 12,
colorscale: 'Viridis',
colorbar: {
title: '# Performance (%) #',
titleside:'right',
},
}
}]
layout = {
xaxis: {
visible: false,
range: [minX, maxX]
},
yaxis: {
visible: false,
range: [minY, maxY]
},
font: { family: 'Helvetica', size: 16, color: '#000000' },
autosize: true,
width: width,
height: height,
dragmode: 'lasso',
hovermode: "closest",
hoverlabel: { bgcolor: "#FFF" },
legend: {orientation: 'h', y: -0.3},
margin: {
l: 50,
r: 0,
b: 30,
t: 40,
pad: 0
},
}
} else if (this.representationDef == 'tsneCM') {
var result = TSNEData.reduce(function(r, a) {
a.forEach(function(s, i) {
var key = i === 0 ? 'Xax' : 'Yax';
r[key] || (r[key] = []); // if key not found on result object, add the key with empty array as the value
r[key].push(s);
})
return r;
}, {})
maxX = Math.max(result.Xax)
minX = Math.min(result.Xax)
maxY = Math.max(result.Yax)
minY = Math.max(result.Yax)
DataGeneral = [{
type: 'scatter',
mode: 'markers',
x: result.Xax,
y: result.Yax,
hovertemplate:
"%{text}<br><br>" +
"<extra></extra>",
text: classifiersInfoProcessing,
marker: {
line: { color: 'rgb(0, 0, 0)', width: 3 },
color: colorsforScatterPlot,
size: 12,
colorscale: 'Viridis',
colorbar: {
title: '# Performance (%) #',
titleside: 'right'
},
}
}]
layout = {
xaxis: {
visible: false,
range: [minX, maxX]
},
yaxis: {
visible: false,
range: [minY, maxY]
},
autosize: true,
width: width,
height: height,
dragmode: 'lasso',
hovermode: "closest",
hoverlabel: { bgcolor: "#FFF" },
legend: {orientation: 'h', y: -0.3},
margin: {
l: 50,
r: 0,
b: 30,
t: 40,
pad: 0
},
}
} else {
maxX = Math.max(UMAPData[0])
minX = Math.min(UMAPData[0])
maxY = Math.max(UMAPData[1])
minY = Math.max(UMAPData[1])
DataGeneral = [{
type: 'scatter',
mode: 'markers',
x: UMAPData[0],
y: UMAPData[1],
hovertemplate:
"%{text}<br><br>" +
"<extra></extra>",
text: classifiersInfoProcessing,
marker: {
line: { color: 'rgb(0, 0, 0)', width: 3 },
color: colorsforScatterPlot,
size: 12,
colorscale: 'Viridis',
colorbar: {
title: '# Performance (%) #',
titleside: 'right'
},
}
}]
layout = {
xaxis: {
visible: false,
range: [minX, maxX]
},
yaxis: {
visible: false,
range: [minY, maxY]
},
autosize: true,
width: width,
height: height,
dragmode: 'lasso',
hovermode: "closest",
hoverlabel: { bgcolor: "#FFF" },
legend: {orientation: 'h', y: -0.3},
margin: {
l: 50,
r: 0,
b: 30,
t: 40,
pad: 0
},
}
}
var config = {scrollZoom: true, displaylogo: false, showLink: false, showSendToCloud: false, modeBarButtonsToRemove: ['toImage', 'toggleSpikelines', 'autoScale2d', 'hoverClosestGl2d','hoverCompareCartesian','select2d','hoverClosestCartesian','zoomIn2d','zoomOut2d','zoom2d'], responsive: true}
var scat = document.getElementById('OverviewPlotlyCM')
Plotly.newPlot(scat, DataGeneral, layout, config)
this.selectedPointsOverview()
},
selectedPointsOverview () {
const OverviewPlotly = document.getElementById('OverviewPlotlyCM')
var allModels = JSON.parse(this.ScatterPlotResults[0])
OverviewPlotly.on('plotly_selected', function (evt) {
if (typeof evt !== 'undefined') {
var pushModelsRemainingTemp = []
const ClassifierIDsList = []
for (let i = 0; evt.points.length; i++) {
if (evt.points[i] === undefined) {
break
} else {
const OnlyId = evt.points[i].text.split(' ')[2]
const OnlyIdCleared = OnlyId.split('<br>')
ClassifierIDsList.push(OnlyIdCleared[0])
}
}
for (let i = 0; i < allModels.length; i++) {
if (ClassifierIDsList.indexOf((allModels[i])) < 0) {
pushModelsRemainingTemp.push(allModels[i])
}
}
EventBus.$emit('RemainingPointsCM', pushModelsRemainingTemp)
EventBus.$emit('SendSelectedPointsUpdateIndicatorCM', ClassifierIDsList)
EventBus.$emit('SendSelectedPointsToServerEventCM', ClassifierIDsList)
}
})
},
},
mounted() {
EventBus.$on('emittedEventCallingCrossoverMutation', data => {
this.ScatterPlotResults = data})
EventBus.$on('emittedEventCallingCrossoverMutation', this.ScatterPlotView)
EventBus.$on('RepresentationSelectionCM', data => {this.representationDef = data})
EventBus.$on('RepresentationSelectionCM', this.ScatterPlotView)
// reset view
EventBus.$on('resetViews', this.reset)
}
}
</script>

@ -0,0 +1,86 @@
<template>
<div>
<label id="data" for="param-dataset" data-toggle="tooltip" data-placement="right" title="Tip: use one of the data sets already provided or upload a new file.">{{ dataset }}</label>
<select id="selectFile" @change="selectDataSet()">
<option value="HeartC.csv" selected>Heart Disease</option>
<option value="IrisC.csv">Iris</option>
<option value="local">Upload New File</option>
</select>
<button class="btn-outline-success"
id="initializeID"
v-on:click="initialize">
<font-awesome-icon icon="search" />
{{ searchText }}
</button>
<button class="btn-outline-danger"
id="resetID"
v-on:click="reset">
<font-awesome-icon icon="trash" />
{{ resetText }}
</button>
</div>
</template>
<script>
import Papa from 'papaparse'
import { EventBus } from '../main.js'
import {$,jQuery} from 'jquery';
import * as d3Base from 'd3'
// attach all d3 plugins to the d3 library
const d3 = Object.assign(d3Base)
export default {
name: 'FeatureSpace1',
data () {
return {
defaultDataSet: 'HeartC', // default value for the first data set
searchText: 'Hyper-parameter search',
resetText: 'Reset',
dataset: 'Data set'
}
},
methods: {
selectDataSet () {
const fileName = document.getElementById('selectFile')
this.defaultDataSet = fileName.options[fileName.selectedIndex].value
this.defaultDataSet = this.defaultDataSet.split('.')[0]
if (this.defaultDataSet == "DiabetesC" || this.defaultDataSet == "HeartC" || this.defaultDataSet == "IrisC" || this.defaultDataSet == "StanceC") { // This is a function that handles a new file, which users can upload.
this.dataset = "Data set"
d3.select("#data").select("input").remove(); // Remove the selection field.
EventBus.$emit('SendToServerDataSetConfirmation', this.defaultDataSet)
} else {
EventBus.$emit('SendToServerDataSetConfirmation', this.defaultDataSet)
d3.select("#data").select("input").remove();
this.dataset = ""
var data
d3.select("#data")
.append("input")
.attr("type", "file")
.style("font-size", "18.5px")
.style("width", "200px")
.on("change", function() {
var file = d3.event.target.files[0];
Papa.parse(file, {
header: true,
dynamicTyping: true,
skipEmptyLines: true,
complete: function(results) {
data = results.data;
EventBus.$emit('SendToServerLocalFile', data)
}
});
})
}
},
reset () {
EventBus.$emit('reset')
EventBus.$emit('alternateFlagLock')
},
initialize () {
EventBus.$emit('ConfirmDataSet')
}
}
}
</script>

@ -0,0 +1,86 @@
<template>
<div>
<label id="data" for="param-dataset" data-toggle="tooltip" data-placement="right" title="Tip: use one of the data sets already provided or upload a new file.">{{ dataset }}</label>
<select id="selectFile" @change="selectDataSet()">
<option value="HeartC.csv" selected>Heart Disease</option>
<option value="IrisC.csv">Iris</option>
<option value="local">Upload New File</option>
</select>
<button class="btn-outline-success"
id="initializeID"
v-on:click="initialize">
<font-awesome-icon icon="search" />
{{ searchText }}
</button>
<button class="btn-outline-danger"
id="resetID"
v-on:click="reset">
<font-awesome-icon icon="trash" />
{{ resetText }}
</button>
</div>
</template>
<script>
import Papa from 'papaparse'
import { EventBus } from '../main.js'
import {$,jQuery} from 'jquery';
import * as d3Base from 'd3'
// attach all d3 plugins to the d3 library
const d3 = Object.assign(d3Base)
export default {
name: 'FeatureSpace2',
data () {
return {
defaultDataSet: 'HeartC', // default value for the first data set
searchText: 'Hyper-parameter search',
resetText: 'Reset',
dataset: 'Data set'
}
},
methods: {
selectDataSet () {
const fileName = document.getElementById('selectFile')
this.defaultDataSet = fileName.options[fileName.selectedIndex].value
this.defaultDataSet = this.defaultDataSet.split('.')[0]
if (this.defaultDataSet == "DiabetesC" || this.defaultDataSet == "HeartC" || this.defaultDataSet == "IrisC" || this.defaultDataSet == "StanceC") { // This is a function that handles a new file, which users can upload.
this.dataset = "Data set"
d3.select("#data").select("input").remove(); // Remove the selection field.
EventBus.$emit('SendToServerDataSetConfirmation', this.defaultDataSet)
} else {
EventBus.$emit('SendToServerDataSetConfirmation', this.defaultDataSet)
d3.select("#data").select("input").remove();
this.dataset = ""
var data
d3.select("#data")
.append("input")
.attr("type", "file")
.style("font-size", "18.5px")
.style("width", "200px")
.on("change", function() {
var file = d3.event.target.files[0];
Papa.parse(file, {
header: true,
dynamicTyping: true,
skipEmptyLines: true,
complete: function(results) {
data = results.data;
EventBus.$emit('SendToServerLocalFile', data)
}
});
})
}
},
reset () {
EventBus.$emit('reset')
EventBus.$emit('alternateFlagLock')
},
initialize () {
EventBus.$emit('ConfirmDataSet')
}
}
}
</script>

@ -0,0 +1,86 @@
<template>
<div>
<label id="data" for="param-dataset" data-toggle="tooltip" data-placement="right" title="Tip: use one of the data sets already provided or upload a new file.">{{ dataset }}</label>
<select id="selectFile" @change="selectDataSet()">
<option value="HeartC.csv" selected>Heart Disease</option>
<option value="IrisC.csv">Iris</option>
<option value="local">Upload New File</option>
</select>
<button class="btn-outline-success"
id="initializeID"
v-on:click="initialize">
<font-awesome-icon icon="search" />
{{ searchText }}
</button>
<button class="btn-outline-danger"
id="resetID"
v-on:click="reset">
<font-awesome-icon icon="trash" />
{{ resetText }}
</button>
</div>
</template>
<script>
import Papa from 'papaparse'
import { EventBus } from '../main.js'
import {$,jQuery} from 'jquery';
import * as d3Base from 'd3'
// attach all d3 plugins to the d3 library
const d3 = Object.assign(d3Base)
export default {
name: 'FeatureSpace3',
data () {
return {
defaultDataSet: 'HeartC', // default value for the first data set
searchText: 'Hyper-parameter search',
resetText: 'Reset',
dataset: 'Data set'
}
},
methods: {
selectDataSet () {
const fileName = document.getElementById('selectFile')
this.defaultDataSet = fileName.options[fileName.selectedIndex].value
this.defaultDataSet = this.defaultDataSet.split('.')[0]
if (this.defaultDataSet == "DiabetesC" || this.defaultDataSet == "HeartC" || this.defaultDataSet == "IrisC" || this.defaultDataSet == "StanceC") { // This is a function that handles a new file, which users can upload.
this.dataset = "Data set"
d3.select("#data").select("input").remove(); // Remove the selection field.
EventBus.$emit('SendToServerDataSetConfirmation', this.defaultDataSet)
} else {
EventBus.$emit('SendToServerDataSetConfirmation', this.defaultDataSet)
d3.select("#data").select("input").remove();
this.dataset = ""
var data
d3.select("#data")
.append("input")
.attr("type", "file")
.style("font-size", "18.5px")
.style("width", "200px")
.on("change", function() {
var file = d3.event.target.files[0];
Papa.parse(file, {
header: true,
dynamicTyping: true,
skipEmptyLines: true,
complete: function(results) {
data = results.data;
EventBus.$emit('SendToServerLocalFile', data)
}
});
})
}
},
reset () {
EventBus.$emit('reset')
EventBus.$emit('alternateFlagLock')
},
initialize () {
EventBus.$emit('ConfirmDataSet')
}
}
}
</script>

@ -0,0 +1,86 @@
<template>
<div>
<label id="data" for="param-dataset" data-toggle="tooltip" data-placement="right" title="Tip: use one of the data sets already provided or upload a new file.">{{ dataset }}</label>
<select id="selectFile" @change="selectDataSet()">
<option value="HeartC.csv" selected>Heart Disease</option>
<option value="IrisC.csv">Iris</option>
<option value="local">Upload New File</option>
</select>
<button class="btn-outline-success"
id="initializeID"
v-on:click="initialize">
<font-awesome-icon icon="search" />
{{ searchText }}
</button>
<button class="btn-outline-danger"
id="resetID"
v-on:click="reset">
<font-awesome-icon icon="trash" />
{{ resetText }}
</button>
</div>
</template>
<script>
import Papa from 'papaparse'
import { EventBus } from '../main.js'
import {$,jQuery} from 'jquery';
import * as d3Base from 'd3'
// attach all d3 plugins to the d3 library
const d3 = Object.assign(d3Base)
export default {
name: 'FeatureSpace4',
data () {
return {
defaultDataSet: 'HeartC', // default value for the first data set
searchText: 'Hyper-parameter search',
resetText: 'Reset',
dataset: 'Data set'
}
},
methods: {
selectDataSet () {
const fileName = document.getElementById('selectFile')
this.defaultDataSet = fileName.options[fileName.selectedIndex].value
this.defaultDataSet = this.defaultDataSet.split('.')[0]
if (this.defaultDataSet == "DiabetesC" || this.defaultDataSet == "HeartC" || this.defaultDataSet == "IrisC" || this.defaultDataSet == "StanceC") { // This is a function that handles a new file, which users can upload.
this.dataset = "Data set"
d3.select("#data").select("input").remove(); // Remove the selection field.
EventBus.$emit('SendToServerDataSetConfirmation', this.defaultDataSet)
} else {
EventBus.$emit('SendToServerDataSetConfirmation', this.defaultDataSet)
d3.select("#data").select("input").remove();
this.dataset = ""
var data
d3.select("#data")
.append("input")
.attr("type", "file")
.style("font-size", "18.5px")
.style("width", "200px")
.on("change", function() {
var file = d3.event.target.files[0];
Papa.parse(file, {
header: true,
dynamicTyping: true,
skipEmptyLines: true,
complete: function(results) {
data = results.data;
EventBus.$emit('SendToServerLocalFile', data)
}
});
})
}
},
reset () {
EventBus.$emit('reset')
EventBus.$emit('alternateFlagLock')
},
initialize () {
EventBus.$emit('ConfirmDataSet')
}
}
}
</script>

@ -1,312 +0,0 @@
<template>
<div>
<div align="center">
Projection method: <select id="selectBarChart" @change="selectVisualRepresentation()">
<option value="mds" selected>MDS</option>
<option value="tsne">t-SNE</option>
<option value="umap">UMAP</option>
</select>
&nbsp;&nbsp;
Action: <button
id="Remove"
v-on:click="Remove">
<font-awesome-icon icon="dna" />
{{ CrossoverMutateText }}
</button>
</div>
<div id="OverviewPlotly" class="OverviewPlotly"></div>
</div>
</template>
<script>
import * as Plotly from 'plotly.js'
import * as d3Base from 'd3'
import { EventBus } from '../main.js'
// attach all d3 plugins to the d3 library
const d3 = Object.assign(d3Base)
export default {
name: 'HyperParameterSpace',
data () {
return {
CrossoverMutateText: 'Unselected points\' crossover & mutation',
WH: [],
ScatterPlotResults: '',
representationDef: 'mds',
}
},
methods: {
reset () {
Plotly.purge('OverviewPlotly')
},
clean(obj) {
var propNames = Object.getOwnPropertyNames(obj);
for (var i = 0; i < propNames.length; i++) {
var propName = propNames[i];
if (obj[propName] === null || obj[propName] === undefined) {
delete obj[propName];
}
}
},
selectVisualRepresentation () {
const representationSelectionDocum = document.getElementById('selectBarChart')
this.representationSelection = representationSelectionDocum.options[representationSelectionDocum.selectedIndex].value
EventBus.$emit('RepresentationSelection', this.representationSelection)
},
ScatterPlotView () {
Plotly.purge('OverviewPlotly')
var modelId = JSON.parse(this.ScatterPlotResults[0])
var colorsforScatterPlot = JSON.parse(this.ScatterPlotResults[1])
var parametersLoc = JSON.parse(this.ScatterPlotResults[2])
var parameters = JSON.parse(parametersLoc)
var MDSData= JSON.parse(this.ScatterPlotResults[9])
var TSNEData = JSON.parse(this.ScatterPlotResults[10])
var UMAPData = JSON.parse(this.ScatterPlotResults[11])
EventBus.$emit('sendPointsNumber', modelId.length)
var stringParameters = []
for (let i = 0; i < parameters.length; i++) {
this.clean(parameters[i])
stringParameters.push(JSON.stringify(parameters[i]).replace(/,/gi, '<br>'))
}
var classifiersInfoProcessing = []
for (let i = 0; i < modelId.length; i++) {
if (i < 100) {
classifiersInfoProcessing[i] = '<b>Model ID:</b> ' + modelId[i] + '<br><b>Algorithm:</b> k-nearest neighbor' + '<br><b>Parameters:</b> ' + stringParameters[i]
}
else {
classifiersInfoProcessing[i] = '<b>Model ID:</b> ' + modelId[i] + '<br><b>Algorithm:</b> logistic regression' + '<br><b>Parameters:</b> ' + stringParameters[i]
}
}
var DataGeneral, maxX, minX, maxY, minY, layout
var width = this.WH[0]*8 // interactive visualization
var height = this.WH[1]*4 // interactive visualization
if (this.representationDef == 'mds') {
maxX = Math.max(MDSData[0])
minX = Math.min(MDSData[0])
maxY = Math.max(MDSData[1])
minY = Math.max(MDSData[1])
DataGeneral = [{
type: 'scatter',
mode: 'markers',
x: MDSData[0],
y: MDSData[1],
hovertemplate:
"%{text}<br><br>" +
"<extra></extra>",
text: classifiersInfoProcessing,
marker: {
line: { color: 'rgb(0, 0, 0)', width: 3 },
color: colorsforScatterPlot,
size: 12,
colorscale: 'Viridis',
colorbar: {
title: '# Performance (%) #',
titleside:'right',
},
}
}]
layout = {
xaxis: {
visible: false,
range: [minX, maxX]
},
yaxis: {
visible: false,
range: [minY, maxY]
},
font: { family: 'Helvetica', size: 16, color: '#000000' },
autosize: true,
width: width,
height: height,
dragmode: 'lasso',
hovermode: "closest",
hoverlabel: { bgcolor: "#FFF" },
legend: {orientation: 'h', y: -0.3},
margin: {
l: 50,
r: 0,
b: 30,
t: 40,
pad: 0
},
}
} else if (this.representationDef == 'tsne') {
var result = TSNEData.reduce(function(r, a) {
a.forEach(function(s, i) {
var key = i === 0 ? 'Xax' : 'Yax';
r[key] || (r[key] = []); // if key not found on result object, add the key with empty array as the value
r[key].push(s);
})
return r;
}, {})
maxX = Math.max(result.Xax)
minX = Math.min(result.Xax)
maxY = Math.max(result.Yax)
minY = Math.max(result.Yax)
DataGeneral = [{
type: 'scatter',
mode: 'markers',
x: result.Xax,
y: result.Yax,
hovertemplate:
"%{text}<br><br>" +
"<extra></extra>",
text: classifiersInfoProcessing,
marker: {
line: { color: 'rgb(0, 0, 0)', width: 3 },
color: colorsforScatterPlot,
size: 12,
colorscale: 'Viridis',
colorbar: {
title: '# Performance (%) #',
titleside: 'right'
},
}
}]
layout = {
xaxis: {
visible: false,
range: [minX, maxX]
},
yaxis: {
visible: false,
range: [minY, maxY]
},
autosize: true,
width: width,
height: height,
dragmode: 'lasso',
hovermode: "closest",
hoverlabel: { bgcolor: "#FFF" },
legend: {orientation: 'h', y: -0.3},
margin: {
l: 50,
r: 0,
b: 30,
t: 40,
pad: 0
},
}
} else {
maxX = Math.max(UMAPData[0])
minX = Math.min(UMAPData[0])
maxY = Math.max(UMAPData[1])
minY = Math.max(UMAPData[1])
DataGeneral = [{
type: 'scatter',
mode: 'markers',
x: UMAPData[0],
y: UMAPData[1],
hovertemplate:
"%{text}<br><br>" +
"<extra></extra>",
text: classifiersInfoProcessing,
marker: {
line: { color: 'rgb(0, 0, 0)', width: 3 },
color: colorsforScatterPlot,
size: 12,
colorscale: 'Viridis',
colorbar: {
title: '# Performance (%) #',
titleside: 'right'
},
}
}]
layout = {
xaxis: {
visible: false,
range: [minX, maxX]
},
yaxis: {
visible: false,
range: [minY, maxY]
},
autosize: true,
width: width,
height: height,
dragmode: 'lasso',
hovermode: "closest",
hoverlabel: { bgcolor: "#FFF" },
legend: {orientation: 'h', y: -0.3},
margin: {
l: 50,
r: 0,
b: 30,
t: 40,
pad: 0
},
}
}
var config = {scrollZoom: true, displaylogo: false, showLink: false, showSendToCloud: false, modeBarButtonsToRemove: ['toImage', 'toggleSpikelines', 'autoScale2d', 'hoverClosestGl2d','hoverCompareCartesian','select2d','hoverClosestCartesian','zoomIn2d','zoomOut2d','zoom2d'], responsive: true}
var scat = document.getElementById('OverviewPlotly')
Plotly.newPlot(scat, DataGeneral, layout, config)
this.selectedPointsOverview()
},
selectedPointsOverview () {
const OverviewPlotly = document.getElementById('OverviewPlotly')
var allModels = JSON.parse(this.ScatterPlotResults[0])
OverviewPlotly.on('plotly_selected', function (evt) {
if (typeof evt !== 'undefined') {
var pushModelsRemainingTemp = []
const ClassifierIDsList = []
for (let i = 0; evt.points.length; i++) {
if (evt.points[i] === undefined) {
break
} else {
const OnlyId = evt.points[i].text.split(' ')[2]
const OnlyIdCleared = OnlyId.split('<br>')
ClassifierIDsList.push(OnlyIdCleared[0])
}
}
for (let i = 0; i < allModels.length; i++) {
if (ClassifierIDsList.indexOf((allModels[i])) < 0) {
pushModelsRemainingTemp.push(allModels[i])
}
}
EventBus.$emit('RemainingPoints', pushModelsRemainingTemp)
EventBus.$emit('SendSelectedPointsUpdateIndicator', ClassifierIDsList)
EventBus.$emit('SendSelectedPointsToServerEvent', ClassifierIDsList)
}
})
},
Remove () {
EventBus.$emit('InitializeCrossoverMutation')
}
},
mounted() {
EventBus.$on('emittedEventCallingScatterPlot', data => {
this.ScatterPlotResults = data})
EventBus.$on('emittedEventCallingScatterPlot', this.ScatterPlotView)
EventBus.$on('RepresentationSelection', data => {this.representationDef = data})
EventBus.$on('RepresentationSelection', this.ScatterPlotView)
// reset view
EventBus.$on('resetViews', this.reset)
}
}
</script>

@ -6,10 +6,9 @@
<b-row class="md-3">
<b-col cols="3" >
<mdb-card>
<mdb-card-header color="primary-color" tag="h5" class="text-center">Data Sets and Performance Metrics Manager</mdb-card-header>
<mdb-card-header color="primary-color" tag="h5" class="text-center">Data Sets Manager</mdb-card-header>
<mdb-card-body>
<mdb-card-text class="text-left" style="font-size: 18.5px;">
<PerformanceMetrics/>
<DataSetExecController/>
</mdb-card-text>
</mdb-card-body>
@ -19,16 +18,16 @@
<mdb-card>
<mdb-card-header color="primary-color" tag="h5" class="text-center">Provenance</mdb-card-header>
<mdb-card-body>
<mdb-card-text class="text-left" style="font-size: 18.5px; min-height: 230px">
<mdb-card-text class="text-left" style="font-size: 18.5px;">
</mdb-card-text>
</mdb-card-body>
</mdb-card>
</b-col>
<b-col cols="3">
<mdb-card >
<mdb-card-header color="primary-color" tag="h5" class="text-center">Majority Voting Results</mdb-card-header>
<mdb-card-header color="primary-color" tag="h5" class="text-center">Results</mdb-card-header>
<mdb-card-body>
<mdb-card-text class="text-left" style="font-size: 18.5px; min-height: 230px">
<mdb-card-text class="text-left" style="font-size: 18.5px;">
</mdb-card-text>
</mdb-card-body>
</mdb-card>
@ -118,44 +117,51 @@
<b-row class="md-3">
<b-col cols="6">
<mdb-card style="margin-top: 15px;">
<mdb-card-header color="primary-color" tag="h5" class="text-center">Hyper-parameters' Space
[Sel: {{OverSelLength}} / All: {{OverAllLength}}]<small class="float-right"><active-scatter/></small>
<mdb-card-header color="primary-color" tag="h5" class="text-center">I. Feature Space - Highly Correct Prediction Probability
</mdb-card-header>
<mdb-card-body>
<mdb-card-text class="text-center" style="min-height: 600px">
<HyperParameterSpace/>
<mdb-card-text class="text-center" style="min-height: 400px">
<FeatureSpace1/>
</mdb-card-text>
</mdb-card-body>
</mdb-card>
</b-col>
<b-col cols="6">
<mdb-card style="margin-top: 15px;">
<mdb-card-header color="primary-color" tag="h5" class="text-center">Crossover and Mutation
[Sel: {{OverSelLengthCM}} / All: {{OverAllLengthCM}}]<small class="float-right"><active-scatter/></small>
<mdb-card-header color="primary-color" tag="h5" class="text-center">II. Feature Space - Slightly Correct Prediction Probability
</mdb-card-header>
<mdb-card-body>
<mdb-card-text class="text-center" style="min-height: 600px">
<CrossoverMutationSpace/>
<mdb-card-text class="text-center" style="min-height: 400px">
<FeatureSpace2/>
</mdb-card-text>
</mdb-card-body>
</mdb-card>
</b-col>
</b-row>
<b-row class="md-3">
<b-col cols="12">
<b-col cols="6">
<mdb-card style="margin-top: 15px;">
<mdb-card-header color="primary-color" tag="h5" class="text-center">Predictions' Space
<mdb-card-header color="primary-color" tag="h5" class="text-center">III. Feature Space - Slightly Wrong Prediction Probability
</mdb-card-header>
<mdb-card-body>
<mdb-card-text class="text-center" style="min-height: 270px">
<Predictions/>
<mdb-card-text class="text-center" style="min-height: 400px">
<FeatureSpace3/>
</mdb-card-text>
</mdb-card-body>
</mdb-card>
</b-col>
<b-col cols="6">
<mdb-card style="margin-top: 15px;">
<mdb-card-header color="primary-color" tag="h5" class="text-center">IV. Feature Space - Highly Wrong Prediction Probability
</mdb-card-header>
<mdb-card-body>
<mdb-card-text class="text-center" style="min-height: 400px">
<FeatureSpace4/>
</mdb-card-text>
</mdb-card-body>
</mdb-card>
</b-col>
</b-row>
</div>
</div>
</b-container>
</body>
</template>
@ -164,14 +170,10 @@
import Vue from 'vue'
import DataSetExecController from './DataSetExecController.vue'
import PerformanceMetrics from './PerformanceMetrics.vue'
import Algorithms from './Algorithms.vue'
import AlgorithmHyperParam from './AlgorithmHyperParam.vue'
import HyperParameterSpace from './HyperParameterSpace.vue'
import CrossoverMutationSpace from './CrossoverMutationSpace.vue'
import VotingResults from './VotingResults.vue'
import Parameters from './Parameters.vue'
import Predictions from './Predictions.vue'
import FeatureSpace1 from './FeatureSpace1.vue'
import FeatureSpace2 from './FeatureSpace2.vue'
import FeatureSpace3 from './FeatureSpace3.vue'
import FeatureSpace4 from './FeatureSpace4.vue'
import axios from 'axios'
import { loadProgressBar } from 'axios-progress-bar'
import 'axios-progress-bar/dist/nprogress.css'
@ -190,14 +192,10 @@ export default Vue.extend({
name: 'Main',
components: {
DataSetExecController,
PerformanceMetrics,
Algorithms,
AlgorithmHyperParam,
HyperParameterSpace,
CrossoverMutationSpace,
Parameters,
Predictions,
VotingResults,
FeatureSpace1,
FeatureSpace2,
FeatureSpace3,
FeatureSpace4,
mdbCard,
mdbCardBody,
mdbCardHeader,
@ -217,20 +215,17 @@ export default Vue.extend({
ClassifierIDsListCM: [],
SelectedFeaturesPerClassifier: '',
FinalResults: 0,
Algorithms: ['KNN','LR'],
selectedAlgorithm: '',
PerformancePerModel: '',
PerformanceCheck: '',
firstTimeFlag: 1,
selectedModels_Stack: [],
selectedAlgorithms: ['KNN','LR'],
parametersofModels: [],
reset: false,
brushedBoxPlotUpdate: 0,
width: 0,
height: 0,
combineWH: [],
basicValuesFact: [1,1,1,1,0,0,0,0],
sumPerClassifier: [],
valueSel: 0,
valueAll: 0,
@ -289,7 +284,6 @@ export default Vue.extend({
},
getDatafromtheBackEnd () {
const path = `http://localhost:5000/data/PlotClassifiers`
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
@ -355,214 +349,6 @@ export default Vue.extend({
console.log(error)
})
},
SelectedPoints () {
this.OverSelLength = this.ClassifierIDsList.length
this.SendSelectedIDs()
},
SendSelectedIDs () {
const path = `http://127.0.0.1:5000/data/SendtoSeverSelIDs`
const postData = {
predictSelectionIDs: this.ClassifierIDsList
}
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.post(path, postData, axiosConfig)
.then(response => {
console.log('Sent the selected IDs to compute predictions!')
this.retrievePredictionsSel()
})
.catch(error => {
console.log(error)
})
},
retrievePredictionsSel () {
const path = `http://localhost:5000/data/RetrievePredictions`
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.get(path, axiosConfig)
.then(response => {
this.PredictSel = response.data.PredictSel
console.log('Server successfully sent the predictions!')
EventBus.$emit('SendSelectedPointsToServerEvent', this.PredictSel)
})
.catch(error => {
console.log(error)
})
},
SelectedPointsCM () {
this.OverSelLengthCM = this.ClassifierIDsListCM.length
},
SendSelectedPointsToServer () {
if (this.ClassifierIDsList === ''){
this.OverSelLength = 0
EventBus.$emit('resetViews')
} else {
this.OverSelLength = this.ClassifierIDsList.length
const path = `http://127.0.0.1:5000/data/ServerRequestSelPoin`
const postData = {
ClassifiersList: this.ClassifierIDsList,
keyNow: this.keyNow,
}
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.post(path, postData, axiosConfig)
.then(response => {
console.log('Sent the selected points to the server (scatterplot)!')
if (this.keyNow == 0) {
this.OverAllLength = this.ClassifierIDsList.length
EventBus.$emit('GrayOutPoints', this.ClassifierIDsList)
}
//this.getSelectedModelsMetrics()
this.getFinalResults()
})
.catch(error => {
console.log(error)
})
}
},
RemoveFromStackModels () {
const path = `http://127.0.0.1:5000/data/ServerRemoveFromStack`
const postData = {
ClassifiersList: this.ClassifierIDsListRemaining,
}
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.post(path, postData, axiosConfig)
.then(response => {
console.log('Sent the selected points to the server (scatterplot)!')
this.updatePredictionsSpace()
})
.catch(error => {
console.log(error)
})
},
updatePredictionsSpace () {
const path = `http://localhost:5000/data/UpdatePredictionsSpace`
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.get(path, axiosConfig)
.then(response => {
this.UpdatePredictions = response.data.UpdatePredictions
console.log('Updating Predictions Space!')
if (this.keyNow == 1) {
EventBus.$emit('InitializeProvenance', this.UpdatePredictions)
EventBus.$emit('sendKeyScatt', 1)
EventBus.$emit('GrayOutPoints', this.ClassifierIDsList)
}
EventBus.$emit('updatePredictionsSpace', this.UpdatePredictions)
EventBus.$emit('updateFlagForFinalResults', 0)
this.getFinalResults()
})
.catch(error => {
console.log(error)
})
},
SendSelectedDataPointsToServer () {
// set a path from which the server will receive the seleceted predictions points
const path = `http://127.0.0.1:5000/data/ServerRequestDataPoint`
// brushing and linking between predictions space and data space
EventBus.$emit('updateDataSpaceHighlighting', this.DataPointsSel)
const postData = {
DataPointsSel: this.DataPointsSel
}
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.post(path, postData, axiosConfig)
.then(response => {
console.log('Sent the selected data points to the server!')
this.getSelectedDataPointsModels()
})
.catch(error => {
console.log(error)
})
},
getSelectedDataPointsModels () {
const path = `http://localhost:5000/data/ServerSentDataPointsModel`
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.get(path, axiosConfig)
.then(response => {
this.DataPointsModels = response.data.DataPointsModels
var resultsPerMetricUpdated = JSON.parse(this.DataPointsModels[2])
console.log('Server successfully sent the new models for the scatterplot!')
EventBus.$emit('UpdateModelsScatterplot', this.DataPointsModels)
EventBus.$emit('InitializeMetricsBarChartPrediction', JSON.stringify(resultsPerMetricUpdated))
EventBus.$emit('UpdateBalanceView', this.DataPointsModels)
})
.catch(error => {
console.log(error)
})
},
getSelectedModelsMetrics () {
const path = `http://localhost:5000/data/BarChartSelectedModels`
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.get(path, axiosConfig)
.then(response => {
this.SelectedMetricsForModels = response.data.SelectedMetricsForModels
console.log('Server successfully updated barchart for metrics based on selected models!')
EventBus.$emit('UpdateBarChartperMetric', this.SelectedMetricsForModels)
})
.catch(error => {
console.log(error)
})
},
getFinalResults () {
this.FinalResults = this.getFinalResultsFromBackend()
},
getFinalResultsFromBackend () {
const path = `http://localhost:5000/data/SendFinalResultsBacktoVisualize`
@ -606,11 +392,7 @@ export default Vue.extend({
})
},
SendAlgorithmsToServer () {
const path = `http://127.0.0.1:5000/data/ServerRequestSelParameters`
const postData = {
Algorithms: this.Algorithms,
Toggle: this.toggleDeepMain
}
const path = `http://127.0.0.1:5000/data/ServerRequestResults`
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
@ -622,66 +404,11 @@ export default Vue.extend({
axios.post(path, postData, axiosConfig)
.then(response => {
console.log('Send request to server! Algorithm name was sent successfully!')
this.factors()
})
.catch(error => {
console.log(error)
})
},
UpdateBarChartFeatures () {
const path = `http://127.0.0.1:5000/data/FeaturesScoresUpdate`
const postData = {
models: this.modelsUpdate,
algorithms: this.AlgorithmsUpdate
}
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.post(path, postData, axiosConfig)
.then(response => {
console.log('Send request to server! Updating Barchart!')
this.UpdateModelsFeaturePerformance()
})
.catch(error => {
console.log(error)
})
},
UpdateBasedonFeatures () {
const path = `http://127.0.0.1:5000/data/FeaturesSelection`
const postData = {
featureSelection: this.SelectedFeaturesPerClassifier
}
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.post(path, postData, axiosConfig)
.then(response => {
console.log('Sent specific features per model!')
this.getFinalResults()
})
.catch(error => {
console.log(error)
})
},
UpdateBrushBoxPlot () {
EventBus.$emit('emittedEventCallingBrushedBoxPlot', this.brushedBoxPlotUpdate)
},
CallPCP () {
EventBus.$emit('emittedEventCallingSelectedALgorithm', this.selectedAlgorithm)
EventBus.$emit('emittedEventCallingModelClear')
EventBus.$emit('emittedEventCallingModelSelect', this.selectedAlgorithm)
EventBus.$emit('emittedEventCallingModel', this.PerformancePerModel)
},
Reset () {
const path = `http://127.0.0.1:5000/data/Reset`
this.reset = true
@ -722,28 +449,6 @@ export default Vue.extend({
change () {
this.render(false)
},
factors () {
const path = `http://127.0.0.1:5000/data/factors`
const postData = {
Factors: this.basicValuesFact
}
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.post(path, postData, axiosConfig)
.then(response => {
console.log('Sending factors!')
this.getDatafromtheBackEnd()
})
.catch(error => {
console.log(error)
})
},
RetrieveNewColors () {
const path = `http://127.0.0.1:5000/data/UpdateOverv`
@ -765,58 +470,6 @@ export default Vue.extend({
console.log(error)
})
},
updateToggle () {
var toggles = []
toggles.push(this.toggle1)
toggles.push(this.toggle2)
toggles.push(this.toggle3)
EventBus.$emit('emittedEventCallingTogglesUpdate', toggles)
},
DataSpaceFun () {
const path = `http://127.0.0.1:5000/data/SendDataSpacPoints`
const postData = {
points: this.dataPointsSelfromDataSpace,
}
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.post(path, postData, axiosConfig)
.then(response => {
console.log('Send request to server! Brushed points sent successfully!')
})
.catch(error => {
console.log(error)
})
},
sendPointsCrossMutat () {
const path = `http://127.0.0.1:5000/data/CrossoverMutation`
const postData = {
RemainingPoints: this.unselectedRemainingPoints
}
const axiosConfig = {
headers: {
'Content-Type': 'application/json',
'Access-Control-Allow-Origin': '*',
'Access-Control-Allow-Headers': 'Origin, Content-Type, X-Auth-Token',
'Access-Control-Allow-Methods': 'GET, PUT, POST, DELETE, OPTIONS'
}
}
axios.post(path, postData, axiosConfig)
.then(response => {
console.log('Sent the unselected points for crossover and mutation.')
this.getDatafromtheBackEnd()
this.getCMComputedData()
})
.catch(error => {
console.log(error)
})
}
},
created () {
// does the browser support the Navigation Timing API?

@ -1,8 +0,0 @@
<!-- Page not found. -->
<template>
<div>
<img src="@/assets/isovis.jpg">
<p>404 - Page Not Found</p>
</div>
</template>

@ -1,846 +0,0 @@
<template>
<div>
<b-row class="md-3">
<b-col cols="12">
<div id="overview"></div>
</b-col>
</b-row>
</div>
</template>
<script>
import { EventBus } from '../main.js'
import { legend } from 'd3-svg-legend'
export default {
name: 'Parameters',
data () {
return {
WH: [],
storeActiveModels: [],
allActiveKNN: [],
allActiveSVC: [],
allActiveGausNB: [],
allActiveMLP: [],
allActiveLR: [],
allActiveLDA: [],
allActiveQDA: [],
allActiveRF: [],
allActiveExtraT: [],
allActiveAdaB: [],
allActiveGradB: [],
storeParameters: [],
keepState: 0,
FlagKNN: 0,
FlagSVC: 0,
FlagGausNB: 0,
FlagMLP: 0,
FlagLR: 0,
FlagLDA: 0,
FlagQDA: 0,
FlagRF: 0,
FlagExtraT: 0,
FlagAdaB: 0,
FlagGradB: 0,
FlagBrushAll: 0,
SVCModels: 576,
GausNBModels: 736,
MLPModels: 1236,
LRModels: 1356,
LDAModels: 1996,
QDAModels: 2196,
RFModels: 2446,
ExtraTModels: 2606,
AdaBModels: 2766,
GradBModels: 2926,
countkNNRelated: [],
countKNN: 0,
countSVCRelated: [],
countSVC: 0,
countGausNBRelated: [],
countGausNB: 0,
countMLPRelated: [],
countMLP: 0,
countLRRelated: [],
countLR: 0,
countLDARelated: [],
countLDA: 0,
countQDARelated: [],
countQDA: 0,
countRFRelated: [],
countRF: 0,
countExtraTRelated: [],
countExtraT: 0,
countAdaBRelated: [],
countAdaB: 0,
countGradBRelated: [],
countGradB: 0,
}
},
methods: {
reset () {
setTimeout(() => {
var svg = d3.select("#overview");
svg.selectAll("*").remove();
}, 50);
},
RadarChart(id, data, options) {
var cfg = {
w: 600, //Width of the circle
h: 600, //Height of the circle
margin: {top: 60, right: 20, bottom: 20, left: 120}, //The margins around the circle
legendPosition: {x: 20, y: 20}, // the position of the legend, from the top-left corner of the svg
levels: 3, //How many levels or inner circles should there be drawn
maxValue: 0, //What is the value that the biggest circle will represent
labelFactor: 1.25, //How much farther than the radius of the outer circle should the labels be placed
wrapWidth: 60, //The number of pixels after which a label needs to be given a new line
opacityArea: 0.35, //The opacity of the area of the blob
dotRadius: 2, //The size of the colored circles of each blog
opacityCircles: 0.1, //The opacity of the circles of each blob
strokeWidth: 2, //The width of the stroke around each blob
roundStrokes: false, //If true the area and stroke will follow a round path (cardinal-closed)
color: d3.scale.category10(), //Color function
axisName: "axis",
areaName:"areaName",
value: "value",
sortAreas: true,
colorsDiff: ['#a6cee3','#1f78b4','#b2df8a','#33a02c','#fb9a99','#e31a1c','#fdbf6f','#ff7f00','#cab2d6','#6a3d9a','#b15928']
};
//Put all of the options into a variable called cfg
if('undefined' !== typeof options){
for(var i in options){
if('undefined' !== typeof options[i]){ cfg[i] = options[i]; }
}//for i
}//if
//Map the fields specified in the configuration
// to the axis and value variables
var axisName = cfg["axisName"],
areaName = cfg["areaName"],
value = cfg["value"];
//If the supplied maxValue is smaller than the actual one, replace by the max in the data
var maxValue = Math.max(cfg.maxValue, d3.max(data, function(i){return d3.max(i.map(function(o){return o.value;}))}))
var allAxis = (data[0].map(function(d, i){ return d[axisName] })), //Names of each axis
total = allAxis.length, //The number of different axes
radius = Math.min(cfg.w/2, cfg.h/2), //Radius of the outermost circle
Format = d3.format('%'), //Percentage formatting
angleSlice = Math.PI * 2 / total; //The width in radians of each "slice"
//Scale for the radius
var rScale = d3.scale.linear()
.range([0, radius])
.domain([0, maxValue]);
/////////////////////////////////////////////////////////
//////////// Create the container SVG and g /////////////
/////////////////////////////////////////////////////////
//Remove whatever chart with the same id/class was present before
d3.select(id).select("svg").remove();
//Initiate the radar chart SVG
var svg = d3.select(id).append("svg")
.attr("width", cfg.w + cfg.margin.left + cfg.margin.right)
.attr("height", cfg.h + cfg.margin.top + cfg.margin.bottom)
.attr("class", "radar"+id);
//Append a g element
var g = svg.append("g")
.attr("transform", "translate(" + (cfg.w/2 + cfg.margin.left) + "," + (cfg.h/2 + cfg.margin.top) + ")");
/////////////////////////////////////////////////////////
////////// Glow filter for some extra pizzazz ///////////
/////////////////////////////////////////////////////////
//Filter for the outside glow
var filter = g.append('defs').append('filter').attr('id','glow'),
feGaussianBlur = filter.append('feGaussianBlur').attr('stdDeviation','2.5').attr('result','coloredBlur'),
feMerge = filter.append('feMerge'),
feMergeNode_1 = feMerge.append('feMergeNode').attr('in','coloredBlur'),
feMergeNode_2 = feMerge.append('feMergeNode').attr('in','SourceGraphic');
/////////////////////////////////////////////////////////
/////////////// Draw the Circular grid //////////////////
/////////////////////////////////////////////////////////
//Wrapper for the grid & axes
var axisGrid = g.append("g").attr("class", "axisWrapper");
//Draw the background circles
axisGrid.selectAll(".levels")
.data(d3.range(1,(cfg.levels+1)).reverse())
.enter()
.append("circle")
.attr("class", "gridCircle")
.attr("transform", "translate(5,5)")
.attr("r", function(d, i){return radius/cfg.levels*d;})
.style("fill", "#CDCDCD")
.style("stroke", "#CDCDCD")
.style("fill-opacity", cfg.opacityCircles)
.style("filter" , "url(#glow)");
//Text indicating at what % each level is
axisGrid.selectAll(".axisLabel")
.data(d3.range(1,(cfg.levels+1)).reverse())
.enter().append("text")
.attr("class", "axisLabel")
.attr("x", 10)
.attr("y", function(d){return -d*radius/cfg.levels;})
.attr("dy", "0.4em")
.style("font-size", "16px")
.attr("fill", "#737373")
.text(function(d,i) { return Format(maxValue * d/cfg.levels); });
/////////////////////////////////////////////////////////
//////////////////// Draw the axes //////////////////////
/////////////////////////////////////////////////////////
//Create the straight lines radiating outward from the center
var axis = axisGrid.selectAll(".axis")
.data(allAxis)
.enter()
.append("g")
.attr("class", "axis");
//Append the lines
axis.append("line")
.attr("x1", 0)
.attr("y1", 0)
.attr("transform", "translate(5,5)")
.attr("x2", function(d, i){ return rScale(maxValue*1.2) * Math.cos(angleSlice*i - Math.PI/2); })
.attr("y2", function(d, i){ return rScale(maxValue*1.2) * Math.sin(angleSlice*i - Math.PI/2); })
.attr("class", "line")
.style("stroke", "white")
.style("stroke-width", "2px");
axis.append("rect")
.attr("text-anchor", "left")
.attr("dy", "0.35em")
.attr("x", function(d, i){ return (rScale(maxValue * cfg.labelFactor) * Math.cos(angleSlice*i - Math.PI/2)) - 25; })
.attr("y", function(d, i){ return rScale(maxValue * cfg.labelFactor) * Math.sin(angleSlice*i - Math.PI/2); })
.text(function(d){return d})
.attr("width", 15)
.attr("height", 15)
.style("fill", function(d,i) { return cfg.colorsDiff[i]; })
//Append the labels at each axis
axis.append("text")
.attr("class", "legend")
.style("font-size", "16px")
.attr("text-anchor", "middle")
.attr("dy", "0em")
.style("font-size", "16px")
.attr("x", function(d, i){ return (rScale(maxValue * cfg.labelFactor) * Math.cos(angleSlice*i - Math.PI/2)) + 15; })
.attr("y", function(d, i){ return rScale(maxValue * cfg.labelFactor) * Math.sin(angleSlice*i - Math.PI/2); })
.text(function(d){return d})
.call(wrap, cfg.wrapWidth);
/////////////////////////////////////////////////////////
///////////// Draw the radar chart blobs ////////////////
/////////////////////////////////////////////////////////
//The radial line function
var radarLine = d3.svg.line.radial()
.interpolate("linear-closed")
.radius(function(d) { return rScale(d[value]); })
.angle(function(d,i) { return i*angleSlice; });
if(cfg.roundStrokes) {
radarLine.interpolate("cardinal-closed");
}
//Create a wrapper for the blobs
var blobWrapper = g.selectAll(".radarWrapper")
.data(data)
.enter().append("g")
.attr("transform", "translate(5,5)")
.attr("class", "radarWrapper");
//Append the backgrounds
blobWrapper
.append("path")
.attr("class", function(d) {
return "radarArea" + " " + d[0][areaName].replace(/\s+/g, '') //Remove spaces from the areaName string to make one valid class name
})
.attr("d", function(d,i) { return radarLine(d); })
.style("fill", function(d,i) { return cfg.color(i); })
.style("fill-opacity", cfg.opacityArea)
.on('mouseover', function (d,i){
//Dim all blobs
d3.selectAll(".radarArea")
.transition().duration(200)
.style("fill-opacity", 0.1);
//Bring back the hovered over blob
d3.select(this)
.transition().duration(200)
.style("fill-opacity", 0.7);
})
.on('mouseout', function(){
//Bring back all blobs
d3.selectAll(".radarArea")
.transition().duration(200)
.style("fill-opacity", cfg.opacityArea);
});
//Create the outlines
blobWrapper.append("path")
.attr("class", "radarStroke")
.attr("d", function(d,i) { return radarLine(d); })
.style("stroke-width", cfg.strokeWidth + "px")
.style("stroke", function(d,i) { return cfg.color(i); })
.style("fill", "none")
.style("filter" , "url(#glow)");
//Append the circles
blobWrapper.selectAll(".radarCircle")
.data(function(d,i) { return d; })
.enter().append("circle")
.attr("class", "radarCircle")
.attr("r", cfg.dotRadius)
.attr("cx", function(d,i){ return rScale(d[value]) * Math.cos(angleSlice*i - Math.PI/2); })
.attr("cy", function(d,i){ return rScale(d[value]) * Math.sin(angleSlice*i - Math.PI/2); })
.style("fill", function(d,i,j) { return cfg.color(j); })
.style("fill-opacity", 0.8);
/////////////////////////////////////////////////////////
//////// Append invisible circles for tooltip ///////////
/////////////////////////////////////////////////////////
//Wrapper for the invisible circles on top
var blobCircleWrapper = g.selectAll(".radarCircleWrapper")
.data(data)
.enter().append("g")
.attr("class", "radarCircleWrapper");
//Append a set of invisible circles on top for the mouseover pop-up
blobCircleWrapper.selectAll(".radarInvisibleCircle")
.data(function(d,i) { return d; })
.enter().append("circle")
.attr("class", "radarInvisibleCircle")
.attr("r", cfg.dotRadius*1.5)
.attr("cx", function(d,i){ return rScale(d[value]) * Math.cos(angleSlice*i - Math.PI/2); })
.attr("cy", function(d,i){ return rScale(d[value]) * Math.sin(angleSlice*i - Math.PI/2); })
.style("fill", "none")
.style("pointer-events", "all")
.on("mouseover", function(d,i) {
var newX
var newY
newX = parseFloat(d3.select(this).attr('cx')) - 10;
newY = parseFloat(d3.select(this).attr('cy')) - 10;
tooltip
.attr('x', newX+5)
.attr('y', newY+5)
.text(Format(d[value]))
.transition().duration(200)
.style('opacity', 1);
})
.on("mouseout", function(){
tooltip.transition().duration(200)
.style("opacity", 0);
});
//Set up the small tooltip for when you hover over a circle
var tooltip = g.append("text")
.attr("class", "tooltip")
.style("opacity", 0);
/////////////////////////////////////////////////////////
/////////////////// Helper Functions ////////////////////
/////////////////////////////////////////////////////////
//Taken from http://bl.ocks.org/mbostock/7555321
//Wraps SVG text
function wrap(text, width) {
text.each(function() {
var text = d3.select(this),
words = text.text().split(/\s+/).reverse(),
word,
line = [],
lineNumber = 0,
lineHeight = 1.4, // ems
y = text.attr("y"),
x = text.attr("x"),
dy = parseFloat(text.attr("dy")),
tspan = text.text(null).append("tspan").attr("x", x).attr("y", y).attr("dy", dy + "em");
while (word = words.pop()) {
line.push(word);
tspan.text(line.join(" "));
if (tspan.node().getComputedTextLength() > width) {
line.pop();
tspan.text(line.join(" "));
line = [word];
tspan = text.append("tspan").attr("x", x).attr("y", y).attr("dy", ++lineNumber * lineHeight + dy + "em").text(word);
}
}
});
}//wrap
// on mouseover for the legend symbol
function cellover(d) {
//Dim all blobs
d3.selectAll(".radarArea")
.transition().duration(200)
.style("fill-opacity", 0.1);
//Bring back the hovered over blob
d3.select("." + data[d][0][areaName].replace(/\s+/g, ''))
.transition().duration(200)
.style("fill-opacity", 0.7);
}
// on mouseout for the legend symbol
function cellout() {
//Bring back all blobs
d3.selectAll(".radarArea")
.transition().duration(200)
.style("fill-opacity", cfg.opacityArea);
}
/////////////////////////////////////////////////////////
/////////////////// Draw the Legend /////////////////////
/////////////////////////////////////////////////////////
svg.append("g")
.attr("class", "legendOrdinal")
.attr("transform", "translate(" + cfg["legendPosition"]["x"] + "," + cfg["legendPosition"]["y"] + ")");
var legendOrdinal = legend.color()
.shape("path", d3.svg.symbol().type("circle").size(150)())
.shapePadding(10)
.scale(cfg.color)
.labels(cfg.color.domain().map(function(d){
return data[d][0][areaName];
}))
.on("cellover", function(d){ cellover(d); })
.on("cellout", function(d) { cellout(); });
svg.select(".legendOrdinal").call(legendOrdinal);
},
overview() {
/* Radar chart design created by Nadieh Bremer - VisualCinnamon.com */
// Clear Heatmap first
var svg = d3.select("#overview");
svg.selectAll("*").remove();
var widthinter = this.WH[0]*2 // interactive visualization
var heightinter = this.WH[1]*1.23 // interactive visualization
const max = 640
const KNNAll = 576
const SVCAll = 160
const GausNBAll = 500
const MLPAll = 120
const LRAll = 640
const LDAAll = 200
const QDAAll = 250
const RFAll = 160
const ExtraTAll = 160
const AdaBAll = 160
const GradBAll = 180
var KNNSelection = 0
var SVCSelection = 0
var GausNBSelection = 0
var MLPSelection = 0
var LRSelection = 0
var LDASelection = 0
var QDASelection = 0
var RFSelection = 0
var ExtraTSelection = 0
var AdaBSelection = 0
var GradBSelection = 0
if (this.FlagBrushAll == 0 && this.FlagKNN == 0 && this.FlagSVC == 0 && this.FlagGausNB == 0 && this.FlagMLP == 0 && this.FlagLR == 0 && this.FlagLDA == 0 && this.FlagQDA == 0 && this.FlagRF == 0 && this.FlagExtraT == 0 && this.FlagAdaB == 0 && this.FlagGradB == 0) {
this.storeActiveModels = []
this.allActiveKNN = []
this.allActiveSVC = []
this.allActiveGausNB = []
this.allActiveMLP = []
this.allActiveLR = []
this.allActiveLDA = []
this.allActiveQDA = []
this.allActiveRF = []
this.allActiveExtraT = []
this.allActiveAdaB = []
this.allActiveGradB = []
this.countkNNRelated = []
this.countKNN = 0
this.countSVCRelated = []
this.countSVC = 0
this.countGausNBRelated = []
this.countGausNB = 0
this.countMLPRelated = []
this.countMLP = 0
this.countLRRelated = []
this.countLR = 0
this.countLDARelated = []
this.countLDA = 0
this.countQDARelated = []
this.countQDA = 0
this.countRFRelated = []
this.countRF = 0
this.countExtraTRelated = []
this.countExtraT = 0
this.countAdaBRelated = []
this.countAdaB = 0
this.countGradBRelated = []
this.countGradB = 0
}
if(JSON.stringify(this.keepState)!=JSON.stringify(this.storeActiveModels)) {
if (this.storeActiveModels.length != 0) {
var intersection = this.compare(this.keepState,this.storeActiveModels)
for (let k = 0; k < intersection.length; k++) {
if (intersection[k] > this.GradBModels) {
this.countGradB = 0
} else if (intersection[k] > this.AdaBModels) {
this.countAdaB = 0
} else if (intersection[k] > this.ExtraTModels) {
this.countExtraT = 0
} else if (intersection[k] > this.RFModels) {
this.countRF = 0
} else if (intersection[k] > this.QDAModels) {
this.countQDA = 0
} else if (intersection[k] > this.LDAModels) {
this.countLDA = 0
} else if (intersection[k] > this.LRModels) {
this.countLR = 0
} else if (intersection[k] > this.MLPModels) {
this.countMLP = 0
} else if (intersection[k] > this.GausNBModels) {
this.countGausNB = 0
} else if (intersection[k] > this.SVCModels) {
this.countSVC = 0
} else {
this.countKNN = 0
}
}
for (let i = 0; i < this.storeActiveModels.length; i++) {
if (this.storeActiveModels[i] > this.GradBModels) {
this.countGradBRelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countGradB++
} else if (this.storeActiveModels[i] > this.AdaBModels) {
this.countAdaBRelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countAdaB++
} else if (this.storeActiveModels[i] > this.ExtraTModels) {
this.countExtraTRelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countExtraT++
} else if (this.storeActiveModels[i] > this.RFModels) {
this.countRFRelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countRF++
} else if (this.storeActiveModels[i] > this.QDAModels) {
this.countQDARelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countQDA++
} else if (this.storeActiveModels[i] > this.LDAModels) {
this.countLDARelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countLDA++
} else if (this.storeActiveModels[i] > this.LRModels) {
this.countLRRelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countLR++
} else if (this.storeActiveModels[i] > this.MLPModels) {
this.countMLPRelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countMLP++
} else if (this.storeActiveModels[i] > this.GausNBModels) {
this.countGausNBRelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countGausNB++
} else if (this.storeActiveModels[i] > this.SVCModels) {
this.countSVCRelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countSVC++
} else {
this.countkNNRelated.push(JSON.parse(this.storeParameters[this.storeActiveModels[i]]))
this.countKNN++
}
}
}
if (this.storeActiveModels[0] > this.GradBModels) {
this.allActiveGradB = this.countGradBRelated.slice()
} else if (this.storeActiveModels[0] > this.AdaBModels) {
this.allActiveAdaB = this.countAdaBRelated.slice()
} else if (this.storeActiveModels[0] > this.ExtraTModels) {
this.allActiveExtraT = this.countExtraTRelated.slice()
} else if (this.storeActiveModels[0] > this.RFModels) {
this.allActiveRF = this.countRFRelated.slice()
} else if (this.storeActiveModels[0] > this.QDAModels) {
this.allActiveQDA = this.countQDARelated.slice()
} else if (this.storeActiveModels[0] > this.LDAModels) {
this.allActiveLDA = this.countLDARelated.slice()
} else if (this.storeActiveModels[0] > this.LRModels) {
this.allActiveLR = this.countLRRelated.slice()
} else if (this.storeActiveModels[0] > this.MLPModels) {
this.allActiveMLP = this.countMLPRelated.slice()
} else if (this.storeActiveModels[0] > this.GausNBModels) {
this.allActiveGausNB = this.countGausNBRelated.slice()
} else if (this.storeActiveModels[0] > this.SVCModels) {
this.allActiveSVC = this.countSVCRelated.slice()
} else {
this.allActiveKNN = this.countkNNRelated.slice()
}
}
KNNSelection = this.countKNN
SVCSelection = this.countSVC
GausNBSelection = this.countGausNB
MLPSelection = this.countMLP
LRSelection = this.countLR
LDASelection = this.countLDA
QDASelection = this.countQDA
RFSelection = this.countRF
ExtraTSelection = this.countExtraT
AdaBSelection = this.countAdaB
GradBSelection = this.countGradB
this.keepState = JSON.parse(JSON.stringify(this.storeActiveModels))
if (this.FlagKNN == 1 && this.allActiveKNN.length == 0) {
KNNSelection = 576
}
if (this.FlagSVC == 1 && this.allActiveSVC.length == 0) {
SVCSelection = 160
}
if (this.FlagGausNB == 1 && this.allActiveGausNB.length == 0) {
GausNBSelection = 500
}
if (this.FlagMLP == 1 && this.allActiveMLP.length == 0) {
MLPSelection = 120
}
if (this.FlagLR == 1 && this.allActiveLR.length == 0) {
LRSelection = 640
}
if (this.FlagLDA == 1 && this.allActiveLDA.length == 0) {
LDASelection = 200
}
if (this.FlagQDA == 1 && this.allActiveQDA.length == 0) {
QDASelection = 250
}
if (this.FlagRF == 1 && this.allActiveRF.length == 0) {
RFSelection = 160
}
if (this.FlagExtraT == 1 && this.allActiveExtraT.length == 0) {
ExtraTSelection = 160
}
if (this.FlagAdaB == 1 && this.allActiveAdaB.length == 0) {
AdaBSelection = 160
}
if (this.FlagGradB == 1 && this.allActiveGradB.length == 0) {
GradBSelection = 180
}
//////////////////////////////////////////////////////////////
//////////////////////// Set-Up //////////////////////////////
//////////////////////////////////////////////////////////////
var margin = {top: 50, right: 120, bottom: 55, left: 65},
legendPosition = {x: 425, y: 25},
width = Math.min(520, window.innerWidth - 10) - margin.left - margin.right,
height = Math.min(width + 12, window.innerHeight + 12 - margin.top - margin.bottom);
//////////////////////////////////////////////////////////////
////////////////////////// Data //////////////////////////////
//////////////////////////////////////////////////////////////
var data = [
[
{axis:"KNN [576]",legend:"Entire",value:KNNAll/max},
{axis:"SVC [160]",legend:"Entire",value:SVCAll/max},
{axis:"GauNB [500]",legend:"Entire",value:GausNBAll/max},
{axis:"MLP [120]",legend:"Entire",value:MLPAll/max},
{axis:"LR [640]",legend:"Entire",value:LRAll/max},
{axis:"LDA [200]",legend:"Entire",value:LDAAll/max},
{axis:"QDA [250]",legend:"Entire",value:QDAAll/max},
{axis:"RF [160]",legend:"Entire",value:RFAll/max},
{axis:"ExtraT [160]",legend:"Entire",value:ExtraTAll/max},
{axis:"AdaB [160]",legend:"Entire",value:AdaBAll/max},
{axis:"GradB [180]",legend:"Entire",value:GradBAll/max},
],[
{axis:"KNN [576]",legend:"Selection",value:KNNSelection/max},
{axis:"SVC [160]",legend:"Selection",value:SVCSelection/max},
{axis:"GauNB [500]",legend:"Selection",value:GausNBSelection/max},
{axis:"MLP [120]",legend:"Selection",value:MLPSelection/max},
{axis:"LR [640]",legend:"Selection",value:LRSelection/max},
{axis:"LDA [200]",legend:"Selection",value:LDASelection/max},
{axis:"QDA [250]",legend:"Selection",value:QDASelection/max},
{axis:"RF [160]",legend:"Selectionn",value:RFSelection/max},
{axis:"ExtraT [160]",legend:"Selection",value:ExtraTSelection/max},
{axis:"AdaB [160]",legend:"Selection",value:AdaBSelection/max},
{axis:"GradB [180]",legend:"Selection",value:GradBSelection/max},
],
];
//////////////////////////////////////////////////////////////
//////////////////// Draw the Chart //////////////////////////
//////////////////////////////////////////////////////////////
var color = d3.scale.ordinal()
.range(["#ffed6f","#000000"]);
var radarChartOptions = {
w: width,
h: height,
margin: margin,
legendPosition: legendPosition,
maxValue: 0.5,
levels: 5,
roundStrokes: true,
color: color,
axisName: "axis",
areaName: "legend",
value: "value"
};
//Call function to draw the Radar chart
this.RadarChart("#overview", data, radarChartOptions);
},
updateFlags () {
this.FlagKNN = 0
this.FlagSVC = 0
this.FlagGausNB = 0
this.FlagMLP = 0
this.FlagLR = 0
this.FlagLDA = 0
this.FlagQDA = 0
this.FlagRF = 0
this.FlagExtraT = 0
this.FlagAdaB = 0
this.FlagGradB = 0
},
compare(arr1,arr2){
const finalarray =[];
arr1.forEach((e1) => arr2.forEach((e2) =>
{if(e1 === e2){
finalarray.push(e1)
}
}
))
return finalarray
}
},
mounted () {
EventBus.$on('updateFlagKNN', data => { this.FlagKNN = data })
EventBus.$on('updateFlagSVC', data => { this.FlagSVC = data })
EventBus.$on('updateFlagGauNB', data => { this.FlagGausNB = data })
EventBus.$on('updateFlagMLP', data => { this.FlagMLP = data })
EventBus.$on('updateFlagLR', data => { this.FlagLR = data })
EventBus.$on('updateFlagLDA', data => { this.FlagLDA = data })
EventBus.$on('updateFlagQDA', data => { this.FlagQDA = data })
EventBus.$on('updateFlagRF', data => { this.FlagRF = data })
EventBus.$on('updateFlagExtraT', data => { this.FlagExtraT = data })
EventBus.$on('updateFlagAdaB', data => { this.FlagAdaB = data })
EventBus.$on('updateFlagGradB', data => { this.FlagGradB = data })
EventBus.$on('flagBrushedAll', data => { this.FlagBrushAll = data })
EventBus.$on('updateFlagKNN', this.overview)
EventBus.$on('updateFlagSVC', this.overview)
EventBus.$on('updateFlagGauNB', this.overview)
EventBus.$on('updateFlagMLP', this.overview)
EventBus.$on('updateFlagLR', this.overview)
EventBus.$on('updateFlagLDA', this.overview)
EventBus.$on('updateFlagQDA', this.overview)
EventBus.$on('updateFlagRF', this.overview)
EventBus.$on('updateFlagExtraT', this.overview)
EventBus.$on('updateFlagAdaB', this.overview)
EventBus.$on('updateFlagGradB', this.overview)
EventBus.$on('sendParameters', data => { this.storeParameters = data })
EventBus.$on('updateActiveModels', data => { this.storeActiveModels = data })
EventBus.$on('updateActiveModels', this.overview)
EventBus.$on('Responsive', data => {
this.WH = data})
EventBus.$on('ResponsiveandChange', data => {
this.WH = data})
// reset the views
EventBus.$on('resetViews', this.reset)
EventBus.$on('alternateFlagLock', this.updateFlags)
EventBus.$on('alternateFlagLock', this.overview)
}
}
</script>
<style>
/* Styles go here */
.category-circle {
fill: url(#gradient-categorization);
}
.question-circle {
fill: url(#gradient-questions);
}
.chart-area-circle {
stroke: #fff;
stroke-width: 3px;
fill: url(#gradient-chart-area);
transform: translate(5px, 5px);
}
.center-circle {
fill: #fff;
transform: translate(5px, 5px);
}
.bars {
fill: url(#gradient-bars);
}
.gridlines {
fill: none;
stroke: #fff;
transform: translate(5px, 5px);
}
.minor {
stroke-width: 1px
}
.major {
stroke-width: 6px
}
.question-label-arc {
/*fill: white;
stroke: #AAAAAA;
fill: url(#gradient-questions);*/
}
.category-label-text {
font-weight: bold;
font-size: 16px;
fill: #fff;
}
.question-label-text {
font-size: 16px;
font-weight: bold;
fill: gray;
}
.question-labels {
text-anchor: middle;
font-weight: bold;
}
.category-labels {
text-anchor: middle;
font-weight: bold;
font-size: 16px;
fill: #fff;
}
.filled {
fill: url(#mainGradient);
}
#overview {
min-height: 450px;
}
</style>

@ -1,148 +0,0 @@
<template>
<div>
<b-row>
<b-col cols="12">
<table class="table table-borderless table-sm">
<tbody>
<tr>
<th scope="col" colspan="2">Balanced data set</th>
<th scope="col" colspan="2">Imbalanced data set</th>
</tr>
<tr>
<td>(M1) Accuracy:</td>
<td>
<b-form-checkbox
id="checkboxAcc"
v-model="checkedAcc"
@click="clickAcc"
>
</b-form-checkbox>
</td>
<td>(M1*) G-mean:</td>
<td>
<b-form-checkbox
id="checkboxGM"
v-model="checkedGM"
@click="clickGM"
>
</b-form-checkbox>
</td>
</tr>
<tr>
<td>(M2) Precision:</td>
<td>
<b-form-checkbox
id="checkboxPrec"
v-model="checkedPrec"
@click="clickPrec"
>
</b-form-checkbox>
</td>
<td>(M2*) ROC AUC:</td>
<td>
<b-form-checkbox
id="checkboxRA"
v-model="checkedRA"
@click="clickRA"
>
</b-form-checkbox>
</td>
</tr>
<tr>
<td>(M3) Recall:</td>
<td>
<b-form-checkbox
id="checkboxRec"
v-model="checkedRec"
@click="clickRec"
>
</b-form-checkbox>
</td>
<td>(M3*) Log loss:</td>
<td>
<b-form-checkbox
id="checkboxLog"
v-model="checkedLog"
@click="clickLog"
>
</b-form-checkbox>
</td>
</tr>
<tr>
<td>(M4) F1-score:</td>
<td>
<b-form-checkbox
id="checkboxF1"
v-model="checkedF1"
@click="clickF1"
>
</b-form-checkbox>
</td>
<td>(M4*) MCC:</td>
<td>
<b-form-checkbox
id="checkboxMCC"
v-model="checkedMCC"
@click="clickMCC"
>
</b-form-checkbox>
</td>
</tr>
</tbody>
</table>
</b-col>
</b-row>
</div>
</template>
<script>
import { EventBus } from '../main.js'
export default {
name: 'PerformanceMetrics',
data () {
return {
checkedAcc: true,
checkedPrec: true,
checkedRec: true,
checkedF1: true,
checkedGM: false,
checkedRA: false,
checkedLog: false,
checkedMCC: false,
}
},
methods: {
clickAcc () {
this.checkedAcc = !this.checkedAcc
},
clickPrec () {
this.checkedPrec = !this.checkedPrec
},
clickRec () {
this.checkedRec = !this.checkedRec
},
clickF1 () {
this.checkedF1 = !this.checkedF1
},
clickGM () {
this.checkedGM = !this.checkedGM
},
clickRA () {
this.checkedRA = !this.checkedRA
},
clickLog () {
this.checkedLog = !this.checkedLog
},
clickMCC () {
this.checkedMCC = !this.checkedMCC
},
},
mounted () {
}
}
</script>
<style>
</style>

@ -1,454 +0,0 @@
<template>
<div>
<div id="containerAll"></div>
<div id="containerSelection"></div>
</div>
</template>
<script>
import * as d3Base from 'd3'
import { EventBus } from '../main.js'
import $ from 'jquery'
import * as colorbr from 'colorbrewer'
// attach all d3 plugins to the d3 library
const d3 = Object.assign(d3Base)
const colorbrewer = Object.assign(colorbr)
export default {
name: "Predictions",
data () {
return {
GetResultsAll: [],
GetResultsSelection: [],
responsiveWidthHeight: [],
predictSelection: [],
StoreIndices: [],
}
},
methods: {
reset () {
var svg = d3.select("#containerAll");
svg.selectAll("*").remove();
var svg = d3.select("#containerSelection");
svg.selectAll("*").remove();
},
Grid () {
Array.prototype.multiIndexOf = function (el) {
var idxs = [];
for (var i = this.length - 1; i >= 0; i--) {
if (this[i] === el) {
idxs.unshift(i);
}
}
return idxs;
};
var svg = d3.select("#containerAll");
svg.selectAll("*").remove();
var yValues = JSON.parse(this.GetResultsAll[6])
var targetNames = JSON.parse(this.GetResultsAll[7])
var getIndices = []
for (let i = 0; i < targetNames.length; i++) {
getIndices.push(yValues.multiIndexOf(targetNames[i]))
}
getIndices.reverse()
var predictions = JSON.parse(this.GetResultsAll[12])
var KNNPred = predictions[0]
var LRPred = predictions[1]
var PredAver = predictions[2]
var dataAver = []
var dataAverGetResults = []
var dataKNN = []
var dataKNNResults = []
var dataLR = []
var dataLRResults = []
var max = 0
for (let i = 0; i < targetNames.length; i++) {
if (getIndices[targetNames[i]].length > max) {
max = getIndices[targetNames[i]].length
}
}
var sqrtSize = Math.ceil(Math.sqrt(max))
var size = sqrtSize * sqrtSize
for (let i = 0; i < targetNames.length; i++) {
dataAver = [];
dataKNN = []
dataLR = []
getIndices[targetNames[i]].forEach(element => {
dataAver.push({ id: element, value: PredAver[element][targetNames[i]] })
dataKNN.push({ id: element, value: KNNPred[element][targetNames[i]] })
dataLR.push({ id: element, value: LRPred[element][targetNames[i]] })
});
for (let j = 0; j < size - getIndices[targetNames[i]].length; j++) {
dataAver.push({ id: null, value: 1.0 })
dataKNN.push({ id: null, value: 1.0 })
dataLR.push({ id: null, value: 1.0 })
}
dataAverGetResults.push(dataAver)
dataKNNResults.push(dataKNN)
dataLRResults.push(dataLR)
}
dataAverGetResults.reverse()
dataKNNResults.reverse()
dataLRResults.reverse()
var classArray = []
this.StoreIndices = []
for (let i = 0; i < dataAverGetResults.length; i++) {
dataAverGetResults[i].sort((a, b) => (a.value > b.value) ? 1 : -1)
var len = dataAverGetResults[i].length
var indices = new Array(len)
for (let j = 0; j < len; j++) {
indices[j] = dataAverGetResults[i][j].id;
}
this.StoreIndices.push(indices)
dataKNNResults[i].sort(function(a, b){
return indices.indexOf(a.id) - indices.indexOf(b.id)
});
dataLRResults[i].sort(function(a, b){
return indices.indexOf(a.id) - indices.indexOf(b.id)
});
classArray.push(dataAverGetResults[i].concat(dataKNNResults[i], dataLRResults[i]));
}
var classStore = [].concat.apply([], classArray);
// === Set up canvas === //
var width = 2500,
height = 125;
var colourScale;
var canvas = d3.select('#containerAll')
.append('canvas')
.attr('width', width)
.attr('height', height);
var context = canvas.node().getContext('2d');
// === Bind data to custom elements === //
var customBase = document.createElement('custom');
var custom = d3.select(customBase); // this is our svg replacement
// settings for a grid with 40 cells in a row and 2x5 cells in a group
var groupSpacing = 60;
var cellSpacing = 2;
var cellSize = Math.floor((width - 11 * groupSpacing) / (15.2*sqrtSize)) - cellSpacing;
// === First call === //
databind(classStore, size, sqrtSize); // ...then update the databind function
var t = d3.timer(function(elapsed) {
draw();
if (elapsed > 300) t.stop();
}); // start a timer that runs the draw function for 500 ms (this needs to be higher than the transition in the databind function)
// === Bind and draw functions === //
function databind(data, size, sqrtSize) {
colourScale = d3.scaleSequential(d3.interpolateReds).domain([1, 0])
var join = custom.selectAll('custom.rect')
.data(data);
var enterSel = join.enter()
.append('custom')
.attr('class', 'rect')
.attr('x', function(d, i) {
var x0 = Math.floor(i / size) % sqrtSize, x1 = Math.floor(i % sqrtSize);
return groupSpacing * x0 + (cellSpacing + cellSize) * (x1 + x0 * 10);
})
.attr('y', function(d, i) {
var y0 = Math.floor(i / data.length), y1 = Math.floor(i % size / sqrtSize);
return groupSpacing * y0 + (cellSpacing + cellSize) * (y1 + y0 * 10);
})
.attr('width', 0)
.attr('height', 0);
join
.merge(enterSel)
.transition()
.attr('width', cellSize)
.attr('height', cellSize)
.attr('fillStyle', function(d) { return colourScale(d.value); })
var exitSel = join.exit()
.transition()
.attr('width', 0)
.attr('height', 0)
.remove();
} // databind()
// === Draw canvas === //
function draw() {
// clear canvas
context.fillStyle = '#fff';
context.fillRect(0, 0, width, height);
// draw each individual custom element with their properties
var elements = custom.selectAll('custom.rect') // this is the same as the join variable, but used here to draw
elements.each(function(d,i) {
// for each virtual/custom element...
var node = d3.select(this);
context.fillStyle = node.attr('fillStyle');
context.fillRect(node.attr('x'), node.attr('y'), node.attr('width'), node.attr('height'))
});
} // draw()
},
GridSelection () {
Array.prototype.multiIndexOf = function (el) {
var idxs = [];
for (var i = this.length - 1; i >= 0; i--) {
if (this[i] === el) {
idxs.unshift(i);
}
}
return idxs;
};
var svg = d3.select("#containerSelection");
svg.selectAll("*").remove();
var predictionsAll = JSON.parse(this.GetResultsSelection[12])
if (this.predictSelection.length != 0) {
var predictions = this.predictSelection
var KNNPred = predictions[0]
var LRPred = predictions[1]
var PredAver = predictions[2]
} else {
var KNNPred = predictionsAll[0]
var LRPred = predictionsAll[1]
var PredAver = predictionsAll[2]
}
var KNNPredAll = predictionsAll[0]
var LRPredAll = predictionsAll[1]
var PredAverAll = predictionsAll[2]
var yValues = JSON.parse(this.GetResultsSelection[6])
var targetNames = JSON.parse(this.GetResultsSelection[7])
var getIndices = []
for (let i = 0; i < targetNames.length; i++) {
getIndices.push(yValues.multiIndexOf(targetNames[i]))
}
getIndices.reverse()
var dataAver = []
var dataAverGetResults = []
var dataKNN = []
var dataKNNResults = []
var dataLR = []
var dataLRResults = []
var max = 0
for (let i = 0; i < targetNames.length; i++) {
if (getIndices[targetNames[i]].length > max) {
max = getIndices[targetNames[i]].length
}
}
var sqrtSize = Math.ceil(Math.sqrt(max))
var size = sqrtSize * sqrtSize
for (let i = 0; i < targetNames.length; i++) {
dataAver = [];
dataKNN = []
dataLR = []
getIndices[targetNames[i]].forEach(element => {
dataAver.push({ id: element, value: PredAver[element][targetNames[i]] - PredAverAll[element][targetNames[i]] })
dataKNN.push({ id: element, value: KNNPred[element][targetNames[i]] - KNNPredAll[element][targetNames[i]] })
dataLR.push({ id: element, value: LRPred[element][targetNames[i]] - LRPredAll[element][targetNames[i]] })
});
for (let j = 0; j < size - getIndices[targetNames[i]].length; j++) {
dataAver.push({ id: null, value: 0 })
dataKNN.push({ id: null, value: 0 })
dataLR.push({ id: null, value: 0 })
}
dataAverGetResults.push(dataAver)
dataKNNResults.push(dataKNN)
dataLRResults.push(dataLR)
}
dataAverGetResults.reverse()
dataKNNResults.reverse()
dataLRResults.reverse()
var classArray = []
for (let i = 0; i < dataAverGetResults.length; i++) {
var indices = this.StoreIndices[i]
dataAverGetResults[i].sort(function(a, b){
return indices.indexOf(a.id) - indices.indexOf(b.id)
});
dataKNNResults[i].sort(function(a, b){
return indices.indexOf(a.id) - indices.indexOf(b.id)
});
dataLRResults[i].sort(function(a, b){
return indices.indexOf(a.id) - indices.indexOf(b.id)
});
classArray.push(dataAverGetResults[i].concat(dataKNNResults[i], dataLRResults[i]));
}
var classStore = [].concat.apply([], classArray);
// === Set up canvas === //
var width = 2500,
height = 125;
var colourScale;
var canvas = d3.select('#containerSelection')
.append('canvas')
.attr('width', width)
.attr('height', height);
var context = canvas.node().getContext('2d');
// === Bind data to custom elements === //
var customBase = document.createElement('custom');
var custom = d3.select(customBase); // this is our svg replacement
// settings for a grid with 40 cells in a row and 2x5 cells in a group
var groupSpacing = 60;
var cellSpacing = 2;
var cellSize = Math.floor((width - 11 * groupSpacing) / (15.2*sqrtSize)) - cellSpacing;
// === First call === //
databind(classStore, size, sqrtSize); // ...then update the databind function
var t = d3.timer(function(elapsed) {
draw();
if (elapsed > 300) t.stop();
}); // start a timer that runs the draw function for 500 ms (this needs to be higher than the transition in the databind function)
// === Bind and draw functions === //
function databind(data, size, sqrtSize) {
colourScale = d3.scaleSequential(d3.interpolatePRGn).domain([-1, 1])
var join = custom.selectAll('custom.rect')
.data(data);
var enterSel = join.enter()
.append('custom')
.attr('class', 'rect')
.attr('x', function(d, i) {
var x0 = Math.floor(i / size) % sqrtSize, x1 = Math.floor(i % sqrtSize);
return groupSpacing * x0 + (cellSpacing + cellSize) * (x1 + x0 * 10);
})
.attr('y', function(d, i) {
var y0 = Math.floor(i / data.length), y1 = Math.floor(i % size / sqrtSize);
return groupSpacing * y0 + (cellSpacing + cellSize) * (y1 + y0 * 10);
})
.attr('width', 0)
.attr('height', 0);
join
.merge(enterSel)
.transition()
.attr('width', cellSize)
.attr('height', cellSize)
.attr('fillStyle', function(d) { return colourScale(d.value); })
var exitSel = join.exit()
.transition()
.attr('width', 0)
.attr('height', 0)
.remove();
} // databind()
// === Draw canvas === //
function draw() {
// clear canvas
context.fillStyle = '#fff';
context.fillRect(0, 0, width, height);
// draw each individual custom element with their properties
var elements = custom.selectAll('custom.rect') // this is the same as the join variable, but used here to draw
elements.each(function(d,i) {
// for each virtual/custom element...
var node = d3.select(this);
context.fillStyle = node.attr('fillStyle');
context.fillRect(node.attr('x'), node.attr('y'), node.attr('width'), node.attr('height'))
});
} // draw()
},
},
mounted () {
EventBus.$on('emittedEventCallingGrid', data => { this.GetResultsAll = data; })
EventBus.$on('emittedEventCallingGrid', this.Grid)
EventBus.$on('emittedEventCallingGridSelection', data => { this.GetResultsSelection = data; })
EventBus.$on('emittedEventCallingGridSelection', this.GridSelection)
EventBus.$on('SendSelectedPointsToServerEvent', data => { this.predictSelection = data; })
EventBus.$on('SendSelectedPointsToServerEvent', this.GridSelection)
EventBus.$on('Responsive', data => {
this.responsiveWidthHeight = data})
EventBus.$on('ResponsiveandChange', data => {
this.responsiveWidthHeight = data})
// reset the views
EventBus.$on('resetViews', this.reset)
}
}
</script>
<style type="text/css">
canvas {
border: 1px dotted #ccc;
}
</style>

@ -1,408 +0,0 @@
<template>
<div id="LinePlot" style="min-height: 363px;"></div>
</template>
<script>
import * as Plotly from 'plotly.js'
import { EventBus } from '../main.js'
export default {
name: 'VotingResults',
data () {
return {
FinalResultsforLinePlot: 0,
NumberofExecutions: 0,
scoresMean: [],
scoresSTD: [],
scoresPositive: [],
scoresNegative: [],
scoresMean2: [],
scoresSTD2: [],
scoresPositive2: [],
scoresNegative2: [],
scoresMean3: [],
scoresSTD3: [],
scoresPositive3: [],
scoresNegative3: [],
scoresMean4: [],
scoresSTD4: [],
scoresPositive4: [],
scoresNegative4: [],
Stack_scoresMean: [],
Stack_scoresSTD: [],
Stack_scoresPositive: [],
Stack_scoresNegative: [],
Stack_scoresMean2: [],
Stack_scoresSTD2: [],
Stack_scoresPositive2: [],
Stack_scoresNegative2: [],
Stack_scoresMean3: [],
Stack_scoresSTD3: [],
Stack_scoresPositive3: [],
Stack_scoresNegative3: [],
Stack_scoresMean4: [],
Stack_scoresSTD4: [],
Stack_scoresPositive4: [],
Stack_scoresNegative4: [],
xaxis: [],
WH: [],
firstTime: 0
}
},
methods: {
reset () {
Plotly.purge('LinePlot')
},
LinePlotView () {
this.NumberofExecutions ++
this.xaxis.push(this.NumberofExecutions)
// Under Exploration = Current
this.scoresMean.push((JSON.parse(this.FinalResultsforLinePlot[0])*100).toFixed(2))
this.scoresSTD.push((JSON.parse(this.FinalResultsforLinePlot[1])*100).toFixed(2))
this.scoresPositive.push(parseFloat(this.scoresMean[this.scoresMean.length - 1]) + parseFloat(this.scoresSTD[this.scoresSTD.length - 1]))
this.scoresNegative.push(parseFloat(this.scoresMean[this.scoresMean.length - 1]) - parseFloat(this.scoresSTD[this.scoresSTD.length - 1]))
this.scoresMean2.push((JSON.parse(this.FinalResultsforLinePlot[4])*100).toFixed(2))
this.scoresSTD2.push((JSON.parse(this.FinalResultsforLinePlot[5])*100).toFixed(2))
this.scoresPositive2.push(parseFloat(this.scoresMean2[this.scoresMean2.length - 1]) + parseFloat(this.scoresSTD2[this.scoresSTD2.length - 1]))
this.scoresNegative2.push(parseFloat(this.scoresMean2[this.scoresMean2.length - 1]) - parseFloat(this.scoresSTD2[this.scoresSTD2.length - 1]))
this.scoresMean3.push((JSON.parse(this.FinalResultsforLinePlot[8])*100).toFixed(2))
this.scoresSTD3.push((JSON.parse(this.FinalResultsforLinePlot[9])*100).toFixed(2))
this.scoresPositive3.push(parseFloat(this.scoresMean3[this.scoresMean3.length - 1]) + parseFloat(this.scoresSTD3[this.scoresSTD3.length - 1]))
this.scoresNegative3.push(parseFloat(this.scoresMean3[this.scoresMean3.length - 1]) - parseFloat(this.scoresSTD3[this.scoresSTD3.length - 1]))
this.scoresMean4.push((JSON.parse(this.FinalResultsforLinePlot[12])*100).toFixed(2))
this.scoresSTD4.push((JSON.parse(this.FinalResultsforLinePlot[13])*100).toFixed(2))
this.scoresPositive4.push(parseFloat(this.scoresMean4[this.scoresMean4.length - 1]) + parseFloat(this.scoresSTD4[this.scoresSTD4.length - 1]))
this.scoresNegative4.push(parseFloat(this.scoresMean4[this.scoresMean4.length - 1]) - parseFloat(this.scoresSTD4[this.scoresSTD4.length - 1]))
// Stack
this.Stack_scoresMean.push((JSON.parse(this.FinalResultsforLinePlot[2])*100).toFixed(2))
this.Stack_scoresSTD.push((JSON.parse(this.FinalResultsforLinePlot[3])*100).toFixed(2))
this.Stack_scoresPositive.push(parseFloat(this.Stack_scoresMean[this.Stack_scoresMean.length - 1]) + parseFloat(this.Stack_scoresSTD[this.Stack_scoresSTD.length - 1]))
this.Stack_scoresNegative.push(parseFloat(this.Stack_scoresMean[this.Stack_scoresMean.length - 1]) - parseFloat(this.Stack_scoresSTD[this.Stack_scoresSTD.length - 1]))
this.Stack_scoresMean2.push((JSON.parse(this.FinalResultsforLinePlot[6])*100).toFixed(2))
this.Stack_scoresSTD2.push((JSON.parse(this.FinalResultsforLinePlot[7])*100).toFixed(2))
this.Stack_scoresPositive2.push(parseFloat(this.Stack_scoresMean2[this.Stack_scoresMean2.length - 1]) + parseFloat(this.Stack_scoresSTD2[this.Stack_scoresSTD2.length - 1]))
this.Stack_scoresNegative2.push(parseFloat(this.Stack_scoresMean2[this.Stack_scoresMean2.length - 1]) - parseFloat(this.Stack_scoresSTD2[this.Stack_scoresSTD2.length - 1]))
this.Stack_scoresMean3.push((JSON.parse(this.FinalResultsforLinePlot[10])*100).toFixed(2))
this.Stack_scoresSTD3.push((JSON.parse(this.FinalResultsforLinePlot[11])*100).toFixed(2))
this.Stack_scoresPositive3.push(parseFloat(this.Stack_scoresMean3[this.Stack_scoresMean3.length - 1]) + parseFloat(this.Stack_scoresSTD3[this.Stack_scoresSTD3.length - 1]))
this.Stack_scoresNegative3.push(parseFloat(this.Stack_scoresMean3[this.Stack_scoresMean3.length - 1]) - parseFloat(this.Stack_scoresSTD3[this.Stack_scoresSTD3.length - 1]))
this.Stack_scoresMean4.push((JSON.parse(this.FinalResultsforLinePlot[14])*100).toFixed(2))
this.Stack_scoresSTD4.push((JSON.parse(this.FinalResultsforLinePlot[15])*100).toFixed(2))
this.Stack_scoresPositive4.push(parseFloat(this.Stack_scoresMean4[this.Stack_scoresMean4.length - 1]) + parseFloat(this.Stack_scoresSTD4[this.Stack_scoresSTD4.length - 1]))
this.Stack_scoresNegative4.push(parseFloat(this.Stack_scoresMean4[this.Stack_scoresMean4.length - 1]) - parseFloat(this.Stack_scoresSTD4[this.Stack_scoresSTD4.length - 1]))
var xaxisReversed = []
xaxisReversed = this.xaxis.slice().reverse()
xaxisReversed = this.xaxis.concat(xaxisReversed)
// fill in 'text' array for hover
var text = this.scoresSTD.map (function(value, i) {
return `STD: +/-${value}`
})
// Current
var trace1 = {
x: this.xaxis,
y: this.scoresMean,
text: text,
line: {color: "rgb(55,126,184)"},
mode: "lines+markers",
marker : {
symbol: 'circle' },
name: "Active Accuracy",
type: "scatter"
}
var trace2 = {
x: xaxisReversed,
y: this.scoresPositive.concat(this.scoresNegative),
text: '',
hoverinfo: 'text',
fill: "tozerox",
fillcolor: "rgba(55,126,184,0)",
line: {color: "transparent"},
name: "Active Accuracy",
showlegend: false,
type: "scatter"
}
var text = this.scoresSTD2.map (function(value, i) {
return `STD: +/-${value}`
})
var trace3 = {
x: this.xaxis,
y: this.scoresMean2,
text: text,
line: {color: "rgb(55,126,184)"},
mode: "lines+markers",
marker : {
symbol: 'square' },
name: "Active Precision",
type: "scatter"
}
var trace4 = {
x: xaxisReversed,
y: this.scoresPositive2.concat(this.scoresNegative2),
text: '',
hoverinfo: 'text',
fill: "tozerox",
fillcolor: "rgba(55,126,184,0)",
line: {color: "transparent"},
name: "Active Precision",
showlegend: false,
type: "scatter"
}
var text = this.scoresSTD3.map (function(value, i) {
return `STD: +/-${value}`
})
var trace5 = {
x: this.xaxis,
y: this.scoresMean3,
text: text,
line: {color: "rgb(55,126,184)"},
mode: "lines+markers",
marker : {
symbol: 'triangle-up' },
name: "Active Recall",
type: "scatter"
}
var trace6 = {
x: xaxisReversed,
y: this.scoresPositive3.concat(this.scoresNegative3),
text: '',
hoverinfo: 'text',
fill: "tozerox",
fillcolor: "rgba(55,126,184,0)",
line: {color: "transparent"},
name: "Active Recall",
showlegend: false,
type: "scatter"
}
var text = this.scoresSTD4.map (function(value, i) {
return `STD: +/-${value}`
})
var trace7 = {
x: this.xaxis,
y: this.scoresMean4,
text: text,
line: {color: "rgb(55,126,184)"},
mode: "lines+markers",
marker : {
symbol: 'diamond' },
name: "Active F1 Score",
type: "scatter"
}
var trace8 = {
x: xaxisReversed,
y: this.scoresPositive4.concat(this.scoresNegative4),
text: '',
hoverinfo: 'text',
fill: "tozerox",
fillcolor: "rgba(55,126,184,0)",
line: {color: "transparent"},
name: "Active F1 Score",
showlegend: false,
type: "scatter"
}
// Stack
var text = this.Stack_scoresSTD.map (function(value, i) {
return `STD: +/-${value}`
})
var trace9 = {
x: this.xaxis,
y: this.Stack_scoresMean,
text: text,
line: {color: "rgb(228,26,28)"},
mode: "lines+markers",
marker : {
symbol: 'x' },
name: "Stack Accuracy",
type: "scatter"
}
var trace10 = {
x: xaxisReversed,
y: this.Stack_scoresPositive.concat(this.Stack_scoresNegative),
text: '',
hoverinfo: 'text',
fill: "tozerox",
fillcolor: "rgba(228,26,28,0)",
line: {color: "transparent"},
name: "Stack Accuracy",
showlegend: false,
type: "scatter"
}
var text = this.Stack_scoresSTD2.map (function(value, i) {
return `STD: +/-${value}`
})
var trace11 = {
x: this.xaxis,
y: this.Stack_scoresMean2,
text: text,
line: {color: "rgb(228,26,28)"},
mode: "lines+markers",
marker : {
symbol: 'cross' },
name: "Stack Precision",
type: "scatter"
}
var trace12 = {
x: xaxisReversed,
y: this.Stack_scoresPositive2.concat(this.Stack_scoresNegative2),
text: '',
hoverinfo: 'text',
fill: "tozerox",
fillcolor: "rgba(228,26,28,0)",
line: {color: "transparent"},
name: "Stack Precision",
showlegend: false,
type: "scatter"
}
var text = this.Stack_scoresSTD3.map (function(value, i) {
return `STD: +/-${value}`
})
var trace13 = {
x: this.xaxis,
y: this.Stack_scoresMean3,
text: text,
line: {color: "rgb(228,26,28)"},
mode: "lines+markers",
marker : {
symbol: 'triangle-down' },
name: "Stack Recall",
type: "scatter"
}
var trace14 = {
x: xaxisReversed,
y: this.Stack_scoresPositive3.concat(this.Stack_scoresNegative3),
text: '',
hoverinfo: 'text',
fill: "tozerox",
fillcolor: "rgba(228,26,28,0)",
line: {color: "transparent"},
name: "Stack Recall",
showlegend: false,
type: "scatter"
}
var text = this.Stack_scoresSTD4.map (function(value, i) {
return `STD: +/-${value}`
})
var trace15 = {
x: this.xaxis,
y: this.Stack_scoresMean4,
text: text,
line: {color: "rgb(228,26,28)"},
mode: "lines+markers",
marker : {
symbol: 'hexagram' },
name: "Stack F1 Score",
type: "scatter"
}
var trace16 = {
x: xaxisReversed,
y: this.Stack_scoresPositive4.concat(this.Stack_scoresNegative4),
text: '',
hoverinfo: 'text',
fill: "tozerox",
fillcolor: "rgba(228,26,28,0)",
line: {color: "transparent"},
name: "Stack F1 Score",
showlegend: false,
type: "scatter"
}
const DataforLinePlot = [trace1, trace2, trace3, trace4, trace5, trace6, trace7, trace8, trace9, trace10, trace11, trace12, trace13, trace14, trace15, trace16]
var width = this.WH[0]*3.18 // interactive visualization
var height = this.WH[1]*0.765 // interactive visualization
var layout = {
font: { family: 'Helvetica', size: 14, color: '#000000' },
paper_bgcolor: "rgb(255,255,255)",
plot_bgcolor: "rgb(229,229,229)",
xaxis: {
gridcolor: "rgb(255,255,255)",
title: 'Step of the Execution',
tickformat: '.0f',
range: [0, this.scoresMean.length + 2],
showgrid: true,
showline: false,
showticklabels: true,
tickcolor: "rgb(127,127,127)",
ticks: "outside",
zeroline: false
},
yaxis: {
gridcolor: "rgb(255,255,255)",
title: '# Performance (%) #',
showgrid: true,
showline: false,
showticklabels: true,
tickcolor: "rgb(127,127,127)",
ticks: "outside",
zeroline: false
},
autosize: false,
width: width,
height: height,
margin: {
l: 50,
r: 0,
b: 50,
t: 5,
pad: 0
},
}
var config = {displayModeBar: false, scrollZoom: true, displaylogo: false, showLink: false, showSendToCloud: false, modeBarButtonsToRemove: ['toImage'], responsive: true}
Plotly.newPlot('LinePlot', DataforLinePlot, layout, config)
if (this.firstTime == 0) {
EventBus.$emit('emittedEventCallingReally')
this.firstTime = 1
}
}
},
mounted() {
EventBus.$on('updateFlagForFinalResults', data => { this.firstTime = data})
EventBus.$on('emittedEventCallingLinePlot', data => {
this.FinalResultsforLinePlot = data})
EventBus.$on('emittedEventCallingLinePlot', this.LinePlotView)
EventBus.$on('Responsive', data => {
this.WH = data})
EventBus.$on('ResponsiveandChange', data => {
this.WH = data})
// reset the views
EventBus.$on('resetViews', this.reset)
}
}
</script>

946
run.py

@ -14,17 +14,10 @@ import multiprocessing
from joblib import Memory
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from bayes_opt import BayesianOptimization
from sklearn.model_selection import cross_validate
from sklearn.model_selection import cross_val_predict
from sklearn.metrics import matthews_corrcoef
from sklearn.metrics import log_loss
from imblearn.metrics import geometric_mean_score
from sklearn.manifold import MDS
from sklearn.manifold import TSNE
import umap
# this block of code is for the connection between the server, the database, and the client (plus routing)
@ -62,9 +55,6 @@ def reset():
global KNNModelsCount
global LRModelsCount
global factors
factors = [1,1,1,1,0,0,0,0]
global keyData
keyData = 0
@ -111,7 +101,7 @@ def reset():
all_classifiers = []
global crossValidation
crossValidation = 5
crossValidation = 10
# models
global KNNModels
@ -446,917 +436,37 @@ def dataSetSelection():
yDataStored = yData.copy()
warnings.simplefilter('ignore')
return 'Everything is okay'
# Retrieve data from client
@cross_origin(origin='localhost',headers=['Content-Type','Authorization'])
@app.route('/data/factors', methods=["GET", "POST"])
def RetrieveFactors():
global factors
global allParametersPerformancePerModel
Factors = request.get_data().decode('utf8').replace("'", '"')
FactorsInt = json.loads(Factors)
factors = FactorsInt['Factors']
return 'Everything Okay'
# Initialize every model for each algorithm
@cross_origin(origin='localhost',headers=['Content-Type','Authorization'])
@app.route('/data/ServerRequestSelParameters', methods=["GET", "POST"])
def retrieveModel():
# get the models from the frontend
RetrievedModel = request.get_data().decode('utf8').replace("'", '"')
RetrievedModel = json.loads(RetrievedModel)
global algorithms
algorithms = RetrievedModel['Algorithms']
global XData
global yData
global LRModelsCount
# loop through the algorithms
global allParametersPerformancePerModel
global HistoryPreservation
for eachAlgor in algorithms:
if (eachAlgor) == 'KNN':
clf = KNeighborsClassifier()
params = {'n_neighbors': list(range(1, 100)), 'metric': ['chebyshev', 'manhattan', 'euclidean', 'minkowski'], 'algorithm': ['brute', 'kd_tree', 'ball_tree'], 'weights': ['uniform', 'distance']}
AlgorithmsIDsEnd = KNNModelsCount
else:
clf = LogisticRegression(random_state=RANDOM_SEED)
params = {'C': list(np.arange(1,100,1)), 'max_iter': list(np.arange(50,500,50)), 'solver': ['lbfgs', 'newton-cg', 'sag', 'saga'], 'penalty': ['l2', 'none']}
AlgorithmsIDsEnd = LRModelsCount
allParametersPerformancePerModel = randomSearch(XData, yData, clf, params, eachAlgor, AlgorithmsIDsEnd)
HistoryPreservation = allParametersPerformancePerModel.copy()
# call the function that sends the results to the frontend
executeModel()
return 'Everything is okay'
return 'Everything Okay'
def create_global_function():
global estimator
def estimator(C, gamma):
# initialize model
model = SVC(C=C, gamma=gamma, degree=1, random_state=RANDOM_SEED)
# set in cross-validation
result = cross_validate(model, XData, yData, cv=crossValidation)
# result is mean of test_score
return np.mean(result['test_score'])
location = './cachedir'
memory = Memory(location, verbose=0)
@memory.cache
def randomSearch(XData, yData, clf, params, eachAlgor, AlgorithmsIDsEnd):
search = RandomizedSearchCV(
estimator=clf, param_distributions=params, n_iter=100,
cv=crossValidation, refit='accuracy', scoring=scoring,
verbose=0, n_jobs=-1)
# fit and extract the probabilities
search.fit(XData, yData)
# process the results
cv_results = []
cv_results.append(search.cv_results_)
df_cv_results = pd.DataFrame.from_dict(cv_results)
# number of models stored
number_of_models = len(df_cv_results.iloc[0][0])
# initialize results per row
df_cv_results_per_row = []
# loop through number of models
modelsIDs = []
for i in range(number_of_models):
number = AlgorithmsIDsEnd+i
modelsIDs.append(eachAlgor+str(number))
# initialize results per item
df_cv_results_per_item = []
for column in df_cv_results.iloc[0]:
df_cv_results_per_item.append(column[i])
df_cv_results_per_row.append(df_cv_results_per_item)
# store the results into a pandas dataframe
df_cv_results_classifiers = pd.DataFrame(data = df_cv_results_per_row, columns= df_cv_results.columns)
# copy and filter in order to get only the metrics
metrics = df_cv_results_classifiers.copy()
metrics = metrics.filter(['mean_test_accuracy','mean_test_precision_weighted','mean_test_recall_weighted','mean_test_f1_weighted','mean_test_roc_auc_ovo_weighted'])
# concat parameters and performance
parametersPerformancePerModel = pd.DataFrame(df_cv_results_classifiers['params'])
parametersLocal = parametersPerformancePerModel['params'].copy()
Models = []
for index, items in enumerate(parametersLocal):
Models.append(index)
parametersLocalNew = [ parametersLocal[your_key] for your_key in Models ]
perModelProb = []
resultsWeighted = []
resultsCorrCoef = []
resultsLogLoss = []
resultsLogLossFinal = []
# influence calculation for all the instances
inputs = range(len(XData))
num_cores = multiprocessing.cpu_count()
for eachModelParameters in parametersLocalNew:
clf.set_params(**eachModelParameters)
clf.fit(XData, yData)
yPredict = clf.predict(XData)
yPredict = np.nan_to_num(yPredict)
yPredictProb = cross_val_predict(clf, XData, yData, cv=crossValidation, method='predict_proba')
yPredictProb = np.nan_to_num(yPredictProb)
perModelProb.append(yPredictProb.tolist())
resultsWeighted.append(geometric_mean_score(yData, yPredict, average='weighted'))
resultsCorrCoef.append(matthews_corrcoef(yData, yPredict))
resultsLogLoss.append(log_loss(yData, yPredictProb, normalize=True))
maxLog = max(resultsLogLoss)
minLog = min(resultsLogLoss)
for each in resultsLogLoss:
resultsLogLossFinal.append((each-minLog)/(maxLog-minLog))
metrics.insert(5,'geometric_mean_score_weighted',resultsWeighted)
metrics.insert(6,'matthews_corrcoef',resultsCorrCoef)
metrics.insert(7,'log_loss',resultsLogLossFinal)
perModelProbPandas = pd.DataFrame(perModelProb)
results.append(modelsIDs)
results.append(parametersPerformancePerModel)
results.append(metrics)
results.append(perModelProbPandas)
return results
def PreprocessingIDs():
dicKNN = allParametersPerformancePerModel[0]
dicLR = allParametersPerformancePerModel[4]
df_concatIDs = dicKNN + dicLR
return df_concatIDs
def executeModel():
def PreprocessingMetrics():
dicKNN = allParametersPerformancePerModel[2]
dicLR = allParametersPerformancePerModel[6]
create_global_function()
global estimator
dfKNN = pd.DataFrame.from_dict(dicKNN)
dfLR = pd.DataFrame.from_dict(dicLR)
params = {"C": (0.0001, 10000), "gamma": (0.0001, 10000)}
svc_bayesopt = BayesianOptimization(estimator, params)
svc_bayesopt.maximize(init_points=5, n_iter=20, acq='ucb')
bestParams = svc_bayesopt.max['params']
estimator = SVC(C=bestParams.get('C'), gamma=bestParams.get('gamma'), probability=True)
estimator.fit(XData, yData)
yPredict = estimator.predict(XData)
yPredictProb = cross_val_predict(estimator, XData, yData, cv=crossValidation, method='predict_proba')
df_concatMetrics = pd.concat([dfKNN, dfLR])
df_concatMetrics = df_concatMetrics.reset_index(drop=True)
return df_concatMetrics
def PreprocessingPred():
dicKNN = allParametersPerformancePerModel[3]
dicLR = allParametersPerformancePerModel[7]
dfKNN = pd.DataFrame.from_dict(dicKNN)
dfLR = pd.DataFrame.from_dict(dicLR)
df_concatProbs = pd.concat([dfKNN, dfLR])
df_concatProbs.reset_index(drop=True, inplace=True)
predictionsKNN = []
for column, content in dfKNN.items():
el = [sum(x)/len(x) for x in zip(*content)]
predictionsKNN.append(el)
predictionsLR = []
for column, content in dfLR.items():
el = [sum(x)/len(x) for x in zip(*content)]
predictionsLR.append(el)
predictions = []
for column, content in df_concatProbs.items():
el = [sum(x)/len(x) for x in zip(*content)]
predictions.append(el)
return [predictionsKNN, predictionsLR, predictions]
def PreprocessingParam():
dicKNN = allParametersPerformancePerModel[1]
dicLR = allParametersPerformancePerModel[5]
dicKNN = dicKNN['params']
dicLR = dicLR['params']
dicKNN = {int(k):v for k,v in dicKNN.items()}
dicLR = {int(k):v for k,v in dicLR.items()}
dfKNN = pd.DataFrame.from_dict(dicKNN)
dfLR = pd.DataFrame.from_dict(dicLR)
dfKNN = dfKNN.T
dfLR = dfLR.T
df_params = pd.concat([dfKNN, dfLR])
return df_params
def PreprocessingParamSep():
dicKNN = allParametersPerformancePerModel[1]
dicLR = allParametersPerformancePerModel[5]
dicKNN = dicKNN['params']
dicLR = dicLR['params']
dicKNN = {int(k):v for k,v in dicKNN.items()}
dicLR = {int(k):v for k,v in dicLR.items()}
dfKNN = pd.DataFrame.from_dict(dicKNN)
dfLR = pd.DataFrame.from_dict(dicLR)
dfKNN = dfKNN.T
dfLR = dfLR.T
return [dfKNN, dfLR]
# remove that maybe!
def preProcsumPerMetric(factors):
sumPerClassifier = []
loopThroughMetrics = PreprocessingMetrics()
loopThroughMetrics = loopThroughMetrics.fillna(0)
loopThroughMetrics.loc[:, 'log_loss'] = 1 - loopThroughMetrics.loc[:, 'log_loss']
for row in loopThroughMetrics.iterrows():
rowSum = 0
name, values = row
for loop, elements in enumerate(values):
rowSum = elements*factors[loop] + rowSum
if sum(factors) is 0:
sumPerClassifier = 0
else:
sumPerClassifier.append(rowSum/sum(factors) * 100)
return sumPerClassifier
def preProcMetricsAllAndSel():
loopThroughMetrics = PreprocessingMetrics()
loopThroughMetrics = loopThroughMetrics.fillna(0)
global factors
metricsPerModelColl = []
metricsPerModelColl.append(loopThroughMetrics['mean_test_accuracy'])
metricsPerModelColl.append(loopThroughMetrics['geometric_mean_score_weighted'])
metricsPerModelColl.append(loopThroughMetrics['mean_test_precision_weighted'])
metricsPerModelColl.append(loopThroughMetrics['mean_test_recall_weighted'])
metricsPerModelColl.append(loopThroughMetrics['mean_test_f1_weighted'])
metricsPerModelColl.append(loopThroughMetrics['matthews_corrcoef'])
metricsPerModelColl.append(loopThroughMetrics['mean_test_roc_auc_ovo_weighted'])
metricsPerModelColl.append(loopThroughMetrics['log_loss'])
f=lambda a: (abs(a)+a)/2
for index, metric in enumerate(metricsPerModelColl):
if (index == 5):
metricsPerModelColl[index] = ((f(metric))*factors[index]) * 100
elif (index == 7):
metricsPerModelColl[index] = ((1 - metric)*factors[index] ) * 100
else:
metricsPerModelColl[index] = (metric*factors[index]) * 100
metricsPerModelColl[index] = metricsPerModelColl[index].to_json()
return metricsPerModelColl
def FunMDS (data):
mds = MDS(n_components=2, random_state=RANDOM_SEED)
XTransformed = mds.fit_transform(data).T
XTransformed = XTransformed.tolist()
return XTransformed
def FunTsne (data):
tsne = TSNE(n_components=2, random_state=RANDOM_SEED).fit_transform(data)
tsne.shape
return tsne
def FunUMAP (data):
trans = umap.UMAP(n_neighbors=15, random_state=RANDOM_SEED).fit(data)
Xpos = trans.embedding_[:, 0].tolist()
Ypos = trans.embedding_[:, 1].tolist()
return [Xpos,Ypos]
# Sending the overview classifiers' results to be visualized as a scatterplot
@app.route('/data/PlotClassifiers', methods=["GET", "POST"])
def SendToPlot():
while (len(DataResultsRaw) != DataRawLength):
pass
InitializeEnsemble()
response = {
'OverviewResults': Results
}
return jsonify(response)
def InitializeEnsemble():
XModels = PreprocessingMetrics()
global ModelSpaceMDS
global ModelSpaceTSNE
global allParametersPerformancePerModel
XModels = XModels.fillna(0)
ModelSpaceMDS = FunMDS(XModels)
ModelSpaceTSNE = FunTsne(XModels)
ModelSpaceTSNE = ModelSpaceTSNE.tolist()
ModelSpaceUMAP = FunUMAP(XModels)
PredictionProbSel = PreprocessingPred()
returnResults(ModelSpaceMDS,ModelSpaceTSNE,ModelSpaceUMAP,PredictionProbSel)
def returnResults(ModelSpaceMDS,ModelSpaceTSNE,ModelSpaceUMAP,PredictionProbSel):
global Results
global AllTargets
Results = []
parametersGen = PreprocessingParam()
metricsPerModel = preProcMetricsAllAndSel()
sumPerClassifier = preProcsumPerMetric(factors)
ModelsIDs = PreprocessingIDs()
parametersGenPD = parametersGen.to_json(orient='records')
XDataJSONEntireSet = XData.to_json(orient='records')
XDataColumns = XData.columns.tolist()
Results.append(json.dumps(ModelsIDs))
Results.append(json.dumps(sumPerClassifier))
Results.append(json.dumps(parametersGenPD))
Results.append(json.dumps(metricsPerModel))
Results.append(json.dumps(XDataJSONEntireSet))
Results.append(json.dumps(XDataColumns))
Results.append(json.dumps(yData))
Results.append(json.dumps(target_names))
Results.append(json.dumps(AllTargets))
Results.append(json.dumps(ModelSpaceMDS))
Results.append(json.dumps(ModelSpaceTSNE))
Results.append(json.dumps(ModelSpaceUMAP))
Results.append(json.dumps(PredictionProbSel))
return Results
# Initialize crossover and mutation processes
@cross_origin(origin='localhost',headers=['Content-Type','Authorization'])
@app.route('/data/CrossoverMutation', methods=["GET", "POST"])
def CrossoverMutateFun():
# get the models from the frontend
RemainingIds = request.get_data().decode('utf8').replace("'", '"')
RemainingIds = json.loads(RemainingIds)
RemainingIds = RemainingIds['RemainingPoints']
global XData
global yData
global LRModelsCount
# loop through the algorithms
global allParametersPerfCrossMutr
global HistoryPreservation
global allParametersPerformancePerModel
KNNIDs = list(filter(lambda k: 'KNN' in k, RemainingIds))
LRIDs = list(filter(lambda k: 'LR' in k, RemainingIds))
countKNN = 0
countLR = 0
setMaxLoopValue = 50
paramAllAlgs = PreprocessingParam()
KNNIntIndex = []
LRIntIndex = []
localCrossMutr = []
allParametersPerfCrossMutrKNNC = []
while countKNN < setMaxLoopValue:
for dr in KNNIDs:
KNNIntIndex.append(int(re.findall('\d+', dr)[0]))
KNNPickPair = random.sample(KNNIntIndex,2)
pairDF = paramAllAlgs.iloc[KNNPickPair]
crossoverDF = pd.DataFrame()
for column in pairDF:
listData = []
randomZeroOne = random.randint(0, 1)
valuePerColumn = pairDF[column].iloc[randomZeroOne]
listData.append(valuePerColumn)
crossoverDF[column] = listData
if (((paramAllAlgs['algorithm'] == crossoverDF['algorithm'].iloc[0]) & (paramAllAlgs['metric'] == crossoverDF['metric'].iloc[0]) & (paramAllAlgs['n_neighbors'] == crossoverDF['n_neighbors'].iloc[0]) & (paramAllAlgs['weights'] == crossoverDF['weights'].iloc[0])).any()):
crossoverDF = pd.DataFrame()
else:
clf = KNeighborsClassifier()
params = {'n_neighbors': [crossoverDF['n_neighbors'].iloc[0]], 'metric': [crossoverDF['metric'].iloc[0]], 'algorithm': [crossoverDF['algorithm'].iloc[0]], 'weights': [crossoverDF['weights'].iloc[0]]}
AlgorithmsIDsEnd = 200 + countKNN
localCrossMutr = crossoverMutation(XData, yData, clf, params, 'KNN', AlgorithmsIDsEnd)
countKNN += 1
crossoverDF = pd.DataFrame()
for loop in range(setMaxLoopValue - 1):
localCrossMutr[0] = localCrossMutr[0] + localCrossMutr[(loop+1)*4]
localCrossMutr[1] = pd.concat([localCrossMutr[1], localCrossMutr[(loop+1)*4+1]], ignore_index=True)
localCrossMutr[2] = pd.concat([localCrossMutr[2], localCrossMutr[(loop+1)*4+2]], ignore_index=True)
localCrossMutr[3] = pd.concat([localCrossMutr[3], localCrossMutr[(loop+1)*4+3]], ignore_index=True)
allParametersPerfCrossMutrKNNC.append(localCrossMutr[0])
allParametersPerfCrossMutrKNNC.append(localCrossMutr[1])
allParametersPerfCrossMutrKNNC.append(localCrossMutr[2])
allParametersPerfCrossMutrKNNC.append(localCrossMutr[3])
HistoryPreservation = HistoryPreservation + allParametersPerfCrossMutrKNNC
countKNN = 0
KNNIntIndex = []
localCrossMutr.clear()
allParametersPerfCrossMutrKNNM = []
while countKNN < setMaxLoopValue:
for dr in KNNIDs:
KNNIntIndex.append(int(re.findall('\d+', dr)[0]))
KNNPickPair = random.sample(KNNIntIndex,1)
pairDF = paramAllAlgs.iloc[KNNPickPair]
crossoverDF = pd.DataFrame()
for column in pairDF:
listData = []
if (column == 'n_neighbors'):
randomNumber = random.randint(101, math.floor(((len(yData)/crossValidation)*(crossValidation-1)))-1)
listData.append(randomNumber)
crossoverDF[column] = listData
else:
valuePerColumn = pairDF[column].iloc[0]
listData.append(valuePerColumn)
crossoverDF[column] = listData
if (((paramAllAlgs['algorithm'] == crossoverDF['algorithm'].iloc[0]) & (paramAllAlgs['metric'] == crossoverDF['metric'].iloc[0]) & (paramAllAlgs['n_neighbors'] == crossoverDF['n_neighbors'].iloc[0]) & (paramAllAlgs['weights'] == crossoverDF['weights'].iloc[0])).any()):
crossoverDF = pd.DataFrame()
else:
clf = KNeighborsClassifier()
params = {'n_neighbors': [crossoverDF['n_neighbors'].iloc[0]], 'metric': [crossoverDF['metric'].iloc[0]], 'algorithm': [crossoverDF['algorithm'].iloc[0]], 'weights': [crossoverDF['weights'].iloc[0]]}
AlgorithmsIDsEnd = 250 + countKNN
localCrossMutr = crossoverMutation(XData, yData, clf, params, 'KNN', AlgorithmsIDsEnd)
countKNN += 1
crossoverDF = pd.DataFrame()
for loop in range(setMaxLoopValue - 1):
localCrossMutr[0] = localCrossMutr[0] + localCrossMutr[(loop+1)*4]
localCrossMutr[1] = pd.concat([localCrossMutr[1], localCrossMutr[(loop+1)*4+1]], ignore_index=True)
localCrossMutr[2] = pd.concat([localCrossMutr[2], localCrossMutr[(loop+1)*4+2]], ignore_index=True)
localCrossMutr[3] = pd.concat([localCrossMutr[3], localCrossMutr[(loop+1)*4+3]], ignore_index=True)
allParametersPerfCrossMutrKNNM.append(localCrossMutr[0])
allParametersPerfCrossMutrKNNM.append(localCrossMutr[1])
allParametersPerfCrossMutrKNNM.append(localCrossMutr[2])
allParametersPerfCrossMutrKNNM.append(localCrossMutr[3])
HistoryPreservation = HistoryPreservation + allParametersPerfCrossMutrKNNM
localCrossMutr.clear()
allParametersPerfCrossMutrLRC = []
while countLR < setMaxLoopValue:
for dr in LRIDs:
LRIntIndex.append(int(re.findall('\d+', dr)[0]))
LRPickPair = random.sample(LRIntIndex,2)
pairDF = paramAllAlgs.iloc[LRPickPair]
crossoverDF = pd.DataFrame()
for column in pairDF:
listData = []
randomZeroOne = random.randint(0, 1)
valuePerColumn = pairDF[column].iloc[randomZeroOne]
listData.append(valuePerColumn)
crossoverDF[column] = listData
if (((paramAllAlgs['C'] == crossoverDF['C'].iloc[0]) & (paramAllAlgs['max_iter'] == crossoverDF['max_iter'].iloc[0]) & (paramAllAlgs['solver'] == crossoverDF['solver'].iloc[0]) & (paramAllAlgs['penalty'] == crossoverDF['penalty'].iloc[0])).any()):
crossoverDF = pd.DataFrame()
else:
clf = LogisticRegression(random_state=RANDOM_SEED)
params = {'C': [crossoverDF['C'].iloc[0]], 'max_iter': [crossoverDF['max_iter'].iloc[0]], 'solver': [crossoverDF['solver'].iloc[0]], 'penalty': [crossoverDF['penalty'].iloc[0]]}
AlgorithmsIDsEnd = 300 + countLR
localCrossMutr = crossoverMutation(XData, yData, clf, params, 'LR', AlgorithmsIDsEnd)
countLR += 1
crossoverDF = pd.DataFrame()
for loop in range(setMaxLoopValue - 1):
localCrossMutr[0] = localCrossMutr[0] + localCrossMutr[(loop+1)*4]
localCrossMutr[1] = pd.concat([localCrossMutr[1], localCrossMutr[(loop+1)*4+1]], ignore_index=True)
localCrossMutr[2] = pd.concat([localCrossMutr[2], localCrossMutr[(loop+1)*4+2]], ignore_index=True)
localCrossMutr[3] = pd.concat([localCrossMutr[3], localCrossMutr[(loop+1)*4+3]], ignore_index=True)
allParametersPerfCrossMutrLRC.append(localCrossMutr[0])
allParametersPerfCrossMutrLRC.append(localCrossMutr[1])
allParametersPerfCrossMutrLRC.append(localCrossMutr[2])
allParametersPerfCrossMutrLRC.append(localCrossMutr[3])
HistoryPreservation = HistoryPreservation + allParametersPerfCrossMutrLRC
countLR = 0
LRIntIndex = []
localCrossMutr.clear()
allParametersPerfCrossMutrLRM = []
while countLR < setMaxLoopValue:
for dr in LRIDs:
LRIntIndex.append(int(re.findall('\d+', dr)[0]))
LRPickPair = random.sample(LRIntIndex,1)
pairDF = paramAllAlgs.iloc[LRPickPair]
crossoverDF = pd.DataFrame()
for column in pairDF:
listData = []
if (column == 'C'):
randomNumber = random.randint(101, 1000)
listData.append(randomNumber)
crossoverDF[column] = listData
else:
valuePerColumn = pairDF[column].iloc[0]
listData.append(valuePerColumn)
crossoverDF[column] = listData
if (((paramAllAlgs['C'] == crossoverDF['C'].iloc[0]) & (paramAllAlgs['max_iter'] == crossoverDF['max_iter'].iloc[0]) & (paramAllAlgs['solver'] == crossoverDF['solver'].iloc[0]) & (paramAllAlgs['penalty'] == crossoverDF['penalty'].iloc[0])).any()):
crossoverDF = pd.DataFrame()
else:
clf = LogisticRegression(random_state=RANDOM_SEED)
params = {'C': [crossoverDF['C'].iloc[0]], 'max_iter': [crossoverDF['max_iter'].iloc[0]], 'solver': [crossoverDF['solver'].iloc[0]], 'penalty': [crossoverDF['penalty'].iloc[0]]}
AlgorithmsIDsEnd = 350 + countLR
localCrossMutr = crossoverMutation(XData, yData, clf, params, 'LR', AlgorithmsIDsEnd)
countLR += 1
crossoverDF = pd.DataFrame()
for loop in range(setMaxLoopValue - 1):
localCrossMutr[0] = localCrossMutr[0] + localCrossMutr[(loop+1)*4]
localCrossMutr[1] = pd.concat([localCrossMutr[1], localCrossMutr[(loop+1)*4+1]], ignore_index=True)
localCrossMutr[2] = pd.concat([localCrossMutr[2], localCrossMutr[(loop+1)*4+2]], ignore_index=True)
localCrossMutr[3] = pd.concat([localCrossMutr[3], localCrossMutr[(loop+1)*4+3]], ignore_index=True)
allParametersPerfCrossMutrLRM.append(localCrossMutr[0])
allParametersPerfCrossMutrLRM.append(localCrossMutr[1])
allParametersPerfCrossMutrLRM.append(localCrossMutr[2])
allParametersPerfCrossMutrLRM.append(localCrossMutr[3])
HistoryPreservation = HistoryPreservation + allParametersPerfCrossMutrLRM
allParametersPerfCrossMutr = allParametersPerfCrossMutrKNNC + allParametersPerfCrossMutrKNNM + allParametersPerfCrossMutrLRC + allParametersPerfCrossMutrLRM
KNNIntIndex = []
for dr in KNNIDs:
KNNIntIndex.append(int(re.findall('\d+', dr)[0]))
allParametersPerformancePerModel[0] = [j for i, j in enumerate(allParametersPerformancePerModel[0]) if i not in KNNIntIndex]
allParametersPerformancePerModel[1].drop(allParametersPerformancePerModel[1].index[KNNIntIndex], inplace=True)
allParametersPerformancePerModel[2].drop(allParametersPerformancePerModel[2].index[KNNIntIndex], inplace=True)
allParametersPerformancePerModel[3].drop(allParametersPerformancePerModel[3].index[KNNIntIndex], inplace=True)
LRIntIndex = []
for dr in LRIDs:
LRIntIndex.append(int(re.findall('\d+', dr)[0]) - 100)
allParametersPerformancePerModel[4] = [j for i, j in enumerate(allParametersPerformancePerModel[4]) if i not in LRIntIndex]
allParametersPerformancePerModel[5].drop(allParametersPerformancePerModel[5].index[LRIntIndex], inplace=True)
allParametersPerformancePerModel[6].drop(allParametersPerformancePerModel[6].index[LRIntIndex], inplace=True)
allParametersPerformancePerModel[7].drop(allParametersPerformancePerModel[7].index[LRIntIndex], inplace=True)
return 'Everything Okay'
def crossoverMutation(XData, yData, clf, params, eachAlgor, AlgorithmsIDsEnd):
search = GridSearchCV(
estimator=clf, param_grid=params, cv=crossValidation, refit='accuracy',
scoring=scoring, verbose=0, n_jobs=-1)
# fit and extract the probabilities
search.fit(XData, yData)
# process the results
cv_results = []
cv_results.append(search.cv_results_)
df_cv_results = pd.DataFrame.from_dict(cv_results)
# number of models stored
number_of_models = len(df_cv_results.iloc[0][0])
# initialize results per row
df_cv_results_per_row = []
# loop through number of models
modelsIDs = []
for i in range(number_of_models):
number = AlgorithmsIDsEnd+i
modelsIDs.append(eachAlgor+str(number))
# initialize results per item
df_cv_results_per_item = []
for column in df_cv_results.iloc[0]:
df_cv_results_per_item.append(column[i])
df_cv_results_per_row.append(df_cv_results_per_item)
# store the results into a pandas dataframe
df_cv_results_classifiers = pd.DataFrame(data = df_cv_results_per_row, columns= df_cv_results.columns)
# copy and filter in order to get only the metrics
metrics = df_cv_results_classifiers.copy()
metrics = metrics.filter(['mean_test_accuracy','mean_test_precision_weighted','mean_test_recall_weighted','mean_test_f1_weighted','mean_test_roc_auc_ovo_weighted'])
# concat parameters and performance
parametersPerformancePerModel = pd.DataFrame(df_cv_results_classifiers['params'])
parametersLocal = parametersPerformancePerModel['params'].copy()
Models = []
for index, items in enumerate(parametersLocal):
Models.append(index)
parametersLocalNew = [ parametersLocal[your_key] for your_key in Models ]
perModelProb = []
resultsWeighted = []
resultsCorrCoef = []
resultsLogLoss = []
resultsLogLossFinal = []
# influence calculation for all the instances
inputs = range(len(XData))
num_cores = multiprocessing.cpu_count()
for eachModelParameters in parametersLocalNew:
clf.set_params(**eachModelParameters)
clf.fit(XData, yData)
yPredict = clf.predict(XData)
yPredict = np.nan_to_num(yPredict)
yPredictProb = cross_val_predict(clf, XData, yData, cv=crossValidation, method='predict_proba')
yPredictProb = np.nan_to_num(yPredictProb)
perModelProb.append(yPredictProb.tolist())
resultsWeighted.append(geometric_mean_score(yData, yPredict, average='weighted'))
resultsCorrCoef.append(matthews_corrcoef(yData, yPredict))
resultsLogLoss.append(log_loss(yData, yPredictProb, normalize=True))
maxLog = max(resultsLogLoss)
minLog = min(resultsLogLoss)
for each in resultsLogLoss:
resultsLogLossFinal.append((each-minLog)/(maxLog-minLog))
metrics.insert(5,'geometric_mean_score_weighted',resultsWeighted)
metrics.insert(6,'matthews_corrcoef',resultsCorrCoef)
metrics.insert(7,'log_loss',resultsLogLossFinal)
perModelProbPandas = pd.DataFrame(perModelProb)
results.append(modelsIDs)
results.append(parametersPerformancePerModel)
results.append(metrics)
results.append(perModelProbPandas)
return results
def PreprocessingIDsCM():
dicKNNC = allParametersPerfCrossMutr[0]
dicKNNM = allParametersPerfCrossMutr[4]
dicLRC = allParametersPerfCrossMutr[8]
dicLRM = allParametersPerfCrossMutr[12]
df_concatIDs = dicKNNC + dicKNNM + dicLRC + dicLRM
return df_concatIDs
def PreprocessingMetricsCM():
dicKNNC = allParametersPerfCrossMutr[2]
dicKNNM = allParametersPerfCrossMutr[6]
dicLRC = allParametersPerfCrossMutr[10]
dicLRM = allParametersPerfCrossMutr[14]
dfKNNC = pd.DataFrame.from_dict(dicKNNC)
dfKNNM = pd.DataFrame.from_dict(dicKNNM)
dfLRC = pd.DataFrame.from_dict(dicLRC)
dfLRM = pd.DataFrame.from_dict(dicLRM)
df_concatMetrics = pd.concat([dfKNNC, dfKNNM, dfLRC, dfLRM])
df_concatMetrics = df_concatMetrics.reset_index(drop=True)
return df_concatMetrics
def PreprocessingPredCM():
dicKNNC = allParametersPerfCrossMutr[3]
dicKNNM = allParametersPerfCrossMutr[7]
dicLRC = allParametersPerfCrossMutr[11]
dicLRM = allParametersPerfCrossMutr[15]
dfKNNC = pd.DataFrame.from_dict(dicKNNC)
dfKNNM = pd.DataFrame.from_dict(dicKNNM)
dfLRC = pd.DataFrame.from_dict(dicLRC)
dfLRM = pd.DataFrame.from_dict(dicLRM)
df_concatProbs = pd.concat([dfKNNC, dfKNNM, dfLRC, dfLRM])
predictions = []
for column, content in df_concatProbs.items():
el = [sum(x)/len(x) for x in zip(*content)]
predictions.append(el)
return predictions
def PreprocessingParamCM():
dicKNNC = allParametersPerfCrossMutr[1]
dicKNNM = allParametersPerfCrossMutr[5]
dicLRC = allParametersPerfCrossMutr[9]
dicLRM = allParametersPerfCrossMutr[13]
dicKNNC = dicKNNC['params']
dicKNNM = dicKNNM['params']
dicLRC = dicLRC['params']
dicLRM = dicLRM['params']
dicKNNC = {int(k):v for k,v in dicKNNC.items()}
dicKNNM = {int(k):v for k,v in dicKNNM.items()}
dicLRC = {int(k):v for k,v in dicLRC.items()}
dicLRM = {int(k):v for k,v in dicLRM.items()}
dfKNNC = pd.DataFrame.from_dict(dicKNNC)
dfKNNM = pd.DataFrame.from_dict(dicKNNM)
dfLRC = pd.DataFrame.from_dict(dicLRC)
dfLRM = pd.DataFrame.from_dict(dicLRM)
dfKNNC = dfKNNC.T
dfKNNM = dfKNNM.T
dfLRC = dfLRC.T
dfLRM = dfLRM.T
df_params = pd.concat([dfKNNC, dfKNNM, dfLRC, dfLRM])
return df_params
def PreprocessingParamSepCM():
dicKNNC = allParametersPerfCrossMutr[1]
dicKNNM = allParametersPerfCrossMutr[5]
dicLRC = allParametersPerfCrossMutr[9]
dicLRM = allParametersPerfCrossMutr[13]
dicKNNC = dicKNNC['params']
dicKNNM = dicKNNM['params']
dicLRC = dicLRC['params']
dicLRM = dicLRM['params']
dicKNNC = {int(k):v for k,v in dicKNNC.items()}
dicKNNM = {int(k):v for k,v in dicKNNM.items()}
dicLRC = {int(k):v for k,v in dicLRC.items()}
dicLRM = {int(k):v for k,v in dicLRM.items()}
dfKNNC = pd.DataFrame.from_dict(dicKNNC)
dfKNNM = pd.DataFrame.from_dict(dicKNNM)
dfLRC = pd.DataFrame.from_dict(dicLRC)
dfLRM = pd.DataFrame.from_dict(dicLRM)
dfKNNC = dfKNNC.T
dfKNNM = dfKNNM.T
dfLRC = dfLRC.T
dfLRM = dfLRM.T
return [dfKNNC, dfKNNM, dfLRC, dfLRM]
# remove that maybe!
def preProcsumPerMetricCM(factors):
sumPerClassifier = []
loopThroughMetrics = PreprocessingMetricsCM()
loopThroughMetrics = loopThroughMetrics.fillna(0)
loopThroughMetrics.loc[:, 'log_loss'] = 1 - loopThroughMetrics.loc[:, 'log_loss']
for row in loopThroughMetrics.iterrows():
rowSum = 0
name, values = row
for loop, elements in enumerate(values):
rowSum = elements*factors[loop] + rowSum
if sum(factors) is 0:
sumPerClassifier = 0
else:
sumPerClassifier.append(rowSum/sum(factors) * 100)
return sumPerClassifier
def preProcMetricsAllAndSelCM():
loopThroughMetrics = PreprocessingMetricsCM()
loopThroughMetrics = loopThroughMetrics.fillna(0)
global factors
metricsPerModelColl = []
metricsPerModelColl.append(loopThroughMetrics['mean_test_accuracy'])
metricsPerModelColl.append(loopThroughMetrics['geometric_mean_score_weighted'])
metricsPerModelColl.append(loopThroughMetrics['mean_test_precision_weighted'])
metricsPerModelColl.append(loopThroughMetrics['mean_test_recall_weighted'])
metricsPerModelColl.append(loopThroughMetrics['mean_test_f1_weighted'])
metricsPerModelColl.append(loopThroughMetrics['matthews_corrcoef'])
metricsPerModelColl.append(loopThroughMetrics['mean_test_roc_auc_ovo_weighted'])
metricsPerModelColl.append(loopThroughMetrics['log_loss'])
f=lambda a: (abs(a)+a)/2
for index, metric in enumerate(metricsPerModelColl):
if (index == 5):
metricsPerModelColl[index] = ((f(metric))*factors[index]) * 100
elif (index == 7):
metricsPerModelColl[index] = ((1 - metric)*factors[index] ) * 100
else:
metricsPerModelColl[index] = (metric*factors[index]) * 100
metricsPerModelColl[index] = metricsPerModelColl[index].to_json()
return metricsPerModelColl
# Sending the overview classifiers' results to be visualized as a scatterplot
@app.route('/data/PlotCrossMutate', methods=["GET", "POST"])
def SendToPlotCM():
while (len(DataResultsRaw) != DataRawLength):
pass
PreProcessingInitial()
response = {
'OverviewResultsCM': ResultsCM
}
return jsonify(response)
def PreProcessingInitial():
XModels = PreprocessingMetricsCM()
global allParametersPerfCrossMutr
XModels = XModels.fillna(0)
ModelSpaceMDSCM = FunMDS(XModels)
ModelSpaceTSNECM = FunTsne(XModels)
ModelSpaceTSNECM = ModelSpaceTSNECM.tolist()
ModelSpaceUMAPCM = FunUMAP(XModels)
PredictionProbSel = PreprocessingPredCM()
CrossMutateResults(ModelSpaceMDSCM,ModelSpaceTSNECM,ModelSpaceUMAPCM,PredictionProbSel)
def CrossMutateResults(ModelSpaceMDSCM,ModelSpaceTSNECM,ModelSpaceUMAPCM,PredictionProbSel):
global ResultsCM
global AllTargets
ResultsCM = []
parametersGen = PreprocessingParamCM()
metricsPerModel = preProcMetricsAllAndSelCM()
sumPerClassifier = preProcsumPerMetricCM(factors)
ModelsIDs = PreprocessingIDsCM()
parametersGenPD = parametersGen.to_json(orient='records')
XDataJSONEntireSet = XData.to_json(orient='records')
XDataColumns = XData.columns.tolist()
ResultsCM.append(json.dumps(ModelsIDs))
ResultsCM.append(json.dumps(sumPerClassifier))
ResultsCM.append(json.dumps(parametersGenPD))
ResultsCM.append(json.dumps(metricsPerModel))
ResultsCM.append(json.dumps(XDataJSONEntireSet))
ResultsCM.append(json.dumps(XDataColumns))
ResultsCM.append(json.dumps(yData))
ResultsCM.append(json.dumps(target_names))
ResultsCM.append(json.dumps(AllTargets))
ResultsCM.append(json.dumps(ModelSpaceMDSCM))
ResultsCM.append(json.dumps(ModelSpaceTSNECM))
ResultsCM.append(json.dumps(ModelSpaceUMAPCM))
ResultsCM.append(json.dumps(PredictionProbSel))
return Results
def PreprocessingPredSel(SelectedIDs):
numberIDKNN = []
numberIDLR = []
for el in SelectedIDs:
match = re.match(r"([a-z]+)([0-9]+)", el, re.I)
if match:
items = match.groups()
if (items[0] == 'KNN'):
numberIDKNN.append(int(items[1]))
else:
numberIDLR.append(int(items[1]) - 100)
dicKNN = allParametersPerformancePerModel[3]
dicLR = allParametersPerformancePerModel[7]
dfKNN = pd.DataFrame.from_dict(dicKNN)
dfKNN = dfKNN.loc[numberIDKNN]
dfLR = pd.DataFrame.from_dict(dicLR)
dfLR = dfLR.loc[numberIDLR]
dfLR.index += 100
df_concatProbs = pd.concat([dfKNN, dfLR])
predictionsKNN = []
for column, content in dfKNN.items():
el = [sum(x)/len(x) for x in zip(*content)]
predictionsKNN.append(el)
predictionsLR = []
for column, content in dfLR.items():
el = [sum(x)/len(x) for x in zip(*content)]
predictionsLR.append(el)
predictions = []
for column, content in df_concatProbs.items():
el = [sum(x)/len(x) for x in zip(*content)]
predictions.append(el)
return [predictionsKNN, predictionsLR, predictions]
@cross_origin(origin='localhost',headers=['Content-Type','Authorization'])
@app.route('/data/SendtoSeverSelIDs', methods=["GET", "POST"])
def RetrieveSelIDsPredict():
global ResultsSelPred
ResultsSelPred = []
RetrieveIDsSelection = request.get_data().decode('utf8').replace("'", '"')
RetrieveIDsSelection = json.loads(RetrieveIDsSelection)
RetrieveIDsSelection = RetrieveIDsSelection['predictSelectionIDs']
ResultsSelPred = PreprocessingPredSel(RetrieveIDsSelection)
return 'Everything Okay'
@app.route('/data/RetrievePredictions', methods=["GET", "POST"])
def SendPredictSel():
global ResultsSelPred
response = {
'PredictSel': ResultsSelPred
}
return jsonify(response)
return 'Everything Okay'
Loading…
Cancel
Save