问题陈述大致如下:
给定一个网站,我们需要将其分类到两个预定义类别之一(例如,是否为电子商务网站?)
我们已经尝试使用朴素贝叶斯算法,并结合多种预处理技术(如停用词删除、词干提取等)以及适当的特征来解决这个问题。
我们希望将准确率提高到90%或接近这个水平,但目前的方法未能达到这一目标。
问题在于,在手动评估准确率时,我们会寻找网页上的几个标识符(例如,结账按钮、购物/购物、PayPal等),这些标识符有时会被我们的算法遗漏。
我们考虑,如果我们对这些标识符非常确定,为什么不创建一个基于规则的分类器
,根据一组规则(这些规则将基于某些优先级编写)来对页面进行分类呢?
例如,如果页面包含购物/购物并且有结账按钮,那么它就是一个电子商务页面。还有许多类似的规则按优先级排序。
根据一些规则,我们还会访问网站的其他页面(目前,我们只访问主页,这也是准确率不高的原因之一)。
使用基于规则的方法我们可能会面临哪些潜在问题?或者这种方法是否更适合我们的用例?
使用复杂的算法(例如FOIL, AQ
等)来创建这些规则是否是个好主意?
回答:
决策树算法可以处理你的数据,并返回一组用于预测未标记实例的规则。
事实上,决策树实际上只是一个由规则组成的递归下降分区器,其中每条规则位于树的一个节点上,对未标记数据实例应用该规则,会将该实例发送到左分支或右分支。
许多决策树实现会明确生成一组规则,但这不是必须的,因为只需查看代表训练好的决策树分类器的树,就可以轻松看到规则(包括规则的内容和规则在决策流程中的位置)。
特别是,每条规则只是对特定特征(数据列或字段)中特定值的布尔测试。
例如,假设每行数据中的一个特征描述了应用程序缓存的类型;进一步假设该特征有三种可能的值,memcache、redis和custom。那么一条规则可能是应用程序缓存 | memcache,或者这个数据实例的应用程序缓存是否基于redis?
从决策树中提取的规则是布尔型的——要么为真,要么为假。按照惯例,False由左边的边(或链接到该父节点下方左侧的子节点)表示;True由右侧的边表示。
因此,一个新的(未标记的)数据行从根节点开始,然后根据根节点处的规则是回答True还是False,被发送到右侧或左侧。接下来应用下一级(树层次结构中的下一级)规则,直到数据实例到达最低级(没有规则的节点,或叶节点)。
一旦数据点被过滤到叶节点,它本质上就被分类了,因为每个叶节点都与之关联有训练数据实例的分布(例如,如果Good和Bad是类标签,则为25% Good | 75% Bad)。这种经验分布(在理想情况下由仅有一个类标签的数据实例组成)决定了未知数据实例的估计类标签。
免费且开源的库,Orange,有一个决策树模块(在Orange中,特定机器学习技术的实现被称为“小部件”),这似乎是C4.5的一个可靠实现,C4.5可能是最广泛使用且可能是最好的决策树实现。
O’Reilly网站有一个关于决策树构建和使用的教程,包括在Python中工作的决策树模块的源代码。