/* * Copyright [2013-2016] PayPal Software Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package ml.shifu.shifu.core.eval; import java.io.BufferedWriter; import java.io.IOException; import java.text.DecimalFormat; import java.util.List; import ml.shifu.shifu.container.PerformanceObject; import ml.shifu.shifu.container.obj.EvalConfig; import ml.shifu.shifu.container.obj.ModelConfig; import ml.shifu.shifu.container.obj.PerformanceResult; import ml.shifu.shifu.container.obj.RawSourceData.SourceType; import ml.shifu.shifu.fs.ShifuFileUtils; /** * Generate gainchart with html format and csv format * * @author Zhang David (pengzhang@paypal.com) */ public class GainChart { public static final DecimalFormat DF = new DecimalFormat("#.####"); public void generateHtml(EvalConfig evalConfig, ModelConfig modelConfig, String fileName, PerformanceResult result) throws IOException { BufferedWriter writer = null; try { writer = ShifuFileUtils.getWriter(fileName, SourceType.LOCAL); writer.write(GainChartTemplate.HIGHCHART_BASE_BEGIN); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_1, "Weighted Operation Point", "lst0", "Weighted Recall", "lst1", "Unit-wise Recall")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_2, "Unit-wise Operation Point", "lst2", "Weighted Recall", "lst3", "Unit-wise Recall")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_3, "Model Score", "lst4", "Weighted Recall", "lst5", "Unit-wise Recall")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_4, "Score Distibution", "lst6", "Score Count")); writer.write(" </div>\n"); writer.write(" <div class=\"col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main\">\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container0")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container1")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container2")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container3")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container4")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container5")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container6")); writer.write("<script>\n"); writer.write("\n"); writer.write(" var data_0 = [\n"); for(int i = 0; i < result.weightedGains.size(); i++) { PerformanceObject po = result.weightedGains.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedGains.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_1 = [\n"); for(int i = 0; i < result.weightedGains.size(); i++) { PerformanceObject po = result.weightedGains.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedGains.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_2 = [\n"); for(int i = 0; i < result.gains.size(); i++) { PerformanceObject po = result.gains.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.gains.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_3 = [\n"); for(int i = 0; i < result.gains.size(); i++) { PerformanceObject po = result.gains.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.gains.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_4 = [\n"); for(int i = 0; i < result.modelScoreList.size(); i++) { PerformanceObject po = result.modelScoreList.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.binLowestScore), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.modelScoreList.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_5 = [\n"); for(int i = 0; i < result.modelScoreList.size(); i++) { PerformanceObject po = result.modelScoreList.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.binLowestScore), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.modelScoreList.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_6 = [\n"); for(int i = 0; i < result.modelScoreList.size(); i++) { PerformanceObject po = result.modelScoreList.get(i); writer.write(String.format(GainChartTemplate.SCORE_DATA_FORMAT, GainChartTemplate.DF.format(po.scoreCount), GainChartTemplate.DF.format(po.binLowestScore), GainChartTemplate.DF.format(po.scoreCount), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.modelScoreList.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write("$(function () {\n"); String fullName = modelConfig.getBasic().getName() + "::" + evalConfig.getName(); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE, "container0", "Weighted Recall", modelConfig.getBasic().getName(), "Weighted Operation Point", "%", "false", "data_0", "data_0", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE, "container1", "Unit-wise Recall", modelConfig.getBasic().getName(), "Weighted Operation Point", "%", "false", "data_1", "data_1", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE, "container2", "Weighted Recall", modelConfig.getBasic().getName(), "Unit-wise Operation Point", "%", "false", "data_2", "data_2", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE, "container3", "Unit-wise Recall", modelConfig.getBasic().getName(), "Unit-wise Operation Point", "%", "false", "data_3", "data_3", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE, "container4", "Weighted Recall", modelConfig.getBasic().getName(), "Model Score", "", "true", "data_4", "data_4", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE, "container5", "Unit-wise Recall", modelConfig.getBasic().getName(), "Model Score", "", "true", "data_5", "data_5", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.SCORE_HIGHCHART_CHART_TEMPLATE, "container6", "Score Distribution", modelConfig.getBasic().getName(), "Model Score", "", "false", "data_6", "data_6", fullName)); writer.write("\n"); writer.write("});\n"); writer.write("\n"); writer.write("$(document).ready(function() {\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst0", "container0", "lst0")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst1", "container1", "lst1")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst2", "container2", "lst2")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst3", "container3", "lst3")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst4", "container4", "lst4")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst5", "container5", "lst5")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst6", "container6", "lst6")); writer.write("\n"); writer.write(" var ics = ['#container1','#container2', '#container4','#container5', '#container6'];\n"); writer.write(" var icl = ics.length;\n"); writer.write(" for (var i = 0; i < icl; i++) {\n"); writer.write(" $(ics[i]).toggleClass('show');\n"); writer.write(" $(ics[i]).toggleClass('hidden');\n"); writer.write(" $(ics[i]).toggleClass('ls_chosen');\n"); writer.write(" };\n"); writer.write("\n"); writer.write("});\n"); writer.write("\n"); writer.write("</script>\n"); writer.write(GainChartTemplate.HIGHCHART_BASE_END); } finally { if(writer != null) { writer.close(); } } } public void generateHtml4PrAndRoc(EvalConfig evalConfig, ModelConfig modelConfig, String fileName, PerformanceResult result) throws IOException { BufferedWriter writer = null; try { writer = ShifuFileUtils.getWriter(fileName, SourceType.LOCAL); writer.write(GainChartTemplate.HIGHCHART_BASE_BEGIN); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_1, "Weighted PR Curve", "lst0", "Weighted Precision", "lst1", "Unit-wise Precision")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_2, "Unit-wise PR Curve", "lst2", "Weighted Precision", "lst3", "Unit-wise Precision")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_1, "Weighted ROC Curve", "lst4", "Weighted Recall", "lst5", "Unit-wise Recall")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_2, "Unit-wise ROC Curve", "lst6", "Weighted Recall", "lst7", "Unit-wise Recall")); writer.write(" </div>\n"); writer.write(" <div class=\"col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main\">\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container0")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container1")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container2")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container3")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container4")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container5")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container6")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container7")); writer.write("<script>\n"); writer.write("\n"); writer.write(" var data_0 = [\n"); for(int i = 0; i < result.weightedPr.size(); i++) { PerformanceObject po = result.weightedPr.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedPr.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_1 = [\n"); for(int i = 0; i < result.weightedPr.size(); i++) { PerformanceObject po = result.weightedPr.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedPr.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_2 = [\n"); for(int i = 0; i < result.pr.size(); i++) { PerformanceObject po = result.pr.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.pr.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_3 = [\n"); for(int i = 0; i < result.pr.size(); i++) { PerformanceObject po = result.pr.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.pr.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_4 = [\n"); for(int i = 0; i < result.weightedRoc.size(); i++) { PerformanceObject po = result.weightedRoc.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedRoc.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_5 = [\n"); for(int i = 0; i < result.weightedRoc.size(); i++) { PerformanceObject po = result.weightedRoc.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedRoc.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_6 = [\n"); for(int i = 0; i < result.roc.size(); i++) { PerformanceObject po = result.roc.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.roc.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write(" var data_7 = [\n"); for(int i = 0; i < result.roc.size(); i++) { PerformanceObject po = result.roc.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.roc.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); writer.write("$(function () {\n"); String fullName = modelConfig.getBasic().getName() + "::" + evalConfig.getName(); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE2, "container0", "Weighted Recall - Weighted Precision (PR Curve)", modelConfig.getBasic().getName(), "Weighte Precision", "Weighted Recall", "%", "false", "data_0", "data_0", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE2, "container1", "Weighted Recall - Unit-wise Precision (PR Curve)", modelConfig.getBasic().getName(), "Unit-wise Precision", "Weighted Recall", "%", "false", "data_1", "data_1", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE2, "container2", "Unit-wise Recall - Weighted Precision (PR Curve)", modelConfig.getBasic().getName(), "Weighted Precision", "Unit-wise Recall", "%", "false", "data_2", "data_2", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE2, "container3", "Unit-wise Recall - Unit-wise Precision (PR Curve)", modelConfig.getBasic().getName(), "Unit-wise Precision", "Unit-wise Recall", "%", "false", "data_3", "data_3", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE2, "container4", "Weighted False Positive Rate - Weighted Recall (ROC Curve)", modelConfig.getBasic().getName(), "Weighted Recall", "Weighted False Positive Rate", "%", "false", "data_4", "data_4", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE2, "container5", "Weighted False Positive Rate - Unit-wise Recall (ROC Curve)", modelConfig.getBasic().getName(), "Unit-wise Recall", "Weighted False Positive Rate", "%", "false", "data_5", "data_5", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE2, "container6", "Unit-wise False Positive Rate - Weighted Recall (ROC Curve)", modelConfig.getBasic().getName(), "Weighted Recall", "Unit-wise False Positive Rate", "%", "false", "data_6", "data_6", fullName)); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE2, "container7", "Unit-wise False Positive Rate - Unit-wise Recall (ROC Curve)", modelConfig.getBasic().getName(), "Unit-wise Recall", "Unit-wise False Positive Rate", "%", "false", "data_7", "data_7", fullName)); writer.write("\n"); writer.write("});\n"); writer.write("\n"); writer.write("$(document).ready(function() {\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst0", "container0", "lst0")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst1", "container1", "lst1")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst2", "container2", "lst2")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst3", "container3", "lst3")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst4", "container4", "lst4")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst5", "container5", "lst5")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst6", "container6", "lst6")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst7", "container7", "lst7")); writer.write("\n"); writer.write(" var ics = ['#container1','#container2','#container5','#container6'];\n"); writer.write(" var icl = ics.length;\n"); writer.write(" for (var i = 0; i < icl; i++) {\n"); writer.write(" $(ics[i]).toggleClass('show');\n"); writer.write(" $(ics[i]).toggleClass('hidden');\n"); writer.write(" $(ics[i]).toggleClass('ls_chosen');\n"); writer.write(" };\n"); writer.write("\n"); writer.write("});\n"); writer.write("\n"); writer.write("</script>\n"); writer.write(GainChartTemplate.HIGHCHART_BASE_END); } finally { if(writer != null) { writer.close(); } } } public void generateHtml(EvalConfig evalConfig, ModelConfig modelConfig, String fileName, List<PerformanceResult> results, List<String> names) throws IOException { BufferedWriter writer = null; try { writer = ShifuFileUtils.getWriter(fileName, SourceType.LOCAL); writer.write(GainChartTemplate.HIGHCHART_BASE_BEGIN); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_1, "Weighted Operation Point", "lst0", "Weighted Recall", "lst1", "Unit-wise Recall")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_2, "Unit-wise Operation Point", "lst2", "Weighted Recall", "lst3", "Unit-wise Recall")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_3, "Model Score", "lst4", "Weighted Recall", "lst5", "Unit-wise Recall")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_4, "Score Distibution", "lst6", "Score Count")); writer.write(" </div>\n"); writer.write(" <div class=\"col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main\">\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container0")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container1")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container2")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container3")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container4")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container5")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container6")); writer.write("<script>\n"); writer.write("\n"); for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + j + " = [\n"); for(int i = 0; i < result.weightedGains.size(); i++) { PerformanceObject po = result.weightedGains.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedGains.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (results.size() + j) + " = [\n"); for(int i = 0; i < result.weightedGains.size(); i++) { PerformanceObject po = result.weightedGains.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedGains.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (2 * results.size() + j) + " = [\n"); for(int i = 0; i < result.gains.size(); i++) { PerformanceObject po = result.gains.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.gains.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (3 * results.size() + j) + " = [\n"); for(int i = 0; i < result.gains.size(); i++) { PerformanceObject po = result.gains.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.gains.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (4 * results.size() + j) + " = [\n"); for(int i = 0; i < result.modelScoreList.size(); i++) { PerformanceObject po = result.modelScoreList.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.binLowestScore), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.modelScoreList.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (5 * results.size() + j) + " = [\n"); for(int i = 0; i < result.modelScoreList.size(); i++) { PerformanceObject po = result.modelScoreList.get(i); writer.write(String.format(GainChartTemplate.DATA_FORMAT, GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.binLowestScore), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.modelScoreList.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (6 * results.size() + j) + " = [\n"); for(int i = 0; i < result.modelScoreList.size(); i++) { PerformanceObject po = result.modelScoreList.get(i); writer.write(String.format(GainChartTemplate.SCORE_DATA_FORMAT, GainChartTemplate.DF.format(po.scoreCount), GainChartTemplate.DF.format(po.binLowestScore), GainChartTemplate.DF.format(po.scoreCount), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.modelScoreList.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } writer.write("$(function () {\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX, "container0", "Weighted Recall", modelConfig.getBasic().getName(), "Weighted Operation Point", "%", "false")); int currIndex = 0; writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX, "container1", "Unit-wise Recall", modelConfig.getBasic().getName(), "Weighted Operation Point", "%", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX, "container2", "Weighted Recall", modelConfig.getBasic().getName(), "Unit-wise Operation Point", "%", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX, "container3", "Unit-wise Recall", modelConfig.getBasic().getName(), "Unit-wise Operation Point", "%", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX, "container4", "Weighted Recall", modelConfig.getBasic().getName(), "Model Score", "", "true")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX, "container5", "Unit-wise Recall", modelConfig.getBasic().getName(), "Model Score", "", "true")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.SCORE_HIGHCHART_CHART_PREFIX, "container6", "Score Distribution", modelConfig.getBasic().getName(), "Model Score", "", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write("});\n"); writer.write("\n"); writer.write("$(document).ready(function() {\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst0", "container0", "lst0")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst1", "container1", "lst1")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst2", "container2", "lst2")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst3", "container3", "lst3")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst4", "container4", "lst4")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst5", "container5", "lst5")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst6", "container6", "lst6")); writer.write("\n"); writer.write(" var ics = ['#container1', '#container2', '#container4', '#container5', '#container6'];\n"); writer.write(" var icl = ics.length;\n"); writer.write(" for (var i = 0; i < icl; i++) {\n"); writer.write(" $(ics[i]).toggleClass('show');\n"); writer.write(" $(ics[i]).toggleClass('hidden');\n"); writer.write(" $(ics[i]).toggleClass('ls_chosen');\n"); writer.write(" };\n"); writer.write("\n"); writer.write("});\n"); writer.write("\n"); writer.write("</script>\n"); writer.write(GainChartTemplate.HIGHCHART_BASE_END); } finally { if(writer != null) { writer.close(); } } } public void generateHtml4PrAndRoc(EvalConfig evalConfig, ModelConfig modelConfig, String fileName, List<PerformanceResult> results, List<String> names) throws IOException { BufferedWriter writer = null; try { writer = ShifuFileUtils.getWriter(fileName, SourceType.LOCAL); writer.write(GainChartTemplate.HIGHCHART_BASE_BEGIN); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_1, "Weighted PR Curve", "lst0", "Weighted Precision", "lst1", "Unit-wise Precision")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_2, "Unit-wise PR Curve", "lst2", "Weighted Precision", "lst3", "Unit-wise Precision")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_1, "Weighted ROC Curve", "lst4", "Weighted Recall", "lst5", "Unit-wise Recall")); writer.write(String.format(GainChartTemplate.HIGHCHART_BUTTON_PANEL_TEMPLATE_2, "Unit-wise ROC Curve", "lst6", "Weighted Recall", "lst7", "Unit-wise Recall")); writer.write(" </div>\n"); writer.write(" <div class=\"col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main\">\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container0")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container1")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container2")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container3")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container4")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container5")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container6")); writer.write(String.format(GainChartTemplate.HIGHCHART_DIV, "container7")); writer.write("<script>\n"); writer.write("\n"); for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + j + " = [\n"); for(int i = 0; i < result.weightedPr.size(); i++) { PerformanceObject po = result.weightedPr.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedPr.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (results.size() + j) + " = [\n"); for(int i = 0; i < result.weightedPr.size(); i++) { PerformanceObject po = result.weightedPr.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedPr.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (2 * results.size() + j) + " = [\n"); for(int i = 0; i < result.pr.size(); i++) { PerformanceObject po = result.pr.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.pr.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (3 * results.size() + j) + " = [\n"); for(int i = 0; i < result.pr.size(); i++) { PerformanceObject po = result.pr.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.pr.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (4 * results.size() + j) + " = [\n"); for(int i = 0; i < result.weightedRoc.size(); i++) { PerformanceObject po = result.weightedRoc.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedRoc.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (5 * results.size() + j) + " = [\n"); for(int i = 0; i < result.weightedRoc.size(); i++) { PerformanceObject po = result.weightedRoc.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedPrecision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.weightedFpr * 100), GainChartTemplate.DF.format(po.weightedActionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.weightedRoc.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (6 * results.size() + j) + " = [\n"); for(int i = 0; i < result.roc.size(); i++) { PerformanceObject po = result.roc.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.weightedRecall * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.roc.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } for(int j = 0; j < results.size(); j++) { PerformanceResult result = results.get(j); writer.write(" var data_" + (7 * results.size() + j) + " = [\n"); for(int i = 0; i < result.roc.size(); i++) { PerformanceObject po = result.roc.get(i); writer.write(String.format(GainChartTemplate.PRROC_DATA_FORMAT, GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.precision * 100), GainChartTemplate.DF.format(po.recall * 100), GainChartTemplate.DF.format(po.fpr * 100), GainChartTemplate.DF.format(po.actionRate * 100), GainChartTemplate.DF.format(po.binLowestScore))); if(i != result.roc.size() - 1) { writer.write(","); } } writer.write(" ];\n"); writer.write("\n"); } writer.write("$(function () {\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX3, "container0", "Weighted Recall - Weighted Precision (PR Curve)", modelConfig.getBasic().getName(), "Weighte Precision", "Weighted Recall", "%", "false")); int currIndex = 0; writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX3, "container1", "Weighted Recall - Unit-wise Precision (PR Curve)", modelConfig.getBasic().getName(), "Unit-wise Precision", "Weighted Recall", "%", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX3, "container2", "Unit-wise Recall - Weighted Precision (PR Curve)", modelConfig.getBasic().getName(), "Weighted Precision", "Unit-wise Recall", "%", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX3, "container3", "Unit-wise Recall - Unit-wise Precision (PR Curve)", modelConfig.getBasic().getName(), "Unit-wise Precision", "Unit-wise Recall", "%", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX3, "container4", "Weighted FPR - Weighted Recall (ROC Curve)", modelConfig.getBasic().getName(), "Weighted Recall", "Weighted FPR", "%", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX3, "container5", "Weighted FPR - Unit-wise Recall (ROC Curve)", modelConfig.getBasic().getName(), "Unit-wise Recall", "Weighted FPR", "%", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX3, "container6", "Unit-wise FPR - Weighted Recall (ROC Curve)", modelConfig.getBasic().getName(), "Weighted Recall", "Unit-wise FPR", "%", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_CHART_TEMPLATE_PREFIX3, "container7", "Unit-wise FPR - Unit-wise Recall (ROC Curve)", modelConfig.getBasic().getName(), "Unit-wise Recall", "Unit-wise FPR", "%", "false")); writer.write("series: ["); for(int i = 0; i < results.size(); i++) { writer.write("{"); writer.write(" data: data_" + (currIndex++) + ","); writer.write(" name: '" + names.get(i) + "',"); writer.write(" turboThreshold:0"); writer.write("}"); if(i != results.size() - 1) { writer.write(","); } } writer.write("]"); writer.write("});"); writer.write("\n"); writer.write("});\n"); writer.write("\n"); writer.write("$(document).ready(function() {\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst0", "container0", "lst0")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst1", "container1", "lst1")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst2", "container2", "lst2")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst3", "container3", "lst3")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst4", "container4", "lst4")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst5", "container5", "lst5")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst6", "container6", "lst6")); writer.write("\n"); writer.write(String.format(GainChartTemplate.HIGHCHART_LIST_TOGGLE_TEMPLATE, "lst7", "container7", "lst7")); writer.write("\n"); writer.write("\n"); writer.write(" var ics = ['#container1','#container2', '#container5','#container6'];\n"); writer.write(" var icl = ics.length;\n"); writer.write(" for (var i = 0; i < icl; i++) {\n"); writer.write(" $(ics[i]).toggleClass('show');\n"); writer.write(" $(ics[i]).toggleClass('hidden');\n"); writer.write(" $(ics[i]).toggleClass('ls_chosen');\n"); writer.write(" };\n"); writer.write("\n"); writer.write("});\n"); writer.write("\n"); writer.write("</script>\n"); writer.write(GainChartTemplate.HIGHCHART_BASE_END); } finally { if(writer != null) { writer.close(); } } } public void generateCsv(EvalConfig evalConfig, ModelConfig modelConfig, String fileName, List<PerformanceObject> performanceList) throws IOException { BufferedWriter writer = null; try { writer = ShifuFileUtils.getWriter(fileName, SourceType.LOCAL); writer.write("ActionRate,WeightedActionRate,Recall,WeightedRecall,Precision,WeightedPrecision,FPR,WeightedFPR,BinLowestScore\n"); String formatString = "%s,%s,%s,%s,%s,%s,%s,%s,%s\n"; for(PerformanceObject po: performanceList) { writer.write(String.format(formatString, DF.format(po.actionRate), DF.format(po.weightedActionRate), DF.format(po.recall), DF.format(po.weightedRecall), DF.format(po.precision), DF.format(po.weightedPrecision), DF.format(po.fpr), DF.format(po.weightedFpr), po.binLowestScore)); } } finally { if(writer != null) { writer.close(); } } } }