| @@ -20,47 +20,68 @@ public class ActiveLearn { | |||||
| @ApiModelProperty(value = "实验描述") | @ApiModelProperty(value = "实验描述") | ||||
| private String description; | private String description; | ||||
| @ApiModelProperty(value = "数据集") | |||||
| private String dataset; | |||||
| @ApiModelProperty(value = "任务类型:classification, regression") | |||||
| private String taskType; | |||||
| @ApiModelProperty(value = "模型文件路径") | |||||
| private String modelPath; | |||||
| @ApiModelProperty(value = "数据集csv文件中哪几列是预测目标列,逗号分隔") | |||||
| private String targetColumns; | |||||
| @ApiModelProperty(value = "模型类名称") | |||||
| private String modelClassName; | |||||
| @ApiModelProperty(value = "分类算法") | @ApiModelProperty(value = "分类算法") | ||||
| private String classifierType; | |||||
| private String classifierAlg; | |||||
| @ApiModelProperty(value = "回归算法") | |||||
| private String regressorAlg; | |||||
| @ApiModelProperty(value = "dataset文件路径") | |||||
| private String dataset; | |||||
| @ApiModelProperty(value = "每次查询个数") | |||||
| private Integer queryBatchSize; | |||||
| @ApiModelProperty(value = "dataset类名") | |||||
| private String datasetClassName; | |||||
| @ApiModelProperty(value = "停止判则") | |||||
| private String stoppingCriterion; | |||||
| @ApiModelProperty(value = "数据集文件路径") | |||||
| private String datasetPath; | |||||
| @ApiModelProperty(value = "stopping_criterion为num_of_queries时传入,查询次数") | |||||
| private Integer numOfQueries; | |||||
| @ApiModelProperty(value = "数据量") | |||||
| private Integer dataSize; | |||||
| @ApiModelProperty(value = "stopping_criterion为cost_limit时传入,成本限制") | |||||
| private Double costLimit; | |||||
| @ApiModelProperty(value = "是否随机打乱") | |||||
| private Boolean shuffle; | |||||
| @ApiModelProperty(value = "stopping_criterion为percent_of_unlabel时传入,未标记比例") | |||||
| private Double percentOfUnlabel; | |||||
| @ApiModelProperty(value = "训练集数据量") | |||||
| private Integer trainSize; | |||||
| @ApiModelProperty(value = "stopping_criterion为time_limit时传入,时间限制") | |||||
| private Double timeLimit; | |||||
| @ApiModelProperty(value = "初始训练数据量") | |||||
| private Integer nInitial; | |||||
| @ApiModelProperty(value = "查询策略") | |||||
| @ApiModelProperty(value = "查询次数") | |||||
| private Integer nQueries; | |||||
| @ApiModelProperty(value = "每次查询数据量") | |||||
| private Integer nInstances; | |||||
| @ApiModelProperty(value = "查询策略:uncertainty_sampling, uncertainty_batch_sampling, max_std_sampling, expected_improvement, upper_confidence_bound") | |||||
| private String queryStrategy; | private String queryStrategy; | ||||
| @ApiModelProperty(value = "实验次数") | |||||
| private Integer numOfExperiment; | |||||
| @ApiModelProperty(value = "loss文件路径") | |||||
| private String lossPath; | |||||
| @ApiModelProperty(value = "loss类名") | |||||
| private String lossClassName; | |||||
| @ApiModelProperty(value = "多少轮查询保存一次模型参数") | |||||
| private Integer nCheckpoint; | |||||
| @ApiModelProperty(value = "测试集比率") | |||||
| private Double testRatio; | |||||
| @ApiModelProperty(value = "batch_size") | |||||
| private Integer batchSize; | |||||
| @ApiModelProperty(value = "初始使用标记数据比率") | |||||
| private Double initialLabelRate; | |||||
| @ApiModelProperty(value = "epochs") | |||||
| private Integer epochs; | |||||
| @ApiModelProperty(value = "指标") | |||||
| private String performanceMetric; | |||||
| @ApiModelProperty(value = "学习率") | |||||
| private Float lr; | |||||
| private Integer state; | private Integer state; | ||||
| @@ -42,8 +42,16 @@ public class ActiveLearnServiceImpl implements ActiveLearnService { | |||||
| String username = SecurityUtils.getLoginUser().getUsername(); | String username = SecurityUtils.getLoginUser().getUsername(); | ||||
| activeLearn.setCreateBy(username); | activeLearn.setCreateBy(username); | ||||
| activeLearn.setUpdateBy(username); | activeLearn.setUpdateBy(username); | ||||
| String datasetJson = JacksonUtil.toJSONString(activeLearnVo.getDataset()); | String datasetJson = JacksonUtil.toJSONString(activeLearnVo.getDataset()); | ||||
| activeLearn.setDataset(datasetJson); | activeLearn.setDataset(datasetJson); | ||||
| String modelJson = JacksonUtil.toJSONString(activeLearnVo.getModelPath()); | |||||
| activeLearn.setModelPath(modelJson); | |||||
| String datasetPathJson = JacksonUtil.toJSONString(activeLearnVo.getDatasetPath()); | |||||
| activeLearn.setDatasetPath(datasetPathJson); | |||||
| String lossPathJson = JacksonUtil.toJSONString(activeLearnVo.getLossPath()); | |||||
| activeLearn.setLossPath(lossPathJson); | |||||
| activeLearnDao.save(activeLearn); | activeLearnDao.save(activeLearn); | ||||
| return activeLearn; | return activeLearn; | ||||
| } | } | ||||
| @@ -59,8 +67,16 @@ public class ActiveLearnServiceImpl implements ActiveLearnService { | |||||
| BeanUtils.copyProperties(activeLearnVo, activeLearn); | BeanUtils.copyProperties(activeLearnVo, activeLearn); | ||||
| String username = SecurityUtils.getLoginUser().getUsername(); | String username = SecurityUtils.getLoginUser().getUsername(); | ||||
| activeLearn.setUpdateBy(username); | activeLearn.setUpdateBy(username); | ||||
| String datasetJson = JacksonUtil.toJSONString(activeLearnVo.getDataset()); | String datasetJson = JacksonUtil.toJSONString(activeLearnVo.getDataset()); | ||||
| activeLearn.setDataset(datasetJson); | activeLearn.setDataset(datasetJson); | ||||
| String modelJson = JacksonUtil.toJSONString(activeLearnVo.getModelPath()); | |||||
| activeLearn.setModelPath(modelJson); | |||||
| String datasetPathJson = JacksonUtil.toJSONString(activeLearnVo.getDatasetPath()); | |||||
| activeLearn.setDatasetPath(datasetPathJson); | |||||
| String lossPathJson = JacksonUtil.toJSONString(activeLearnVo.getLossPath()); | |||||
| activeLearn.setLossPath(lossPathJson); | |||||
| activeLearnDao.edit(activeLearn); | activeLearnDao.edit(activeLearn); | ||||
| return "修改成功"; | return "修改成功"; | ||||
| @@ -71,9 +87,18 @@ public class ActiveLearnServiceImpl implements ActiveLearnService { | |||||
| ActiveLearn activeLearn = activeLearnDao.getActiveLearnById(id); | ActiveLearn activeLearn = activeLearnDao.getActiveLearnById(id); | ||||
| ActiveLearnVo activeLearnVo = new ActiveLearnVo(); | ActiveLearnVo activeLearnVo = new ActiveLearnVo(); | ||||
| BeanUtils.copyProperties(activeLearn, activeLearnVo); | BeanUtils.copyProperties(activeLearn, activeLearnVo); | ||||
| if (StringUtils.isNotEmpty(activeLearn.getDataset())) { | |||||
| activeLearnVo.setDatasetPath(JsonUtils.jsonToMap(activeLearn.getDatasetPath())); | |||||
| } | |||||
| if (StringUtils.isNotEmpty(activeLearn.getModelPath())) { | |||||
| activeLearnVo.setModelPath(JsonUtils.jsonToMap(activeLearn.getModelPath())); | |||||
| } | |||||
| if (StringUtils.isNotEmpty(activeLearn.getDataset())) { | if (StringUtils.isNotEmpty(activeLearn.getDataset())) { | ||||
| activeLearnVo.setDataset(JsonUtils.jsonToMap(activeLearn.getDataset())); | activeLearnVo.setDataset(JsonUtils.jsonToMap(activeLearn.getDataset())); | ||||
| } | } | ||||
| if (StringUtils.isNotEmpty(activeLearn.getLossPath())) { | |||||
| activeLearnVo.setLossPath(JsonUtils.jsonToMap(activeLearn.getLossPath())); | |||||
| } | |||||
| return activeLearnVo; | return activeLearnVo; | ||||
| } | } | ||||
| @@ -101,7 +126,11 @@ public class ActiveLearnServiceImpl implements ActiveLearnService { | |||||
| ActiveLearnVo activeLearnParam = new ActiveLearnVo(); | ActiveLearnVo activeLearnParam = new ActiveLearnVo(); | ||||
| BeanUtils.copyProperties(activeLearn, activeLearnParam); | BeanUtils.copyProperties(activeLearn, activeLearnParam); | ||||
| activeLearnParam.setDatasetPath(JsonUtils.jsonToMap(activeLearn.getDatasetPath())); | |||||
| activeLearnParam.setDataset(JsonUtils.jsonToMap(activeLearn.getDataset())); | activeLearnParam.setDataset(JsonUtils.jsonToMap(activeLearn.getDataset())); | ||||
| activeLearnParam.setModelPath(JsonUtils.jsonToMap(activeLearn.getModelPath())); | |||||
| activeLearnParam.setLossPath(JsonUtils.jsonToMap(activeLearn.getLossPath())); | |||||
| String param = JsonUtils.objectToJson(activeLearnParam); | String param = JsonUtils.objectToJson(activeLearnParam); | ||||
| // todo 调argo转换接口 | // todo 调argo转换接口 | ||||
| @@ -21,49 +21,68 @@ public class ActiveLearnVo { | |||||
| @ApiModelProperty(value = "实验描述") | @ApiModelProperty(value = "实验描述") | ||||
| private String description; | private String description; | ||||
| /** | |||||
| * 对应数据集 | |||||
| */ | |||||
| @ApiModelProperty(value = "任务类型:classification, regression") | |||||
| private String taskType; | |||||
| @ApiModelProperty(value = "模型文件路径") | |||||
| private Map<String,Object> modelPath; | |||||
| @ApiModelProperty(value = "模型类名称") | |||||
| private String modelClassName; | |||||
| @ApiModelProperty(value = "分类算法") | |||||
| private String classifierAlg; | |||||
| @ApiModelProperty(value = "分类算法") | |||||
| private String regressorAlg; | |||||
| @ApiModelProperty(value = "dataset文件路径") | |||||
| private Map<String,Object> dataset; | private Map<String,Object> dataset; | ||||
| @ApiModelProperty(value = "数据集csv文件中哪一列是预测目标列,逗号分隔") | |||||
| private String targetColumns; | |||||
| @ApiModelProperty(value = "dataset类名") | |||||
| private String datasetClassName; | |||||
| @ApiModelProperty(value = "分类算法:logistic_regression(逻辑回归),decision_tree(决策树),random_forest(随机森林),SVM(支持向量机),naive_bayes(朴素贝叶斯),GBM(梯度提升机)") | |||||
| private String classifierType; | |||||
| @ApiModelProperty(value = "数据集") | |||||
| private Map<String,Object> datasetPath; | |||||
| @ApiModelProperty(value = "每次查询个数") | |||||
| private Integer queryBatchSize; | |||||
| @ApiModelProperty(value = "数据量") | |||||
| private Integer dataSize; | |||||
| @ApiModelProperty(value = "停止判则:num_of_queries(查询次数),percent_of_unlabel(未标记样本比例),time_limit(时间限制)") | |||||
| private String stoppingCriterion; | |||||
| @ApiModelProperty(value = "是否随机打乱") | |||||
| private Boolean shuffle; | |||||
| @ApiModelProperty(value = "stopping_criterion为num_of_queries时传入,查询次数") | |||||
| private Integer numOfQueries; | |||||
| @ApiModelProperty(value = "训练集数据量") | |||||
| private Integer trainSize; | |||||
| // @ApiModelProperty(value = "stopping_criterion为cost_limit时传入,成本限制") | |||||
| // private Double costLimit; | |||||
| @ApiModelProperty(value = "初始训练数据量") | |||||
| private Integer nInitial; | |||||
| @ApiModelProperty(value = "stopping_criterion为percent_of_unlabel时传入,未标记比例") | |||||
| private Double percentOfUnlabel; | |||||
| @ApiModelProperty(value = "查询次数") | |||||
| private Integer nQueries; | |||||
| @ApiModelProperty(value = "stopping_criterion为time_limit时传入,时间限制") | |||||
| private Double timeLimit; | |||||
| @ApiModelProperty(value = "每次查询数据量") | |||||
| private Integer nInstances; | |||||
| @ApiModelProperty(value = "查询策略:Uncertainty(不确定性),QBC(委员会查询),Random(随机),GraphDensity(图密度)") | |||||
| @ApiModelProperty(value = "查询策略:uncertainty_sampling, uncertainty_batch_sampling, max_std_sampling, expected_improvement, upper_confidence_bound") | |||||
| private String queryStrategy; | private String queryStrategy; | ||||
| @ApiModelProperty(value = "实验次数") | |||||
| private Integer numOfExperiment; | |||||
| @ApiModelProperty(value = "loss文件路径") | |||||
| private Map<String,Object> lossPath; | |||||
| @ApiModelProperty(value = "loss类名") | |||||
| private String lossClassName; | |||||
| @ApiModelProperty(value = "多少轮查询保存一次模型参数") | |||||
| private Integer nCheckpoint; | |||||
| @ApiModelProperty(value = "测试集比率") | |||||
| private Double testRatio; | |||||
| @ApiModelProperty(value = "batch_size") | |||||
| private Integer batchSize; | |||||
| @ApiModelProperty(value = "初始使用标记数据比率") | |||||
| private Double initialLabelRate; | |||||
| @ApiModelProperty(value = "epochs") | |||||
| private Integer epochs; | |||||
| @ApiModelProperty(value = "指标:accuracy_score,roc_auc_score,get_fps_tps_thresholds,hamming_loss,one_error,coverage_error") | |||||
| private String performanceMetric; | |||||
| @ApiModelProperty(value = "学习率") | |||||
| private Float lr; | |||||
| private Integer state; | private Integer state; | ||||
| @@ -2,18 +2,18 @@ | |||||
| <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> | ||||
| <mapper namespace="com.ruoyi.platform.mapper.ActiveLearnDao"> | <mapper namespace="com.ruoyi.platform.mapper.ActiveLearnDao"> | ||||
| <insert id="save"> | <insert id="save"> | ||||
| insert into active_learn(name, description, dataset, target_columns, classifier_type, query_batch_size, | |||||
| stopping_criterion, | |||||
| num_of_queries, cost_limit, percent_of_unlabel, time_limit, query_strategy, | |||||
| num_of_experiment, test_ratio, | |||||
| initial_label_rate, performance_metric, create_by, update_by) | |||||
| values (#{activeLearn.name}, #{activeLearn.description}, #{activeLearn.dataset}, #{activeLearn.targetColumns}, | |||||
| #{activeLearn.classifierType}, #{activeLearn.queryBatchSize}, #{activeLearn.stoppingCriterion}, | |||||
| #{activeLearn.numOfQueries}, | |||||
| #{activeLearn.costLimit}, #{activeLearn.percentOfUnlabel}, #{activeLearn.timeLimit}, | |||||
| insert into active_learn(name, description, task_type, model_path, model_class_name, classifier_alg, | |||||
| regressor_alg, dataset, dataset_class_name, dataset_path, data_size, | |||||
| shuffle, train_size, n_initial, n_queries, n_instances, query_strategy, | |||||
| loss_path, loss_class_name, n_checkpoint, batch_size, epochs, lr, create_by, update_by) | |||||
| values (#{activeLearn.name}, #{activeLearn.description}, #{activeLearn.taskType}, #{activeLearn.modelPath}, | |||||
| #{activeLearn.modelClassName}, #{activeLearn.classifierAlg}, #{activeLearn.regressorAlg}, | |||||
| #{activeLearn.dataset}, #{activeLearn.datasetClassName}, #{activeLearn.datasetPath}, | |||||
| #{activeLearn.dataSize}, #{activeLearn.shuffle}, #{activeLearn.trainSize}, | |||||
| #{activeLearn.nInitial}, #{activeLearn.nQueries}, #{activeLearn.nInstances}, | |||||
| #{activeLearn.queryStrategy}, | #{activeLearn.queryStrategy}, | ||||
| #{activeLearn.numOfExperiment}, #{activeLearn.testRatio}, #{activeLearn.initialLabelRate}, | |||||
| #{activeLearn.performanceMetric}, | |||||
| #{activeLearn.lossPath}, #{activeLearn.lossClassName}, #{activeLearn.nCheckpoint}, | |||||
| #{activeLearn.batchSize}, #{activeLearn.epochs}, #{activeLearn.lr}, | |||||
| #{activeLearn.createBy}, #{activeLearn.updateBy}) | #{activeLearn.createBy}, #{activeLearn.updateBy}) | ||||
| </insert> | </insert> | ||||
| @@ -26,47 +26,68 @@ | |||||
| <if test="activeLearn.description != null and activeLearn.description !=''"> | <if test="activeLearn.description != null and activeLearn.description !=''"> | ||||
| description = #{activeLearn.description}, | description = #{activeLearn.description}, | ||||
| </if> | </if> | ||||
| <if test="activeLearn.taskType != null and activeLearn.taskType !=''"> | |||||
| task_type = #{activeLearn.taskType}, | |||||
| </if> | |||||
| <if test="activeLearn.modelPath != null and activeLearn.modelPath !=''"> | |||||
| model_path = #{activeLearn.modelPath}, | |||||
| </if> | |||||
| <if test="activeLearn.modelClassName != null and activeLearn.modelClassName !=''"> | |||||
| model_class_name = #{activeLearn.modelClassName}, | |||||
| </if> | |||||
| <if test="activeLearn.classifierAlg != null and activeLearn.classifierAlg !=''"> | |||||
| classifier_alg = #{activeLearn.classifierAlg}, | |||||
| </if> | |||||
| <if test="activeLearn.regressorAlg != null and activeLearn.regressorAlg !=''"> | |||||
| regressor_alg = #{activeLearn.regressorAlg}, | |||||
| </if> | |||||
| <if test="activeLearn.dataset != null and activeLearn.dataset !=''"> | <if test="activeLearn.dataset != null and activeLearn.dataset !=''"> | ||||
| dataset = #{activeLearn.dataset}, | dataset = #{activeLearn.dataset}, | ||||
| </if> | </if> | ||||
| <if test="activeLearn.targetColumns != null and activeLearn.targetColumns !=''"> | |||||
| target_columns = #{activeLearn.targetColumns}, | |||||
| <if test="activeLearn.datasetClassName != null and activeLearn.datasetClassName !=''"> | |||||
| dataset_class_name = #{activeLearn.datasetClassName}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.classifierType != null and activeLearn.classifierType !=''"> | |||||
| classifier_type = #{activeLearn.classifierType}, | |||||
| <if test="activeLearn.datasetPath != null and activeLearn.datasetPath !=''"> | |||||
| dataset_path = #{activeLearn.datasetPath}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.queryBatchSize != null"> | |||||
| query_batch_size = #{activeLearn.queryBatchSize}, | |||||
| <if test="activeLearn.dataSize != null"> | |||||
| data_size = #{activeLearn.dataSize}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.stoppingCriterion != null and activeLearn.stoppingCriterion !=''"> | |||||
| stopping_criterion = #{activeLearn.stoppingCriterion}, | |||||
| <if test="activeLearn.shuffle != null"> | |||||
| shuffle = #{activeLearn.shuffle}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.numOfQueries != null"> | |||||
| num_of_queries = #{activeLearn.numOfQueries}, | |||||
| <if test="activeLearn.trainSize != null"> | |||||
| train_size = #{activeLearn.trainSize}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.costLimit != null"> | |||||
| cost_limit = #{activeLearn.costLimit}, | |||||
| <if test="activeLearn.nInitial != null"> | |||||
| n_initial = #{activeLearn.nInitial}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.percentOfUnlabel != null"> | |||||
| percent_of_unlabel = #{activeLearn.percentOfUnlabel}, | |||||
| <if test="activeLearn.nQueries != null"> | |||||
| n_queries = #{activeLearn.nQueries}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.timeLimit != null"> | |||||
| time_limit = #{activeLearn.timeLimit}, | |||||
| <if test="activeLearn.nInstances != null"> | |||||
| n_instances = #{activeLearn.nInstances}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.queryStrategy != null and activeLearn.queryStrategy !=''"> | <if test="activeLearn.queryStrategy != null and activeLearn.queryStrategy !=''"> | ||||
| query_strategy = #{activeLearn.queryStrategy}, | query_strategy = #{activeLearn.queryStrategy}, | ||||
| </if> | </if> | ||||
| <if test="activeLearn.numOfExperiment != null"> | |||||
| num_of_experiment = #{activeLearn.numOfExperiment}, | |||||
| <if test="activeLearn.lossPath != null and activeLearn.lossPath !=''"> | |||||
| loss_path = #{activeLearn.lossPath}, | |||||
| </if> | |||||
| <if test="activeLearn.lossClassName != null and activeLearn.lossClassName !=''"> | |||||
| loss_class_name = #{activeLearn.lossClassName}, | |||||
| </if> | |||||
| <if test="activeLearn.nCheckpoint != null"> | |||||
| n_checkpoint = #{activeLearn.nCheckpoint}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.testRatio != null"> | |||||
| test_ratio = #{activeLearn.testRatio}, | |||||
| <if test="activeLearn.batchSize != null"> | |||||
| batch_size = #{activeLearn.batchSize}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.initialLabelRate != null"> | |||||
| initial_label_rate = #{activeLearn.initialLabelRate}, | |||||
| <if test="activeLearn.epochs != null"> | |||||
| epochs = #{activeLearn.epochs}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.performanceMetric != null and activeLearn.performanceMetric !=''"> | |||||
| performance_metric = #{activeLearn.performanceMetric}, | |||||
| <if test="activeLearn.lr != null"> | |||||
| lr = #{activeLearn.lr}, | |||||
| </if> | </if> | ||||
| <if test="activeLearn.updateBy != null and activeLearn.updateBy !=''"> | <if test="activeLearn.updateBy != null and activeLearn.updateBy !=''"> | ||||
| update_by = #{activeLearn.updateBy}, | update_by = #{activeLearn.updateBy}, | ||||