diff --git a/__pycache__/run.cpython-38.pyc b/__pycache__/run.cpython-38.pyc
index 1cc7175..9a309e0 100644
Binary files a/__pycache__/run.cpython-38.pyc and b/__pycache__/run.cpython-38.pyc differ
diff --git a/frontend/src/components/DataSpace.vue b/frontend/src/components/DataSpace.vue
index 639b7d5..84598a5 100644
--- a/frontend/src/components/DataSpace.vue
+++ b/frontend/src/components/DataSpace.vue
@@ -24,6 +24,11 @@ export default {
},
methods: {
initializeBeeSwarm () {
+ var svg = d3.select("#BeeSwarm");
+ svg.selectAll("*").remove();
+ var svg = d3.select("#tooltip");
+ svg.selectAll("*").remove();
+
var tooltip = d3.select("#tooltip")
var width = 2500
diff --git a/frontend/src/components/FeatureSpaceDetail.vue b/frontend/src/components/FeatureSpaceDetail.vue
index cbf8d58..1b2e31b 100644
--- a/frontend/src/components/FeatureSpaceDetail.vue
+++ b/frontend/src/components/FeatureSpaceDetail.vue
@@ -7,9 +7,9 @@
- |
- |
- |
+ |
+ |
+ |
@@ -39,7 +39,8 @@ export default {
corrMatrixCombTotal: [],
VIFRemaining: [],
MIRemaining: [],
- computeNodes: 0
+ computeNodes: 0,
+ featureAddRemCount: [],
}
},
methods: {
@@ -163,7 +164,7 @@ export default {
var quadrantNumberLocal = this.quadrantNumber
var listofNodes = this.dataFS[0]
var dataLoc = JSON.parse(this.dataFS[3+quadrantNumberLocal])
-
+
var pushEachFinal = []
var pushEach
var oldVal
@@ -285,7 +286,6 @@ export default {
})
var links = []
-
Object.entries(dataLoc).forEach(
function ([feature, value]) {
Object.entries(value).forEach( function ([featureInside, value]) {
@@ -308,18 +308,20 @@ export default {
)
})
+ var lengthFeatureAddRem = this.featureAddRemCount.length
+
Object.entries(pushEachFinal).forEach(
function ([index, feature]) {
feature.value.forEach(function (element, indexIns) {
if (element.valueIns > 0) {
- links.push({"source": index, "target": index*feature.value.length+feature.value.length+indexIns, "value": Math.abs(element.valueIns) * 30, "lin_color": "#33a02c"})
+ links.push({"source": index, "target": (index*feature.value.length+feature.value.length+indexIns)-lengthFeatureAddRem, "value": Math.abs(element.valueIns) * 30, "lin_color": "#33a02c"})
}
else {
- links.push({"source": index, "target": index*feature.value.length+feature.value.length+indexIns, "value": Math.abs(element.valueIns) * 30, "lin_color": "#e31a1c"})
+ links.push({"source": index, "target": (index*feature.value.length+feature.value.length+indexIns)-lengthFeatureAddRem, "value": Math.abs(element.valueIns) * 30, "lin_color": "#e31a1c"})
}
})
})
-
+
this.jsonData = {"nodes": nodes, "links": links};
this.graphVizualization()
@@ -329,6 +331,7 @@ export default {
var computeNodesVar = this.computeNodes
var listofNodes = this.dataFS[0]
+
var corrTarget = JSON.parse(this.dataFS[8+this.quadrantNumber])
var corrGlob = JSON.parse(this.dataFS[13+this.quadrantNumber])
var uniqueTarget = JSON.parse(this.dataFS[18+this.quadrantNumber])
@@ -684,7 +687,7 @@ export default {
it.style.visibility = "hidden";
})
}
- console.log(d3.zoom())
+
//Zoom functions
function zoom_actions(){
svg.attr("transform", d3.event.transform)
@@ -819,6 +822,8 @@ export default {
EventBus.$on('quad', this.initializeNetwork)
EventBus.$on('countNodes1', data => { this.computeNodes = data })
+ EventBus.$on('removeFeatures', data => { this.featureAddRemCount = data })
+
EventBus.$on('reset', this.reset)
}
}
diff --git a/frontend/src/components/FeatureSpaceOverview.vue b/frontend/src/components/FeatureSpaceOverview.vue
index 8c838b0..a4913df 100644
--- a/frontend/src/components/FeatureSpaceOverview.vue
+++ b/frontend/src/components/FeatureSpaceOverview.vue
@@ -259,7 +259,6 @@ export default {
var root = treeData;
root.x0 = curY;
root.y0 = 0;
- console.log(treeData.children)
selectNode(treeData.children[this.keepRoot]); // current selected node
// Collapse all children of root's children before rendering
diff --git a/frontend/src/components/Heatmap.vue b/frontend/src/components/Heatmap.vue
index 9010d88..f500fac 100644
--- a/frontend/src/components/Heatmap.vue
+++ b/frontend/src/components/Heatmap.vue
@@ -36,7 +36,9 @@ export default {
keyLocal: 0,
activeModels: 0,
flagLocal: false,
- smallScreenMode: '0px'
+ smallScreenMode: '0px',
+ dataFI: [],
+ featureData: [],
}
},
methods: {
@@ -65,12 +67,69 @@ export default {
// Clear Heatmap first
var svg = d3.select("#Heatmap");
svg.selectAll("*").remove();
+ var featureUni = JSON.parse(this.dataFI[0])
- var dataAll = {"columns":[["R","F1"],["R","F2"],["R","F2"],["R","F1&F2"],["R","F2&F3"],["R","F1&F3"],["R","F1&F2&F3"],["R","F1+F2"],["R","F2+F3"],["R","F1+F3"],["R","F1+F2+F3"],["R","F1-F2"],["R","F2-F3"],["R","F1-F3"],["R","F1-F2-F3"],["R","F1*F2"],["R","F2*F3"],["R","F1*F3"],["R","F1*F2*F3"],["R","F1/F2"],["R","F2/F3"],["R","F1/F3"],["R","F1/F2/F3"]],"index":[["Information Gain"],["Fisher-Score"],["Relative Risk"],["Odds Ratio"]],"data":[[0.1178,0.4834,0.1647,0.1633,0.3355,0.1353,0.0556,0.9388,0.9354,0.8548,0.7037,0.6092,0.3835,0.7285,0.6405,0.424,0.6935,0.5766,0.2275,0.8309,0.972,0.9439,0.9366],[0.0372,-0.09,0.5015,0.5663,0.5126,-0.0274,0.4304,0.9518,0.9499,0.9216,-0.0278,0.6516,0.3019,-0.0936,0.6597,0.2323,-0.0833,0.4921,0.122,0.9275,0.96095,0.955,0.9501],[0.378,0.5514,0.378,0.3929,0.3271,0.3816,0.3647,0.9303,0.9372,0.8356,0.5314,0.4069,0.4288,0.5496,0.4156,0.427,0.5299,0.3454,0.4511,0.88235,0.9705,0.9468,0.9405],[0.4988,0.4149,0.5952,0.0628,-0.1015,0.497,0.58,0.9531,0.9572,0.8494,0.6262,0.3854,0.6904,0.5711,0.346,0.5132,0.583,0.3917,0.5305,0.7074,0.9763,0.9632,0.9582]]}
+ var algorithms = []
+ algorithms.push("Univariate FS")
+ algorithms.push("Permutation FI")
+ algorithms.push("Accuracy-based FI")
+ algorithms.push("Average")
+ algorithms.push("# Action #")
+
+ var PermImpEli = JSON.parse(this.dataFI[1])
+ var FeaturesAccuracy = JSON.parse(this.dataFI[2])
+ var Features = this.featureData[0]
+
+ var len2 = Features.length
+
+ let arr = Object.values(featureUni.Score);
+ let minUni = Math.min(...arr);
+ let maxUni = Math.max(...arr);
+
+ let len = algorithms.length
+ let indicesYAxis = []
+ for (let i = 0; i < len+1; i++) {
+ indicesYAxis[i] = [algorithms[i]]
+ }
+ let indicesXAxis = []
+ var temp = []
+ for (let i = 0; i < len2; i++) {
+ temp = []
+ temp.push("R")
+ var loop = i+1
+ temp.push(Features[i].toString()+" (F"+loop+")")
+ indicesXAxis[i] = temp
+ }
+
+ var values = []
+ var modelData = []
+ for (let j = 0; j < len2; j++) {
+ var data = []
+ for (let i = 0; i modelData.map(row => row[i]))
+
+ var dataAll = {"columns":indicesXAxis,"index":indicesYAxis,"data":transposedArray}
this.heatmap_display(dataAll, "#Heatmap");
},
heatmap_display(data, heatmapId) {
+ var featuresAddRem = []
var cellSize = this.cellSize
//##########################################################################
// Patrick.Brockmann@lsce.ipsl.fr
@@ -226,8 +285,8 @@ export default {
return d.idx;
})
.attr("class", "row");
- svg.append("text").attr("x", 150).attr("y", -40).text("Feature combination").style("font-size", "16px").attr("alignment-baseline","top")
- svg.append("text").attr("transform", "rotate(-90)").attr("x", -42).attr("y", -90).style("text-anchor", "middle").style("font-size", "16px").text("Algorithm"); // -130 before for HeartC
+ svg.append("text").attr("x", 15).attr("y", -60).text("Feature").style("font-size", "16px").attr("alignment-baseline","top")
+ svg.append("text").attr("transform", "rotate(-90)").attr("x", -52).attr("y", -90).style("text-anchor", "middle").style("font-size", "16px").text("Technique"); // -130 before for HeartC
var heatMap = row.selectAll(".cell")
.data(function(d) {
return d;
@@ -260,61 +319,43 @@ export default {
.attr("width", cellSize)
.attr("height", cellSize)
.style("fill", function(d) {
- if (d != null) return colorScale(d);
- else return "url(#diagonalHatch)";
+ if (d == -1) return "url(#diagonalHatch)"
+ else if (d == -2) return "yellow"
+ else return colorScale(d)
})
.on('mouseover', function(d, i, j) {
- var k = Array.prototype.indexOf.call(j[i].parentNode.parentNode.childNodes,j[i].parentNode) - 3;
- d3.select('#colLabel_' + i).classed("hover", true);
- d3.select('#rowLabel_' + k).classed("hover", true);
- if (d != null) {
- tooltip.style("visibility", "visible");
- tooltip.html('' + d.toFixed(2) + '
');
- } else
- tooltip.style("visibility", "hidden");
+
})
.on('mouseout', function(d, i, j) {
- var k = Array.prototype.indexOf.call(j[i].parentNode.parentNode.childNodes,j[i].parentNode) - 3;
- d3.select('#colLabel_' + i).classed("hover", false);
- d3.select('#rowLabel_' + k).classed("hover", false);
- tooltip.style("visibility", "hidden");
+
})
.on("mousemove", function(d, i) {
- tooltip.style("top", (d3.mouse(this)[1] + 55) + "px").style("left", (d3.mouse(this)[0]) + "px");
})
.on('click', function(d, i, j) {
var rowsExtracted = svg.selectAll(".row")._groups[0]
var k = Array.prototype.indexOf.call(j[i].parentNode.parentNode.childNodes,j[i].parentNode) - 3;
d3.select(this).style("fill", function(d) {
- if (d3.select(this).style("fill") === "url(\"#diagonalHatch\")"){
- return colorScale(d)
- } else {
- return "url(#diagonalHatch)"
- }
- })
- if (i+1 === j.length) {
- if(d3.select(this).style("fill") === "url(\"#diagonalHatch\")") {
- row.selectAll(".cr"+k).style("fill", "url(#diagonalHatch)")
- } else {
- row.selectAll(".cr"+k).style("fill", function(d) {
- return colorScale(d)
- })
- }
- }
- var finalresults = []
- for (let i = 0; i < rowsExtracted[0].childNodes.length - 1; i++) {
- var results = []
- for (let j = 0; j < rowsExtracted.length; j++) {
- if (rowsExtracted[j].childNodes[i].style.fill === "url(\"#diagonalHatch\")") {
- } else {
- results.push(j)
+ if (d3.select(this).style("fill") === "yellow" || d3.select(this).style("fill") === "url(\"#diagonalHatch\")") {
+ if (d3.select(this).style("fill") === "url(\"#diagonalHatch\")"){
+ if (d == -2) {
+ const index = featuresAddRem.indexOf(i);
+ if (index > -1) {
+ featuresAddRem.splice(index, 1);
}
+ EventBus.$emit('addFeature', featuresAddRem)
+ return 'yellow'
+ } else {
+ return colorScale(d)
+ }
+ } else {
+ featuresAddRem.push(i)
+ EventBus.$emit('removeFeatures', featuresAddRem)
+ return "url(#diagonalHatch)"
}
- finalresults.push(results)
- }
- EventBus.$emit('flagLocal', true)
- EventBus.$emit('sendSelectedFeaturestoPickle', finalresults)
- EventBus.$emit('SendSelectedFeaturesEvent', finalresults)
+ } else {
+ return colorScale(d)
+ }
+ })
});
var svgLeg = d3.select("#LegendHeat");
@@ -354,7 +395,7 @@ export default {
})
.attr("y", viewerPosTop + cellSize);
- svgLeg.append("text").attr("x", 200).attr("y", 50).text("Normalized feature importance").style("font-size", "16px").attr("alignment-baseline","top")
+ svgLeg.append("text").attr("x", 200).attr("y", 50).text("Normalized feature importance (FI)").style("font-size", "16px").attr("alignment-baseline","top")
//==================================================
// Change ordering of cells
@@ -509,7 +550,11 @@ export default {
}
},
mounted () {
- this.Heatmap()
+ EventBus.$on('HeatmapCall', data => { this.dataFI = data })
+ EventBus.$on('HeatmapCall', this.Heatmap)
+
+ EventBus.$on('quad', data => { this.featureData = data })
+
EventBus.$on('reset', this.reset)
}
}
@@ -537,59 +582,5 @@ text.hover {
fill: #66F;
font-background: #000;
}
-.heatmap_tooltip {
- text-align: center;
- font-family: monospace;
- font-size: 14pt;
- color: #000;
- position: relative;
- background: rgba(255, 255, 255, 0.8);
- border: 4px solid #66F;
- padding: 5px;
- border-radius: 8px ;
- -webkit-border-top-left-radius: 8px;
- -webkit-border-top-right-radius: 8px;
- -webkit-border-bottom-right-radius: 8px;
- -webkit-border-bottom-left-radius: 8px;
- -khtml-border-top-left-radius: 8px;
- -khtml-border-top-right-radius: 8px;
- -khtml-border-bottom-right-radius: 8px;
- -khtml-border-bottom-left-radius: 8px;
- -moz-border-radius-topleft: 8px;
- -moz-border-radius-topright: 8px;
- -moz-border-radius-bottomright: 8px;
- -moz-border-radius-bottomleft: 8px;
- border-top-left-radius: 8px;
- border-top-right-radius: 8px;
- border-bottom-right-radius: 8px;
- border-bottom-left-radius: 8px;
- width: 100px;
- z-index:10000;
- -webkit-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.8);
- -moz-box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.8);
- box-shadow: 4px 4px 10px rgba(0, 0, 0, 0.8);
-}
-.heatmap_tooltip:after, .heatmap_tooltip:before {
- top: 100%;
- border: solid transparent;
- content: " ";
- height: 0;
- width: 0;
- position: absolute;
- pointer-events: none;
-}
-.heatmap_tooltip:after {
- border-color: rgba(236, 240, 241, 0);
- border-top-color: #FFFFF;
- border-width: 10px;
- left: 50%;
- margin-left: -10px;
-}
-.heatmap_tooltip:before {
- border-color: rgba(44, 62, 80, 0);
- border-top-color: #66F;
- border-width: 16px;
- left: 50%;
- margin-left: -16px;
-}
+
\ No newline at end of file
diff --git a/frontend/src/components/Main.vue b/frontend/src/components/Main.vue
index 54b97b3..b521420 100755
--- a/frontend/src/components/Main.vue
+++ b/frontend/src/components/Main.vue
@@ -54,7 +54,7 @@
- Feature Selection Algorithms
+ Feature Selection (FS) Techniques
@@ -107,6 +107,7 @@ export default Vue.extend({
},
data () {
return {
+ featureAddRem: [],
ValidResults: [],
correlResulTranformed: [],
PositiveValue: 75,
@@ -153,8 +154,7 @@ export default Vue.extend({
provenanceData: '',
localFile: '',
toggleDeepMain: 1,
- keyLoc: 0,
- keyData: true,
+ keyImp: true,
ClassifierIDsListRemaining: [],
PredictSel: []
}
@@ -383,28 +383,6 @@ export default Vue.extend({
console.log(error)
})
},
- returnCorrel () {
- const path = `http://127.0.0.1:5000/data/returnCorrelations`
-
- 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 => {
- console.log('Server successfully send the correlation matrices!')
- this.correlResul = response.data.correlResul
- EventBus.$emit('quad', this.correlResul)
- this.returnResults()
- })
- .catch(error => {
- console.log(error)
- })
- },
returnCorrelTranformed () {
const path = `http://127.0.0.1:5000/data/returnCorrelationsTransformed`
@@ -427,6 +405,55 @@ export default Vue.extend({
console.log(error)
})
},
+ returnCorrel () {
+ const path = `http://127.0.0.1:5000/data/returnCorrelations`
+
+ 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 => {
+ console.log('Server successfully send the correlation matrices!')
+ this.correlResul = response.data.correlResul
+ EventBus.$emit('quad', this.correlResul)
+ if (this.keyImp) {
+ this.returnImportance()
+ this.keyImp = false
+ } else {
+ this.returnResults()
+ }
+ })
+ .catch(error => {
+ console.log(error)
+ })
+ },
+ returnImportance () {
+ const path = `http://127.0.0.1:5000/data/sendFeatImp`
+
+ 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 => {
+ console.log('Server successfully send the predictive results!')
+ this.Importance = response.data.Importance
+ EventBus.$emit('HeatmapCall', this.Importance)
+ this.returnResults()
+ })
+ .catch(error => {
+ console.log(error)
+ })
+ },
returnResults () {
const path = `http://127.0.0.1:5000/data/sendResults`
@@ -447,7 +474,29 @@ export default Vue.extend({
.catch(error => {
console.log(error)
})
- }
+ },
+ ManipulFeature () {
+ const path = `http://127.0.0.1:5000/data/AddRemFun`
+ const postData = {
+ featureAddRem: this.featureAddRem,
+ }
+ 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 an order to add or remove features!')
+ this.threshold()
+ })
+ .catch(error => {
+ console.log(error)
+ })
+ },
},
created () {
// does the browser support the Navigation Timing API?
@@ -480,9 +529,6 @@ export default Vue.extend({
})
-
- EventBus.$on('sendKeyNow', data => { this.keyLoc = data })
-
EventBus.$on('ReturningBrushedPointsIDs', data => { this.modelsUpdate = data })
//EventBus.$on('ReturningBrushedPointsIDs', this.UpdateBarChartFeatures )
EventBus.$on('ConfirmDataSet', this.fileNameSend)
@@ -531,6 +577,10 @@ export default Vue.extend({
EventBus.$on('SendtheChangeinRangePos', this.threshold)
EventBus.$on('SendtheChangeinRangeNeg', this.threshold)
+ EventBus.$on('addFeature', data => { this.featureAddRem = data })
+ EventBus.$on('removeFeatures', data => { this.featureAddRem = data })
+ EventBus.$on('addFeature', this.ManipulFeature)
+ EventBus.$on('removeFeatures', this.ManipulFeature)
//Prevent double click to search for a word.
document.addEventListener('mousedown', function (event) {
diff --git a/frontend/src/components/Results.vue b/frontend/src/components/Results.vue
index e6b7730..d47f637 100644
--- a/frontend/src/components/Results.vue
+++ b/frontend/src/components/Results.vue
@@ -152,7 +152,7 @@ export default {
gridcolor: "rgb(230,230,230)",
title: 'Step of the feature engineering',
tickformat: '.0f',
- range: [0, this.scoresMean.length + 10],
+ range: [0, this.scoresMean.length + 5],
showgrid: true,
showline: false,
showticklabels: true,
diff --git a/run.py b/run.py
index 3a52fda..54e4978 100644
--- a/run.py
+++ b/run.py
@@ -20,7 +20,14 @@ from bayes_opt import BayesianOptimization
from sklearn.model_selection import cross_validate
from sklearn.model_selection import cross_val_predict
from sklearn.preprocessing import OneHotEncoder
+from sklearn.metrics import classification_report
from sklearn.feature_selection import mutual_info_classif
+from sklearn.feature_selection import SelectKBest
+from sklearn.feature_selection import chi2
+from sklearn.feature_selection import RFE
+
+import eli5
+from eli5.sklearn import PermutationImportance
from joblib import Parallel, delayed
import multiprocessing
@@ -52,24 +59,12 @@ def reset():
global keySpecInternal
keySpecInternal = 1
- global dataSpacePointsIDs
- dataSpacePointsIDs = []
-
- global previousStateActive
- previousStateActive = []
-
global RANDOM_SEED
RANDOM_SEED = 42
- global KNNModelsCount
- global LRModelsCount
-
global keyData
keyData = 0
- KNNModelsCount = 0
- LRModelsCount = 100
-
global XData
XData = []
global yData
@@ -89,38 +84,18 @@ def reset():
global ClassifierIDsList
ClassifierIDsList = ''
- # Initializing models
-
- global resultsList
- resultsList = []
-
global RetrieveModelsList
RetrieveModelsList = []
- global allParametersPerformancePerModel
- allParametersPerformancePerModel = []
-
global allParametersPerfCrossMutr
allParametersPerfCrossMutr = []
- global HistoryPreservation
- HistoryPreservation = []
-
global all_classifiers
all_classifiers = []
global crossValidation
crossValidation = 5
- # models
- global KNNModels
- KNNModels = []
- global RFModels
- RFModels = []
-
- global results
- results = []
-
global resultsMetrics
resultsMetrics = []
@@ -130,6 +105,9 @@ def reset():
global target_names
target_names = []
+ global keyFirstTime
+ keyFirstTime = True
+
global target_namesLoc
target_namesLoc = []
return 'The reset was done!'
@@ -198,9 +176,6 @@ def retrieveFileName():
global resultsList
resultsList = []
- global allParametersPerformancePerModel
- allParametersPerformancePerModel = []
-
global allParametersPerfCrossMutr
allParametersPerfCrossMutr = []
@@ -213,43 +188,6 @@ def retrieveFileName():
global crossValidation
crossValidation = 5
- global scoring
- scoring = {'accuracy': 'accuracy', 'precision_weighted': 'precision_weighted', 'recall_weighted': 'recall_weighted', 'f1_weighted': 'f1_weighted', 'roc_auc_ovo_weighted': 'roc_auc_ovo_weighted'}
-
- global loopFeatures
- loopFeatures = 2
-
- # models
- global KNNModels
- global SVCModels
- global GausNBModels
- global MLPModels
- global LRModels
- global LDAModels
- global QDAModels
- global RFModels
- global ExtraTModels
- global AdaBModels
- global GradBModels
-
- KNNModels = []
- SVCModels = []
- GausNBModels = []
- MLPModels = []
- LRModels = []
- LDAModels = []
- QDAModels = []
- RFModels = []
- ExtraTModels = []
- AdaBModels = []
- GradBModels = []
-
- global results
- results = []
-
- global resultsMetrics
- resultsMetrics = []
-
global parametersSelData
parametersSelData = []
@@ -260,6 +198,9 @@ def retrieveFileName():
target_names = []
+ global keyFirstTime
+ keyFirstTime = True
+
global target_namesLoc
target_namesLoc = []
@@ -440,7 +381,7 @@ def dataSetSelection():
warnings.simplefilter('ignore')
- executeModel()
+ executeModel([])
return 'Everything is okay'
@@ -455,30 +396,90 @@ def create_global_function():
return np.mean(result['test_score'])
# check this issue later because we are not getting the same results
-def executeModel():
+def executeModel(exeCall):
- create_global_function()
+ global keyFirstTime
global estimator
global yPredictProb
global scores
+ global featureImportanceData
+ global XData
+ global XDataStored
+
+ if (keyFirstTime):
+ create_global_function()
+ params = {"C": (0.0001, 10000), "gamma": (0.0001, 10000)}
+ svc_bayesopt = BayesianOptimization(estimator, params, random_state=RANDOM_SEED)
+ svc_bayesopt.maximize(init_points=120, n_iter=20, acq='ucb')
+ bestParams = svc_bayesopt.max['params']
+ estimator = SVC(C=bestParams.get('C'), gamma=bestParams.get('gamma'), probability=True, random_state=RANDOM_SEED)
+ featureImportanceData = estimatorFeatureSelection(estimator)
+ keyFirstTime = False
+ XData = XDataStored.copy()
+ if (len(exeCall) != 0):
+ XData = XData.drop(XData.columns[exeCall], axis=1)
- params = {"C": (0.0001, 10000), "gamma": (0.0001, 10000)}
- svc_bayesopt = BayesianOptimization(estimator, params, random_state=RANDOM_SEED)
- svc_bayesopt.maximize(init_points=120, n_iter=20, acq='ucb')
- bestParams = svc_bayesopt.max['params']
- estimator = SVC(C=bestParams.get('C'), gamma=bestParams.get('gamma'), probability=True, random_state=RANDOM_SEED)
estimator.fit(XData, yData)
yPredict = estimator.predict(XData)
yPredictProb = cross_val_predict(estimator, XData, yData, cv=crossValidation, method='predict_proba')
- num_cores = 1
+ num_cores = multiprocessing.cpu_count()
inputsSc = ['accuracy','precision_macro','recall_macro']
flat_results = Parallel(n_jobs=num_cores)(delayed(solve)(estimator,XData,yData,crossValidation,item,index) for index, item in enumerate(inputsSc))
scores = [item for sublist in flat_results for item in sublist]
-
+
return 'Everything Okay'
+def estimatorFeatureSelection(clf):
+
+ resultsFS = []
+ permList = []
+ PerFeatureAccuracy = []
+ PerFeatureAccuracyAll = []
+
+ perm = PermutationImportance(clf, cv = None, refit = True, n_iter = 25).fit(XData, yData)
+ permList.append(perm.feature_importances_)
+ n_feats = XData.shape[1]
+ PerFeatureAccuracy = []
+ for i in range(n_feats):
+ scores = model_selection.cross_val_score(clf, XData.values[:, i].reshape(-1, 1), yData, cv=crossValidation)
+ PerFeatureAccuracy.append(scores.mean())
+ PerFeatureAccuracyAll.append(PerFeatureAccuracy)
+
+ clf.fit(XData, yData)
+ yPredict = clf.predict(XData)
+ yPredict = np.nan_to_num(yPredict)
+
+ perm_imp_eli5PD = pd.DataFrame(permList)
+ perm_imp_eli5PD = perm_imp_eli5PD.to_json()
+
+ PerFeatureAccuracyPandas = pd.DataFrame(PerFeatureAccuracyAll)
+ PerFeatureAccuracyPandas = PerFeatureAccuracyPandas.to_json()
+
+ bestfeatures = SelectKBest(score_func=chi2, k='all')
+ fit = bestfeatures.fit(XData,yData)
+ dfscores = pd.DataFrame(fit.scores_)
+ dfcolumns = pd.DataFrame(XData.columns)
+ featureScores = pd.concat([dfcolumns,dfscores],axis=1)
+ featureScores.columns = ['Specs','Score'] #naming the dataframe columns
+ featureScores = featureScores.to_json()
+
+ resultsFS.append(featureScores)
+ resultsFS.append(perm_imp_eli5PD)
+ resultsFS.append(PerFeatureAccuracyPandas)
+
+ return resultsFS
+
+@app.route('/data/sendFeatImp', methods=["GET", "POST"])
+def sendFeatureImportance():
+ global featureImportanceData
+
+ response = {
+ 'Importance': featureImportanceData
+ }
+ return jsonify(response)
+
def solve(sclf,XData,yData,crossValidation,scoringIn,loop):
scoresLoc = []
temp = model_selection.cross_val_score(sclf, XData, yData, cv=crossValidation, scoring=scoringIn, n_jobs=-1)
@@ -500,13 +501,13 @@ def sendFinalResults():
def Transformation(quadrant1, quadrant2, quadrant3, quadrant4, quadrant5):
XDataNumeric = XData.select_dtypes(include='number')
+
columns = list(XDataNumeric)
global packCorrTransformed
packCorrTransformed = []
for count, i in enumerate(columns):
-
dicTransf = {}
d={}
@@ -1095,4 +1096,13 @@ def unique(list1):
# check if exists in unique_list or not
if x not in unique_list:
unique_list.append(x)
- return unique_list
\ No newline at end of file
+ return unique_list
+
+@cross_origin(origin='localhost',headers=['Content-Type','Authorization'])
+@app.route('/data/AddRemFun', methods=["GET", "POST"])
+def ManipulFeat():
+ featureProcess = request.get_data().decode('utf8').replace("'", '"')
+ featureProcess = json.loads(featureProcess)
+ featureProcessExtract = featureProcess['featureAddRem']
+ executeModel(featureProcessExtract)
+ return 'Okay'
\ No newline at end of file