|
|
@@ -8,50 +8,18 @@
|
|
|
</el-breadcrumb>
|
|
|
</div>
|
|
|
|
|
|
- <div class="handle-box">
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- </div>
|
|
|
-
|
|
|
<!-- <el-tab-pane :label="featureList"> </el-tab-pane>-->
|
|
|
<div class="container">
|
|
|
<div class="form-box" >
|
|
|
<el-form ref="formRef" label-width="120px">
|
|
|
- <el-form-item label="模型类型名:" >
|
|
|
- {{config.modelTypeName}}
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="模型描述:" >
|
|
|
- {{config.modelDes}}
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="模型详情:" >
|
|
|
- {{config.modelDetileDes}}
|
|
|
+ <el-form-item label="学习类型:" >
|
|
|
+ {{config.learningType}}
|
|
|
</el-form-item>
|
|
|
<el-form-item label="特征字段:" >
|
|
|
- <el-table :data="tableData" border class="table" ref="fieldTable" header-cell-class-name="table-header" @selection-change="handleSelectChange">
|
|
|
- <el-table-column label="字段名" width="120%">
|
|
|
- <template #default="scope"><span>{{ scope.row.fieldName }}</span></template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="别名">
|
|
|
- <template #default="scope">{{ scope.row.aliasName }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="描述">
|
|
|
- <template #default="scope">{{ scope.row.fieldDes }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="取值类型">
|
|
|
- <template #default="scope">{{ scope.row.fieldType }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="分布类型">
|
|
|
- <template #default="scope">{{ scope.row.conOrDis }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="空值率">
|
|
|
- <template #default="scope">{{ scope.row.nullsRatio }}</template>
|
|
|
- </el-table-column>
|
|
|
-
|
|
|
- <el-table-column label="值域" width="150%">
|
|
|
- <template #default="scope">{{ scope.row.valueInfo }}</template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
+ {{config.features}}
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="目标字段:" >
|
|
|
+ {{config.label}}
|
|
|
</el-form-item>
|
|
|
|
|
|
<el-form-item label="模型列表:" >
|
|
|
@@ -59,13 +27,18 @@
|
|
|
<el-table-column label="模型名" width="150%">
|
|
|
<template #default="scope"><span>{{ scope.row.modelName }}</span></template>
|
|
|
</el-table-column>
|
|
|
- <el-table-column label="模型类别" width="150%">
|
|
|
- <template #default="scope">{{ scope.row.modelDetailName }}</template>
|
|
|
+ <el-table-column label="机器学习算法" width="150%">
|
|
|
+ <template #default="scope">
|
|
|
+ {{ scope.row.machineLearningAlgorithm }}
|
|
|
+ </template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="训练状态">
|
|
|
<template #default="scope" >
|
|
|
- <div v-if="scope.row.trainedStatus===-1">未训练</div>
|
|
|
- <div v-else="">已训练</div></template>
|
|
|
+ <div v-if="scope.row.trainingState==='UNTRAINED'">未训练</div>
|
|
|
+ <div v-else-if="scope.row.trainingState==='TRAINING'">训练中</div>
|
|
|
+ <div v-else-if="scope.row.trainingState==='SUCCESS'">训练成功</div>
|
|
|
+ <div v-else="">训练失败</div>
|
|
|
+ </template>
|
|
|
</el-table-column>
|
|
|
<el-table-column label="操作" width="180" align="center">
|
|
|
<template #default="scope">
|
|
|
@@ -92,32 +65,41 @@
|
|
|
|
|
|
<el-dialog title="新建模型" v-model="modelVisiable" width="30%">
|
|
|
<el-form label-width="120px">
|
|
|
- <el-form-item label="文件Id" required>
|
|
|
- <el-input v-model="form.fileInfoId" ></el-input>
|
|
|
- </el-form-item>
|
|
|
<el-form-item label="模型名称" required>
|
|
|
<el-input v-model="form.modelName"></el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="MaxIter" v-model="showMaxIter" v-if="showMaxIter===true">
|
|
|
- <el-input v-model="form.MaxIter"></el-input>
|
|
|
+ <el-form-item label="算法名称" required>
|
|
|
+ <el-select v-model="form.machineLearningAlgorithm" placeholder="请选择一个算法" class="handle-select mr10">
|
|
|
+ <el-option key="1" label="逻辑回归" value="LOGISTIC_REGRESSION_CLASSIFICATION"></el-option>
|
|
|
+ <el-option key="2" label="决策树" value="DECISION_TREE_CLASSIFICATION"></el-option>
|
|
|
+ <el-option key="3" label="梯度提升树分类" value="GRADIENT_BOOSTED_TREE_CLASSIFICATION"></el-option>
|
|
|
+ <el-option key="4" label="多层感知器分类" value="MULTI_LAYER_PERCEPTRON_CLASSIFICATION"></el-option>
|
|
|
+ <el-option key="5" label="朴素贝叶斯分类" value="NAIVE_BAYES_CLASSIFICATION"></el-option>
|
|
|
+ <el-option key="6" label="随机森林分类" value="RANDOM_FOREST_CLASSIFICATION"></el-option>
|
|
|
+ <el-option key="7" label="随机森林回归" value="RANDOM_FOREST_REGRESSION"></el-option>
|
|
|
+ <el-option key="8" label="K均值聚类" value="K_MEANS_CLUSTERING"></el-option>
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="MaxIter" v-model="showMaxIter" v-if="judgeAlgorithmType() === 1">
|
|
|
+ <el-input v-model="form.trainParams.MaxIter"></el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="RegParam" v-model="showRegParam" v-if="showRegParam===true">
|
|
|
- <el-input v-model="form.RegParam"></el-input>
|
|
|
+ <el-form-item label="RegParam" v-model="showRegParam" v-if="judgeAlgorithmType() === 1">
|
|
|
+ <el-input v-model="form.trainParams.RegParam"></el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="ElasticNetParam" v-model="showElasticNetParam" v-if="showElasticNetParam===true">
|
|
|
- <el-input v-model="form.ElasticNetParam"></el-input>
|
|
|
+ <el-form-item label="ElasticNetParam" v-model="showElasticNetParam" v-if="judgeAlgorithmType() === 1">
|
|
|
+ <el-input v-model="form.trainParams.ElasticNetParam"></el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="Category" v-model="showCategory" v-if="showCategory===true">
|
|
|
- <el-input v-model="form.Category"></el-input>
|
|
|
+ <el-form-item label="Category" v-model="showCategory" v-if="judgeAlgorithmType() === 3">
|
|
|
+ <el-input v-model="form.trainParams.Category"></el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="DataSetOccupy" v-model="showTrainingDataSetOccupy" v-if="showTrainingDataSetOccupy===true">
|
|
|
- <el-input v-model="form.TrainingDataSetOccupy"></el-input>
|
|
|
+ <el-form-item label="DataSetOccupy" v-model="showTrainingDataSetOccupy" v-if="judgeAlgorithmType() === 3">
|
|
|
+ <el-input v-model="form.trainParams.TrainingDataSetOccupy"></el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="NumOfCluster" v-model="showNumOfCluster" v-if="showNumOfCluster===true">
|
|
|
- <el-input v-model="form.NumOfCluster"></el-input>
|
|
|
+ <el-form-item label="NumOfCluster" v-model="showNumOfCluster" v-if="judgeAlgorithmType() === 2">
|
|
|
+ <el-input v-model="form.trainParams.NumOfCluster"></el-input>
|
|
|
</el-form-item>
|
|
|
- <el-form-item label="Seed" v-model="showSeed" v-if="showSeed===true">
|
|
|
- <el-input v-model="form.Seed"></el-input>
|
|
|
+ <el-form-item label="Seed" v-model="showSeed" v-if="judgeAlgorithmType() === 2">
|
|
|
+ <el-input v-model="form.trainParams.Seed"></el-input>
|
|
|
</el-form-item>
|
|
|
|
|
|
</el-form>
|
|
|
@@ -151,11 +133,12 @@
|
|
|
<script>
|
|
|
import {ref, reactive, getCurrentInstance, onMounted} from "vue";
|
|
|
import { ElMessage, ElMessageBox } from "element-plus";
|
|
|
-import { fetchData } from "../api/index";
|
|
|
-import {getFileDetail} from "../api/file";
|
|
|
-import {getOneConfig} from "../api/config";
|
|
|
+import { fetchData } from "../../api";
|
|
|
+import {getFileDetail} from "../../api/file";
|
|
|
+import {getOneConfig} from "../../api/config";
|
|
|
import {useRoute}from "vue-router";
|
|
|
-import {addModel} from "../api/model";
|
|
|
+import {addModel, getModelByConfigId} from "../../api/model";
|
|
|
+import {getEnum} from "../../api/utils";
|
|
|
export default {
|
|
|
name: "configDetail",
|
|
|
//训练特征
|
|
|
@@ -192,74 +175,64 @@ export default {
|
|
|
const showNumOfCluster=ref(false);
|
|
|
const showSeed=ref(false);
|
|
|
|
|
|
+ // let form = reactive({
|
|
|
+ // modelTypeId:"",
|
|
|
+ // configId:route.query.configId,
|
|
|
+ // fileInfoId:"",
|
|
|
+ // modelName:"",
|
|
|
+ // MaxIter:"",
|
|
|
+ // RegParam:"",
|
|
|
+ // ElasticNetParam:"",
|
|
|
+ // Category:"",
|
|
|
+ // TrainingDataSetOccupy:"",
|
|
|
+ // NumOfCluster:"",
|
|
|
+ // Seed:"",
|
|
|
+ // });
|
|
|
let form = reactive({
|
|
|
- modelTypeId:"",
|
|
|
- configId:route.query.configId,
|
|
|
- fileInfoId:"",
|
|
|
- modelName:"",
|
|
|
- MaxIter:"",
|
|
|
- RegParam:"",
|
|
|
- ElasticNetParam:"",
|
|
|
- Category:"",
|
|
|
- TrainingDataSetOccupy:"",
|
|
|
- NumOfCluster:"",
|
|
|
- Seed:"",
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ configId: route.query.configId,
|
|
|
+ modelName: "",
|
|
|
+ machineLearningAlgorithm: "",
|
|
|
+ trainParams: {},
|
|
|
});
|
|
|
// 获取表格数据
|
|
|
|
|
|
const getData = () => {
|
|
|
-
|
|
|
- //todo:调用获取文件具体信息获取字段列表
|
|
|
// console.log("queryId",route.query.configId);
|
|
|
-
|
|
|
if(route.query.configId!=null) {
|
|
|
getOneConfig({configId:route.query.configId}).then(res => {
|
|
|
// console.log("configdetail",route.query.configId);
|
|
|
-
|
|
|
- config.value=res.data;
|
|
|
- form.modelTypeId=config.value.modelTypeId;
|
|
|
- if (form.modelTypeId==='1') {
|
|
|
- showMaxIter.value = true;
|
|
|
- showRegParam.value = true;
|
|
|
- showElasticNetParam.value = true;
|
|
|
- }else if (form.modelTypeId==='5') {
|
|
|
- showNumOfCluster.value=true;
|
|
|
- showSeed.value=true;
|
|
|
- }else {
|
|
|
- showCategory.value=true;
|
|
|
- showTrainingDataSetOccupy.value=true;
|
|
|
- }
|
|
|
- console.log("form",form);
|
|
|
- //console.log("config",config.value.modelTypeId);
|
|
|
- tableData.value = res.data.featureList;
|
|
|
- for (var i = 0; i < tableData.value.length; i++) {
|
|
|
- if (tableData.value[i].conOrDis === 1) {
|
|
|
- tableData.value[i].conOrDis = "连续值"
|
|
|
- } else {
|
|
|
- tableData.value[i].conOrDis = "离散值"
|
|
|
- }
|
|
|
- }
|
|
|
- //console.log(tableData)
|
|
|
-
|
|
|
- modelData.value=res.data.modelInfos;
|
|
|
- console.log("tableData",tableData);
|
|
|
- fileId.value=tableData.value[0].fileInfoId;
|
|
|
- form.fileInfoId=(String)(fileId.value)
|
|
|
+ config.value=res.result;
|
|
|
+ // form.modelTypeId=config.value.learningType;
|
|
|
+ // if (form.modelTypeId==='1') {
|
|
|
+ // showMaxIter.value = true;
|
|
|
+ // showRegParam.value = true;
|
|
|
+ // showElasticNetParam.value = true;
|
|
|
+ // }else if (form.modelTypeId==='5') {
|
|
|
+ // showNumOfCluster.value=true;
|
|
|
+ // showSeed.value=true;
|
|
|
+ // }else {
|
|
|
+ // showCategory.value=true;
|
|
|
+ // showTrainingDataSetOccupy.value=true;
|
|
|
+ // }
|
|
|
+ // console.log("form",form);
|
|
|
+ tableData.value = res.result.features;
|
|
|
+ });
|
|
|
+ getModelByConfigId({configId:route.query.configId}).then(res =>{
|
|
|
+ modelData.value=res.result.modelVOList;
|
|
|
})
|
|
|
-
|
|
|
+ // getEnum().then(res=>{
|
|
|
+ // console.log("enum: "+res)
|
|
|
+ // })
|
|
|
}
|
|
|
|
|
|
};
|
|
|
getData();
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
+ const judgeAlgorithmType =()=>{
|
|
|
+ if (form.machineLearningAlgorithm === 'LOGISTIC_REGRESSION_CLASSIFICATION') return 1;
|
|
|
+ else if (form.machineLearningAlgorithm === 'K_MEANS_CLUSTERING') return 2;
|
|
|
+ else return 3;
|
|
|
+ }
|
|
|
|
|
|
// 查询操作
|
|
|
const handleSearch = () => {
|
|
|
@@ -274,58 +247,47 @@ export default {
|
|
|
|
|
|
// 删除操作
|
|
|
|
|
|
-
|
|
|
// 表格编辑时弹窗和保存
|
|
|
const editVisible = ref(true);
|
|
|
|
|
|
-
|
|
|
-
|
|
|
const saveModel = () => {
|
|
|
modelVisiable.value = false
|
|
|
- form.fileInfoId=tableData.value[0].fileInfoId
|
|
|
- console.log(form.fileInfoId)
|
|
|
- //todo: 调用Model相关接口
|
|
|
- console.log("savemodel",form);
|
|
|
- const payload={modelTypeId:form.modelTypeId,
|
|
|
- configId:form.configId,
|
|
|
- fileInfoId:form.fileInfoId,
|
|
|
- modelName:form.modelName,
|
|
|
- argument:[]
|
|
|
+ const payload={
|
|
|
+ configId:form.configId,
|
|
|
+ userId: 1,
|
|
|
+ modelName:form.modelName,
|
|
|
+ machineLearningAlgorithm: form.machineLearningAlgorithm,
|
|
|
+ trainParams:{}
|
|
|
}
|
|
|
const arg1={
|
|
|
- MaxIter:form.MaxIter,
|
|
|
- RegParam:form.RegParam,
|
|
|
- ElasticNetParam:form.ElasticNetParam
|
|
|
+ MaxIter:form.trainParams.MaxIter,
|
|
|
+ RegParam:form.trainParams.RegParam,
|
|
|
+ ElasticNetParam:form.trainParams.ElasticNetParam
|
|
|
}
|
|
|
const arg3={
|
|
|
- Category:form.Category,
|
|
|
- TrainingDataSetOccupy:form.TrainingDataSetOccupy
|
|
|
+ Category:form.trainParams.Category,
|
|
|
+ TrainingDataSetOccupy:form.trainParams.TrainingDataSetOccupy
|
|
|
}
|
|
|
const arg4={
|
|
|
- NumOfCluster:form.NumOfCluster,
|
|
|
- Seed:form.Seed
|
|
|
+ NumOfCluster:form.trainParams.NumOfCluster,
|
|
|
+ Seed:form.trainParams.Seed
|
|
|
}
|
|
|
- if (config.value.modelTypeId==='1'){
|
|
|
- payload.argument=arg1;
|
|
|
- }else if (config.value.modelTypeId==='5'){
|
|
|
- payload.argument=arg4;
|
|
|
+ if (judgeAlgorithmType() === 1){
|
|
|
+ payload.trainParams=arg1;
|
|
|
+ }else if (judgeAlgorithmType() === 5){
|
|
|
+ payload.trainParams=arg4;
|
|
|
}else{
|
|
|
- payload.argument=arg3;
|
|
|
+ payload.trainParams=arg3;
|
|
|
}
|
|
|
- console.log("here",payload);
|
|
|
addModel(payload).then(res=>{
|
|
|
-
|
|
|
- if(res.status===200) {
|
|
|
+ console.log(res)
|
|
|
+ if(res.msg === '成功') {
|
|
|
ElMessage.success(`已成功生成模型`);
|
|
|
-
|
|
|
}
|
|
|
else ElMessage.error(`生成模型失败`);
|
|
|
})
|
|
|
|
|
|
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
};
|
|
|
let idx = -1;
|
|
|
const handleEdit = () => {
|
|
|
@@ -336,10 +298,9 @@ export default {
|
|
|
|
|
|
//生成模型弹窗
|
|
|
const modelVisiable=ref(false);
|
|
|
- const createModel=()=>{
|
|
|
|
|
|
+ const createModel=()=>{
|
|
|
modelVisiable.value=true;
|
|
|
- console.log("here",modelVisiable);
|
|
|
}
|
|
|
const handleSelectChange=val=>{
|
|
|
selectData.value=val;
|
|
|
@@ -364,6 +325,8 @@ export default {
|
|
|
showNumOfCluster,
|
|
|
showSeed,
|
|
|
showTrainingDataSetOccupy,
|
|
|
+
|
|
|
+ judgeAlgorithmType,
|
|
|
selectData,
|
|
|
handleSelectChange,
|
|
|
handleSearch,
|
|
|
@@ -388,7 +351,7 @@ export default {
|
|
|
}
|
|
|
|
|
|
.handle-select {
|
|
|
- width: 120px;
|
|
|
+ width: 150px;
|
|
|
}
|
|
|
|
|
|
.handle-input {
|