diff --git a/__pycache__/run.cpython-37.pyc b/__pycache__/run.cpython-37.pyc index 6b456c95d..269252c56 100644 Binary files a/__pycache__/run.cpython-37.pyc and b/__pycache__/run.cpython-37.pyc differ diff --git a/frontend/src/components/BalancePredictions.vue b/frontend/src/components/BalancePredictions.vue index 01268f8aa..ee0a09d18 100644 --- a/frontend/src/components/BalancePredictions.vue +++ b/frontend/src/components/BalancePredictions.vue @@ -92,7 +92,7 @@ var histogram = d3.histogram() .value(function(d) { return +d.value; }) // I need to give the vector of value .domain(x.domain()) // then the domain of the graphic - .thresholds(x.ticks(10)); // then the numbers of bins + .thresholds(x.ticks(20)); // then the numbers of bins // And apply twice this function to data to get the bins. var bins1 = histogram(data.filter( function(d){return d.type === "variable 1"} )); @@ -190,8 +190,9 @@ svg.append("circle").attr("cx", 215).attr("cy", heightforText-1.5).attr("r", 6).style("fill", "#000") svg.append("circle").attr("cx", 785).attr("cy", heightforText-1.5).attr("r", 6).style("fill", "#D3D3D3") svg.append("text").attr("x", 230).attr("y", heightforText).text("Entire Distribution").style("font-size", "15px").attr("alignment-baseline","middle") - svg.append("text").attr("x", 515).attr("y", heightforText-10).text("Performance").style("font-size", "15px").attr("alignment-baseline","top") + svg.append("text").attr("x", 515).attr("y", heightforText-10).text("# Performance (%) #").style("font-size", "15px").attr("alignment-baseline","top") svg.append("text").attr("x", 800).attr("y", heightforText).text("Selected Points").style("font-size", "15px").attr("alignment-baseline","middle") + svg.append("text").attr("transform", "rotate(-90)").attr("x", -89).attr("y", -45).style("text-anchor", "middle").text("Number of Models"); // Function to compute density function kernelDensityEstimator(kernel, X) { diff --git a/frontend/src/components/Heatmap.vue b/frontend/src/components/Heatmap.vue index 76c009181..bdfa603d0 100644 --- a/frontend/src/components/Heatmap.vue +++ b/frontend/src/components/Heatmap.vue @@ -54,11 +54,11 @@ export default { var maxUni = Math.max.apply(Math, featureUni.map(function(o) { return o.Score; })) var minUni = Math.min.apply(Math, featureUni.map(function(o) { return o.Score; })) let len = Features.length - let indicesYAxis = new Array(len) + let indicesYAxis = [] for (let i = 0; i < len; i++) { indicesYAxis[i] = [Features[i]] } - let indicesXAxis = new Array(len) + let indicesXAxis = [] var temp = [] for (let i = 0; i < len2; i++) { temp = [] @@ -68,10 +68,9 @@ export default { } if (this.ModelsIDHeatStack.length != 0) { - var FeaturesAccuracyNew = [] var PermImpEliNew = [] - indicesXAxis = new Array(len) + indicesXAxis = [] for (let i = 0; i < modelIds.length; i++) { if (this.ModelsIDHeatStack.includes(modelIds[i])) { @@ -90,7 +89,7 @@ export default { indicesXAxis[i] = temp } } - + temp = [] temp.push("R") temp.push("Average") diff --git a/frontend/src/components/Main.vue b/frontend/src/components/Main.vue index 6c6a4aae7..ca95434cf 100755 --- a/frontend/src/components/Main.vue +++ b/frontend/src/components/Main.vue @@ -232,6 +232,7 @@ export default Vue.extend({ OverviewResults: 0, preDataResults: '', DataResults: '', + keyNow: 1, instancesImportance: '', RetrieveValueFile: 'DiabetesC', // this is for the default data set ClassifierIDsList: '', @@ -398,9 +399,9 @@ export default Vue.extend({ EventBus.$emit('resetViews') } else { const path = `http://127.0.0.1:5000/data/ServerRequestSelPoin` - const postData = { - ClassifiersList: this.ClassifierIDsList + ClassifiersList: this.ClassifierIDsList, + keyNow: this.keyNow, } const axiosConfig = { headers: { @@ -414,9 +415,13 @@ export default Vue.extend({ .then(response => { console.log('Sent the selected points to the server (scatterplot)!') this.OverSelLength = this.ClassifierIDsList.length - EventBus.$emit('emittedEventCallingHeatmapView', this.OverviewResults) + this.OverAllLength = this.ClassifierIDsList.length this.getSelectedModelsMetrics() this.getFinalResults() + if (this.keyNow == 0) { + EventBus.$emit('GrayOutPoints', '') + EventBus.$emit('newPointsStack', this.OverviewResults) + } }) .catch(error => { console.log(error) @@ -440,8 +445,8 @@ export default Vue.extend({ axios.post(path, postData, axiosConfig) .then(response => { console.log('Sent the selected points to the server (scatterplot)!') - EventBus.$emit('GrayOutPoints', this.ClassifierIDsList) this.updatePredictionsSpace() + EventBus.$emit('GrayOutPoints', this.ClassifierIDsList) this.getFinalResults() }) .catch(error => { @@ -463,8 +468,11 @@ export default Vue.extend({ .then(response => { this.UpdatePredictions = response.data.UpdatePredictions console.log('Updating Predictions Space!') + if (this.keyNow == 1) { + console.log('mpike') + EventBus.$emit('InitializeProvenance', this.UpdatePredictions) + } EventBus.$emit('updatePredictionsSpace', this.UpdatePredictions) - EventBus.$emit('InitializeProvenance', this.UpdatePredictions) }) .catch(error => { console.log(error) @@ -558,6 +566,7 @@ export default Vue.extend({ axios.get(path, axiosConfig) .then(response => { this.FinalResults = response.data.FinalResults + console.log(this.FinalResults) EventBus.$emit('emittedEventCallingLinePlot', this.FinalResults) }) .catch(error => { @@ -966,8 +975,11 @@ export default Vue.extend({ EventBus.$on('reset', this.Reset) EventBus.$on('ReturningAlgorithms', data => { this.selectedAlgorithms = data }) EventBus.$on('ReturningBrushedPointsParams', data => { this.parametersofModels = data; }) + + EventBus.$on('ChangeKey', data => { this.keyNow = data }) EventBus.$on('SendSelectedPointsToServerEvent', data => { this.ClassifierIDsList = data }) EventBus.$on('SendSelectedPointsToServerEvent', this.SendSelectedPointsToServer) + EventBus.$on('SendSelectedDataPointsToServerEvent', data => { this.DataPointsSel = data }) EventBus.$on('SendSelectedDataPointsToServerEvent', this.SendSelectedDataPointsToServer) EventBus.$on('SendSelectedFeaturesEvent', data => { this.SelectedFeaturesPerClassifier = data }) diff --git a/frontend/src/components/PerMetricBarChart.vue b/frontend/src/components/PerMetricBarChart.vue index 2b28ef2aa..ed6225481 100644 --- a/frontend/src/components/PerMetricBarChart.vue +++ b/frontend/src/components/PerMetricBarChart.vue @@ -153,7 +153,7 @@ export default { Plotly.restyle(boxPlot, 'x', [['Accuracy','MAE','RMSE','G-Mean','G-Mean','G-Mean','Precision','Precision','Precision','Recall','Recall','Recall','F-Beta Sc','F-Beta Sc','F-Beta Sc','F-Beta Sc','F-Beta Sc','F-Beta Sc','F-Beta Sc','F-Beta Sc','F-Beta Sc','MCC','ROC AUC','Log Loss']]); index = 9 } - EventBus.$emit('updateMetricsScatter', resultsColors[index]) + //EventBus.$emit('updateMetricsScatter', resultsColors[index]) }); }, reset () { diff --git a/frontend/src/components/Provenance.vue b/frontend/src/components/Provenance.vue index 84b0dc8df..d395c8993 100644 --- a/frontend/src/components/Provenance.vue +++ b/frontend/src/components/Provenance.vue @@ -42,7 +42,11 @@ export default { AdaBModels: 2766, GradBModels: 2926, AllDetails: '', - platform: '' + platform: '', + count: 0, + storeData: [], + storePerformance: [], + storeParameters: [] } }, methods: { @@ -64,7 +68,7 @@ export default { }, provenance () { var canvas = document.getElementById("main-canvas"); - var width = this.WH[0]*9 // interactive visualization + var width = this.WH[0]*7 // interactive visualization var height = this.WH[1]*0.58 // interactive visualization var flagKNN = 0 @@ -79,10 +83,22 @@ export default { var flagAdaB = 0 var flagGradB = 0 + var localStackStore = [] var StackInfo = JSON.parse(this.stackInformation[1]) + var arrayOfNumbers = StackInfo.map(Number) + this.storeData.push(arrayOfNumbers) + localStackStore = this.storeData.slice() + + var localPerfStore = [] var performanceLoc = JSON.parse(this.AllDetails[0]) + this.storePerformance.push(performanceLoc) + localPerfStore = this.storePerformance.slice() + + var localParamsStore = [] var parameters = JSON.parse(this.AllDetails[2]) var parameters = JSON.parse(parameters) + this.storeParameters.push(parameters) + localParamsStore = this.storeParameters.slice() var stringParameters = [] var temp = 0 @@ -286,15 +302,18 @@ export default { var y = e.clientY - canvas.getBoundingClientRect().top; var p = plat.getPickingPixel(x * plat.pixelRatio, y * plat.pixelRatio); + var mergedIDs = [].concat.apply([], localStackStore) + var mergedPerf = [].concat.apply([], localPerfStore) + var mergedParams = [].concat.apply([], localParamsStore) + if (p) { // Show the tooltip only when there is nodeData found by the mouse - - d3.select('#tooltip') + d3.select('#tooltip') .style('opacity', 0.8) .style('top', x + 5 + 'px') .style('left', y + 5 + 'px') - .html('Model ID: '+StackInfo[p[1]]+'
'+'Parameters: '+JSON.stringify(parameters[p[1]])+'
# Performance (%) #: '+performanceLoc[p[1]]); + .html('Model ID: '+mergedIDs[p[1]]+'
'+'Parameters: '+JSON.stringify(mergedParams[p[1]])+'
# Performance (%) #: '+mergedPerf[p[1]]); } else { @@ -306,21 +325,46 @@ export default { } } const stringStep = "Stack " - var myButton = '   ' + var myButton = '       ' $("#dynamic-buttons").append(myButton); - function checkhistory () { - console.log(event) - //call the previous stack depending on button clicked. + $(document).on('click','.dynamic_buttons', function() { + var btns = document.getElementsByClassName('dynamic_buttons') + + btns.forEach(btnlocal => { + btnlocal.style.fontWeight = 'normal'; + }); + + function cleanLoc(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]; + } + } + } + + var btn = document.getElementById($(this).attr('id')); + btn.style.fontWeight = 'bold'; + + EventBus.$emit('ChangeKey', 0) + EventBus.$emit('SendSelectedPointsToServerEvent', localStackStore[parseInt($(this).attr('id').replace(/\D/g,''))-1]) + + stringParameters = [] + temp = 0 + for (let i = 0; i < localStackStore[parseInt($(this).attr('id').replace(/\D/g,''))-1].length; i++) { + cleanLoc(localPerfStore[parseInt($(this).attr('id').replace(/\D/g,''))-1][i]) + temp = JSON.stringify(Object.assign({ID: localStackStore[parseInt($(this).attr('id').replace(/\D/g,''))-1][i]}, localPerfStore[parseInt($(this).attr('id').replace(/\D/g,''))-1][i])) + stringParameters.push(temp) } + EventBus.$emit('ExtractResults', stringParameters) + + } + ); }, }, mounted () { - // fix that - $(document).on('click','.dynamic_buttons', function() { - console.log($(this).attr('id')) - } - ); EventBus.$on('ParametersProvenance', data => {this.AllDetails = data}) EventBus.$on('InitializeProvenance', data => {this.stackInformation = data}) EventBus.$on('InitializeProvenance', this.provenance) diff --git a/frontend/src/components/ScatterPlot.vue b/frontend/src/components/ScatterPlot.vue index da773a3e4..2f38c5a31 100644 --- a/frontend/src/components/ScatterPlot.vue +++ b/frontend/src/components/ScatterPlot.vue @@ -52,7 +52,14 @@ export default { valueStackRemove: 'Remove Unselected from Stack', DataPointsSelUpdate: [], ModelsIDGray: [], - valueResetSel: 'Reset Metric Selection' + valueResetSel: 'Reset Metric Selection', + newStackPoints: '', + colorsStore: [], + MDSStore: [], + parametersStore: [], + TSNEStore: [], + modelIDStore: [], + UMAPStore: [] } }, methods: { @@ -86,17 +93,21 @@ export default { var colorsforScatterPlot = JSON.parse(this.ScatterPlotResults[0]) - if (this.newColorsUpdate.length != 0) { + /*if (this.newColorsUpdate.length != 0) { let resultsClear = JSON.parse(this.newColorsUpdate) for (let j = 0; j < Object.values(resultsClear).length; j++) { colorsforScatterPlot.push(Object.values(resultsClear)[j]) } - } + }*/ var MDSData = JSON.parse(this.ScatterPlotResults[1]) var parameters = JSON.parse(this.ScatterPlotResults[2]) var TSNEData = JSON.parse(this.ScatterPlotResults[12]) - var modelId = JSON.parse(this.ScatterPlotResults[13]) + if (this.newStackPoints.length != 0) { + var modelId = this.newStackPoints + } else { + var modelId = JSON.parse(this.ScatterPlotResults[13]) + } var UMAPData = JSON.parse(this.ScatterPlotResults[17]) EventBus.$emit('sendPointsNumber', modelId.length) @@ -136,11 +147,6 @@ export default { var colorsforScatterPlotNew = [] for (let i = 0; i < modelId.length; i++) { if (listofNumbersModelsIDs.includes(modelId[i])) { - StackModelsIDs.push(modelId[i]) - parametersNew.push(parameters[i]) - colorsforScatterPlotNew.push('rgb(211,211,211)') - MDSDataNewX.push(MDSData[0][i]) - MDSDataNewY.push(MDSData[1][i]) } else { StackModelsIDs.push(modelId[i]) parametersNew.push(parameters[i]) @@ -157,7 +163,7 @@ export default { MDSData[0] = MDSDataNewX MDSData[1] = MDSDataNewY colorsforScatterPlot = colorsforScatterPlotNew - //EventBus.$emit('NewHeatmapAccordingtoNewStack', StackModelsIDs) + EventBus.$emit('NewHeatmapAccordingtoNewStack', StackModelsIDs) } var DataGeneral @@ -192,7 +198,7 @@ export default { colorscale: 'Viridis', colorbar: { title: '# Performance (%) #', - titleside: 'Top' + titleside:'right', }, } @@ -358,9 +364,10 @@ export default { if (evt.points[i] === undefined) { break } else { - const OnlyId = evt.points[i].text.split(';') - ClassifierIDsList.push(OnlyId[0]) - let numb = OnlyId[0].match(/\d/g); + const OnlyId = evt.points[i].text.split(' ')[2] + const OnlyIdCleared = OnlyId.split('
') + ClassifierIDsList.push(OnlyIdCleared[0]) + let numb = OnlyIdCleared[0].match(/\d/g); numb = numb.join(""); let numberNumb = Number(numb) ClassifierIDsListCleared.push(numberNumb) @@ -372,9 +379,11 @@ export default { } } if (allModels != '') { + EventBus.$emit('ChangeKey', 1) EventBus.$emit('SendSelectedPointsToServerEvent', pushModelsRemaining) - EventBus.$emit('SendSelectedPointsToBrushHeatmap', pushModelsRemaining) + EventBus.$emit('SendSelectedPointsToBrushHeatmap', ClassifierIDsListCleared) } else { + EventBus.$emit('ChangeKey', 1) EventBus.$emit('SendSelectedPointsToServerEvent', '') } } @@ -426,8 +435,11 @@ export default { } }, mounted() { - EventBus.$on('updateMetricsScatter', data => { this.newColorsUpdate = data }) - EventBus.$on('updateMetricsScatter', this.ScatterPlotView) + /*EventBus.$on('updateMetricsScatter', data => { this.newColorsUpdate = data }) + EventBus.$on('updateMetricsScatter', this.ScatterPlotView)*/ + + EventBus.$on('newPointsStack', data => { this.newStackPoints = data }) + EventBus.$on('newPointsStack', this.ScatterPlotView) EventBus.$on('GrayOutPoints', data => { this.ModelsIDGray = data }) EventBus.$on('GrayOutPoints', this.ScatterPlotView) diff --git a/run.py b/run.py index 6082bb4c3..7efd6c8e9 100644 --- a/run.py +++ b/run.py @@ -1049,7 +1049,6 @@ def PreprocessingPredUpdate(Models): dfGradBFiltered = dfGradB.loc[GradBModels, :] df_concatProbs = pd.concat([dfKNNFiltered, dfSVCFiltered, dfGausNBFiltered, dfMLPFiltered, dfLRFiltered, dfLDAFiltered, dfQDAFiltered, dfRFFiltered, dfExtraTFiltered, dfAdaBFiltered, dfGradBFiltered]) - listProbs = df_concatProbs.index.values.tolist() deletedElements = 0 for index, element in enumerate(listProbs): @@ -1474,7 +1473,9 @@ def InitializeEnsemble(): XModels = PreprocessingMetrics() global ModelSpaceMDS global ModelSpaceTSNE - + + XModels = XModels.fillna(0) + ModelSpaceMDS = FunMDS(XModels) ModelSpaceTSNE = FunTsne(XModels) ModelSpaceTSNE = ModelSpaceTSNE.tolist() @@ -1583,14 +1584,17 @@ def SendPredBacktobeUpdated(): def RetrieveSelClassifiersID(): ClassifierIDsList = request.get_data().decode('utf8').replace("'", '"') ComputeMetricsForSel(ClassifierIDsList) + ClassifierIDCleaned = json.loads(ClassifierIDsList) - key = 1 - EnsembleModel(ClassifierIDsList, key) + global keySpec + keySpec = ClassifierIDCleaned['keyNow'] + EnsembleModel(ClassifierIDsList, 1) return 'Everything Okay' def ComputeMetricsForSel(Models): Models = json.loads(Models) MetricsAlltoSel = PreprocessingMetrics() + listofModels = [] for loop in Models['ClassifiersList']: listofModels.append(loop) @@ -2340,6 +2344,8 @@ def EnsembleModel(Models, keyRetrieved): global all_classifiersSelection all_classifiersSelection = [] + global all_classifiers + global XData global yData global sclf @@ -2347,7 +2353,6 @@ def EnsembleModel(Models, keyRetrieved): lr = LogisticRegression() if (keyRetrieved == 0): - global all_classifiers all_classifiers = [] columnsInit = [] columnsInit = [XData.columns.get_loc(c) for c in XData.columns if c in XData] @@ -2443,8 +2448,11 @@ def EnsembleModel(Models, keyRetrieved): elif (keyRetrieved == 1): Models = json.loads(Models) ModelsAll = preProceModels() + global keySpec + print(ModelsAll) for index, modHere in enumerate(ModelsAll): flag = 0 + print(Models['ClassifiersList']) for loop in Models['ClassifiersList']: if (int(loop) == int(modHere)): flag = 1 @@ -2456,6 +2464,9 @@ def EnsembleModel(Models, keyRetrieved): meta_classifier=lr, random_state=RANDOM_SEED, n_jobs = -1) + print(keySpec) + if (keySpec == 0): + sclfStack = sclf elif (keyRetrieved == 2): # fix this part! if (len(all_classifiersSelection) == 0): @@ -2640,7 +2651,7 @@ def EnsembleModel(Models, keyRetrieved): # meta_classifier=lr, # random_state=RANDOM_SEED, # n_jobs = -1) - + num_cores = multiprocessing.cpu_count() inputsSc = ['accuracy','precision_weighted','recall_weighted','accuracy','precision_weighted','recall_weighted'] flat_results = Parallel(n_jobs=num_cores)(delayed(solve)(sclf,sclfStack,XData,yData,crossValidation,item,index) for index, item in enumerate(inputsSc))