分类模型以一个幕景内的场景表格为基础,并接受一个额外的训练数据表格作为数据源。 通过训练,系统将生成一个模型来对数据进行分类。本教程介绍如何创建分类模型。
在这一教程中,我们接续 《数据操作基础教程(一)》 , 从一个已经完成数据导入的快照开始操作,如下所示。
点击左侧导航栏第四个按钮,进入幕景编辑页面,然后进入场景表格栏。
点击加号按钮,创建新的场景表格,填写名称并选择相应的模板。
选择A、B、C三个列,并将这三个列标注为数值类型,并添加附加属性 ProbA、ProbB 和 ProbC,最后注意保存。
切换到模型栏,点击加号按钮打开创建模型窗口。填写模型名称,模型类型以及所挂靠的场景表格。
提交后,打开模型输入属性栏,点击添加路径文字右侧的加号按钮,然后在新出现的路径上选择A、B、C作为模型输入。
打开模型输出属性栏,选择 ProbA、ProbB 和 ProbC 作为输出。
最后打开分类模型设置栏,选择基础模型类型,然后设置输出和标签之间的对应关系, 对于 ProbA、ProbB、ProbC 我们分别设置对应的标签。这里标签的名称可以随意指定, 但要保证和模型的数据源里的标签一致。这里我们不妨分别设定为 MyLabelA、MyLabelB、MyLabelC, 完成后注意保存。
接下来,我们需要为模型设置训练数据。我们需要一个单独的表格,其中包含两个数据列 oid 和 label, 分别存储数据点的序号和对应的标注。一般而言,这个数据源表格的内容需要手动填写, 但在本教程中我们为方便起见采用视图功能生成一个数据源。 点击左侧导航栏第三个按钮进入表格变换页面,创建一个视图,如下所示。
其中 label 为自定义函数,设置如下所示。
函数体定义如下,其作用是根据三个输入参数的大小关系返回 MyLabelA,MyLabelB,MyLabelC 中的一个。
function (params) { if (params[0] > params[1] && params[0] > params[2]) return 'MyLabelA' if (params[1] > params[0] && params[1] > params[2]) return 'MyLabelB' return 'MyLabelC' }
通过创建上面的视图,我们为每个数据点都提供了一个 “手动” 的标注。系统内部通过 oid 列来找到标注对应的数据点, 然后再利用有标注的训练数据来训练分类模型。
接下来,我们将上面的视图分成训练集和测试集,这可以通过创建视图完成。
# 训练集 Dir.Train { "select": ["*"], "from": ["Dir.Label"], "where": ["oid < 800"] } # 测试集 Dir.Test { "select": ["*"], "from": ["Dir.Label"], "where": ["oid >= 800"] }
所生成的视图如下所示。
完成这些后,我们回到幕景编辑页面,切换到数据源栏,为模型和场景表格设置数据源,然后保存。
然后对幕景进行部署,然后起一个名字。
接下来,点击导航栏第五个按钮,进入幕景监测页面。选择 Stage 幕景,然后切换到模型栏, 选择 MyModel 并点击右上侧第二个烧瓶图标对模型进行训练。 然后点击模型统计信息,查看模型训练效果。
可以看到,系统给出了三组不同的统计信息。实际上在 SemDB 内部,分类模型会对每种标签分别进行二分类处理。 对于每种标签,所有标签值等于该值的数据被视为正样本,而所有其他数据被视为负样本。 在理想情况下,系统所给出的平均预测分数(即模型输出的平均值)应是正样本越高越好,而负样本越低越好。
点击右上侧齿轮按钮,然后在对话框内选择 Dir.Test 表格作为数据源,则我们可以看到模型在训练集上的表现。
我们还可以将模型的输出直接写回数据库表格。点击右上侧第三个写入数据库图标,然后切换回表格监测页面, 可以看到出现了一个自动创建的 _MyData 表格,其包含名为 oid、ProbA、ProbB 和 ProbC 的四列。 _MyData 表格对应于幕景 Stage 中的 MyData 场景表格,其中 ProbA、ProbB 和 ProbC 这三列是模型的输出。 按照我们之前所设置的对应关系,三列分别记录了每一列数据的属于对应标签类别的概率。 需要注意的是 SemDB 系统不保证这三个数值之和为 1。
最后,让我们创建一个视图来验证模型输出的准确性,定义如下。
{ "select": ["A", "B", "C", "ProbA", "ProbB", "ProbC"], "from": ["Dir.Data AS Raw", "Dir._MyData AS Pred"], "where": ["Raw._oid = Pred.oid"] }
可以看到模型的分类基本准确。