我使用J48来分类由数值和名义值组成的实例。我的问题是我不知道在程序运行过程中会遇到哪些名义值。因此,我需要在模型中“实时”更新名义属性的数据。
例如,假设我只有两个属性,职业和年龄,运行过程如下:职业属性 = {}。
输入:[钢琴教师, 22]。
职业属性 = {钢琴教师}。
输入:[学校教师, 30]
职业属性 = {钢琴教师, 学校教师}。
输入:[钢琴教师, 40]
职业属性 = {钢琴教师, 学校教师}。
等等。
现在我尝试通过复制之前的属性,手动添加新属性,然后更新模型的数据。这样在训练模型时工作得很好。
但是!当我想分类一个新实例,比如[软件工程师, 52],职业属性被更新了:职业属性 = {钢琴教师, 学校教师, 软件工程师},但决策树本身从未“见过”“软件工程师”,因此无法完成分类并抛出异常。
你能指导如何处理上述情况吗?Weka是否有任何机制支持上述问题?
谢谢!
回答:
在训练时,为你的名义属性添加一个占位符数据,如__other__
。在尝试分类实例之前,首先检查名义属性的值是否之前见过;如果没有,则使用占位符值:
Attribute attribute = instances.attribute("职业属性");String s = "软件工程师";int index = attribute.indexOfValue(s);if (index == -1) { index = attribute.indexOfValue("__other__");}
当你有足够的数据时,再次使用新值进行训练。