diff --git a/__pycache__/run.cpython-37.pyc b/__pycache__/run.cpython-37.pyc new file mode 100644 index 0000000..94f6612 Binary files /dev/null and b/__pycache__/run.cpython-37.pyc differ diff --git a/cachedir/joblib/run/create_global_function/72a755383fba437e4dead6ff3e3d81e3/metadata.json b/cachedir/joblib/run/create_global_function/72a755383fba437e4dead6ff3e3d81e3/metadata.json new file mode 100644 index 0000000..94e7e39 --- /dev/null +++ b/cachedir/joblib/run/create_global_function/72a755383fba437e4dead6ff3e3d81e3/metadata.json @@ -0,0 +1 @@ +{"duration": 0.006577968597412109, "input_args": {}} \ No newline at end of file diff --git a/cachedir/joblib/run/create_global_function/72a755383fba437e4dead6ff3e3d81e3/output.pkl b/cachedir/joblib/run/create_global_function/72a755383fba437e4dead6ff3e3d81e3/output.pkl new file mode 100644 index 0000000..a61ccad --- /dev/null +++ b/cachedir/joblib/run/create_global_function/72a755383fba437e4dead6ff3e3d81e3/output.pkl @@ -0,0 +1 @@ +N. \ No newline at end of file diff --git a/cachedir/joblib/run/create_global_function/func_code.py b/cachedir/joblib/run/create_global_function/func_code.py new file mode 100644 index 0000000..f18ab73 --- /dev/null +++ b/cachedir/joblib/run/create_global_function/func_code.py @@ -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']) diff --git a/cachedir/joblib/run/executeModel/72a755383fba437e4dead6ff3e3d81e3/metadata.json b/cachedir/joblib/run/executeModel/72a755383fba437e4dead6ff3e3d81e3/metadata.json new file mode 100644 index 0000000..d592a72 --- /dev/null +++ b/cachedir/joblib/run/executeModel/72a755383fba437e4dead6ff3e3d81e3/metadata.json @@ -0,0 +1 @@ +{"duration": 4.569021940231323, "input_args": {}} \ No newline at end of file diff --git a/cachedir/joblib/run/executeModel/72a755383fba437e4dead6ff3e3d81e3/output.pkl b/cachedir/joblib/run/executeModel/72a755383fba437e4dead6ff3e3d81e3/output.pkl new file mode 100644 index 0000000..76b1d12 Binary files /dev/null and b/cachedir/joblib/run/executeModel/72a755383fba437e4dead6ff3e3d81e3/output.pkl differ diff --git a/cachedir/joblib/run/executeModel/func_code.py b/cachedir/joblib/run/executeModel/func_code.py new file mode 100644 index 0000000..112f9a9 --- /dev/null +++ b/cachedir/joblib/run/executeModel/func_code.py @@ -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' diff --git a/frontend/index.html b/frontend/index.html index 8c3401b..e1d2f37 100755 --- a/frontend/index.html +++ b/frontend/index.html @@ -3,7 +3,7 @@ - HyperSearVis + FeatureEnVi
diff --git a/frontend/src/components/About.vue b/frontend/src/components/About.vue deleted file mode 100644 index 5529315..0000000 --- a/frontend/src/components/About.vue +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/frontend/src/components/AlgorithmHyperParam.vue b/frontend/src/components/AlgorithmHyperParam.vue deleted file mode 100644 index f577a96..0000000 --- a/frontend/src/components/AlgorithmHyperParam.vue +++ /dev/null @@ -1,351 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/Algorithms.vue b/frontend/src/components/Algorithms.vue deleted file mode 100644 index 3759f75..0000000 --- a/frontend/src/components/Algorithms.vue +++ /dev/null @@ -1,1113 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/CrossoverMutationSpace.vue b/frontend/src/components/CrossoverMutationSpace.vue deleted file mode 100644 index 3d5d43e..0000000 --- a/frontend/src/components/CrossoverMutationSpace.vue +++ /dev/null @@ -1,309 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/FeatureSpace1.vue b/frontend/src/components/FeatureSpace1.vue new file mode 100644 index 0000000..38998f0 --- /dev/null +++ b/frontend/src/components/FeatureSpace1.vue @@ -0,0 +1,86 @@ + + + diff --git a/frontend/src/components/FeatureSpace2.vue b/frontend/src/components/FeatureSpace2.vue new file mode 100644 index 0000000..9219312 --- /dev/null +++ b/frontend/src/components/FeatureSpace2.vue @@ -0,0 +1,86 @@ + + + diff --git a/frontend/src/components/FeatureSpace3.vue b/frontend/src/components/FeatureSpace3.vue new file mode 100644 index 0000000..16c02a1 --- /dev/null +++ b/frontend/src/components/FeatureSpace3.vue @@ -0,0 +1,86 @@ + + + diff --git a/frontend/src/components/FeatureSpace4.vue b/frontend/src/components/FeatureSpace4.vue new file mode 100644 index 0000000..e816ed5 --- /dev/null +++ b/frontend/src/components/FeatureSpace4.vue @@ -0,0 +1,86 @@ + + + diff --git a/frontend/src/components/HyperParameterSpace.vue b/frontend/src/components/HyperParameterSpace.vue deleted file mode 100644 index 0c598de..0000000 --- a/frontend/src/components/HyperParameterSpace.vue +++ /dev/null @@ -1,312 +0,0 @@ - - - \ No newline at end of file diff --git a/frontend/src/components/Main.vue b/frontend/src/components/Main.vue index 49889c2..cc49ca0 100755 --- a/frontend/src/components/Main.vue +++ b/frontend/src/components/Main.vue @@ -6,10 +6,9 @@ - Data Sets and Performance Metrics Manager + Data Sets Manager - @@ -19,16 +18,16 @@ Provenance - + - Majority Voting Results + Results - + @@ -118,44 +117,51 @@ - Hyper-parameters' Space - [Sel: {{OverSelLength}} / All: {{OverAllLength}}] + I. Feature Space - Highly Correct Prediction Probability - - + + - Crossover and Mutation - [Sel: {{OverSelLengthCM}} / All: {{OverAllLengthCM}}] + II. Feature Space - Slightly Correct Prediction Probability - - + + - + - Predictions' Space + III. Feature Space - Slightly Wrong Prediction Probability - - + + + + + IV. Feature Space - Highly Wrong Prediction Probability + + + + + + + + - - @@ -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? diff --git a/frontend/src/components/NotFound.vue b/frontend/src/components/NotFound.vue deleted file mode 100644 index ec2d23e..0000000 --- a/frontend/src/components/NotFound.vue +++ /dev/null @@ -1,8 +0,0 @@ - - - diff --git a/frontend/src/components/Parameters.vue b/frontend/src/components/Parameters.vue deleted file mode 100644 index beb1726..0000000 --- a/frontend/src/components/Parameters.vue +++ /dev/null @@ -1,846 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/components/PerformanceMetrics.vue b/frontend/src/components/PerformanceMetrics.vue deleted file mode 100644 index 64c5ff9..0000000 --- a/frontend/src/components/PerformanceMetrics.vue +++ /dev/null @@ -1,148 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/components/Predictions.vue b/frontend/src/components/Predictions.vue deleted file mode 100644 index 248e02c..0000000 --- a/frontend/src/components/Predictions.vue +++ /dev/null @@ -1,454 +0,0 @@ - - - - - \ No newline at end of file diff --git a/frontend/src/components/VotingResults.vue b/frontend/src/components/VotingResults.vue deleted file mode 100644 index 1c69f28..0000000 --- a/frontend/src/components/VotingResults.vue +++ /dev/null @@ -1,408 +0,0 @@ - - - \ No newline at end of file diff --git a/run.py b/run.py index 268e583..54813c9 100644 --- a/run.py +++ b/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) \ No newline at end of file + return 'Everything Okay' \ No newline at end of file