parent cf96d7ce99
commit f9002b5e58
  1. BIN
      __pycache__/run.cpython-38.pyc
  2. 5
      frontend/src/components/DataSpace.vue
  3. 21
      frontend/src/components/FeatureSpaceDetail.vue
  4. 1
      frontend/src/components/FeatureSpaceOverview.vue
  5. 197
      frontend/src/components/Heatmap.vue
  6. 108
      frontend/src/components/Main.vue
  7. 2
      frontend/src/components/Results.vue
  8. 174
      run.py

Binary file not shown.

@ -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

@ -7,9 +7,9 @@
<table class="table table-borderless centerTable" >
<tbody>
<tr>
<td scope="row"><button class="btn btn-info active" onclick="setLayerProj();" style="margin-left: -1px !important" ><font-awesome-icon icon="search" style="margin-right: 5px"/>Feature exploration</button></td>
<td><button class="btn btn-info" onclick="setLayerComp();" style="margin-left: -1.4px"><font-awesome-icon icon="balance-scale-left" style="margin-right: 5px" />Feature comparison</button></td>
<td scope="row"><button class="btn btn-info" onclick="setLayerSche();" style="margin-left: -2px !important"><font-awesome-icon icon="wrench" style="margin-right: 5px" />Feature engineering</button></td>
<td scope="row"><button class="btn btn-primary active" onclick="setLayerProj();" style="margin-left: -1px !important" ><font-awesome-icon icon="search" style="margin-right: 5px"/>Feature exploration</button></td>
<td><button class="btn btn-primary" onclick="setLayerComp();" style="margin-left: -1.4px"><font-awesome-icon icon="balance-scale-left" style="margin-right: 5px" />Feature comparison</button></td>
<td scope="row"><button class="btn btn-primary" onclick="setLayerSche();" style="margin-left: -2px !important"><font-awesome-icon icon="wrench" style="margin-right: 5px" />Feature engineering</button></td>
</tr>
</tbody>
</table>
@ -39,7 +39,8 @@ export default {
corrMatrixCombTotal: [],
VIFRemaining: [],
MIRemaining: [],
computeNodes: 0
computeNodes: 0,
featureAddRemCount: [],
}
},
methods: {
@ -285,7 +286,6 @@ export default {
})
var links = []
Object.entries(dataLoc).forEach(
function ([feature, value]) {
Object.entries(value).forEach( function ([featureInside, value]) {
@ -308,14 +308,16 @@ 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"})
}
})
})
@ -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)
}
}

@ -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

@ -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 <len; i++) {
if (algorithms[i] == "Univariate FS") {
values[i] = ((Object.values(featureUni.Score)[j]-minUni)/(maxUni-minUni))
} else if (algorithms[i] == "Permutation FI") {
values[i] = PermImpEli[j][0]
} else if (algorithms[i] == "Accuracy-based FI") {
values[i] = FeaturesAccuracy[j][0]
} else if (algorithms[i] == "Average") {
values[i] = ((((Object.values(featureUni.Score)[j]-minUni)/(maxUni-minUni)))+(PermImpEli[j][0])+(FeaturesAccuracy[j][0]))/(len-2)
} else {
values[i] = -2
}
data.push(values[i])
}
modelData.push(data)
}
var transposedArray = []
transposedArray = modelData[0].map((col, 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('<div class="heatmap_tooltip">' + d.toFixed(2) + '</div>');
} 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;
}
</style>

@ -54,7 +54,7 @@
</b-col>
<b-col cols="6">
<mdb-card style="margin-top: 15px;">
<mdb-card-header color="primary-color" tag="h5" class="text-center">Feature Selection Algorithms
<mdb-card-header color="primary-color" tag="h5" class="text-center">Feature Selection (FS) Techniques
</mdb-card-header>
<mdb-card-body>
<mdb-card-text class="text-center" style="min-height: 234px">
@ -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) {

@ -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,

174
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,23 +396,34 @@ 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))
@ -479,6 +431,55 @@ def executeModel():
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={}
@ -1096,3 +1097,12 @@ def unique(list1):
if x not in unique_list:
unique_list.append(x)
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'
Loading…
Cancel
Save