如何将属性纳入ADTree的分类中

时间:2015-03-18 08:30:40

标签: attributes classification weka

我的问题如下:

我正在使用weka的ADTree进行分类。我在具有超过1700个属性的数据集上构建分类器。生成的ADTree仅使用它们中的一小部分来对实例进行分类(使用了近10个属性)。

我的问题是,由于我的实例的属性计算很耗时,我可以检索ADTree使用的属性标识符吗? 我的目标是只计算相关属性,让另一个属性为默认值,以避免非常长且无用的计算。

提前致谢。

1 个答案:

答案 0 :(得分:0)

最后找到解决方案。不得不扩展ADTree以实现我的目标

public class ExtendedADTree extends ADTree {

    private static final long   serialVersionUID    = 1L;

    /**
     * @param dataset
     *        The dataset to use to retrieve attributes labels.
     *
     * @return Returns the list of label used to predict the class of an instance knowing the
     *         dataset used to compute the tree.
     */

    public List<String> getPredictionNodeLabels(final Instances dataset) {
        final List<String> result = new LinkedList<>();

        // Initialize the list of splitter node to explore.
        final List<Splitter> nodesToExplore = new LinkedList<>();
        @SuppressWarnings("unchecked")
        final Enumeration<Splitter> rootChildrens = this.m_root.children();
        Collections.list(rootChildrens).forEach(child -> nodesToExplore.add(child));

        while (!(nodesToExplore.isEmpty())) {
            // while there is node to explore get the splitter childrens of the current node and add
            // them to the queue
            final Splitter currentNode = nodesToExplore.remove(0);

            // add the label of the splitter node to the result
            result.add(currentNode.attributeString(dataset));

            // add the childrens to the nodesToexplore list.
            for (int branch_number = 0; branch_number < currentNode.getNumOfBranches(); branch_number++) {
                final PredictionNode child = currentNode.getChildForBranch(branch_number);
                final Enumeration<Splitter> childChildren = child.children();
                Collections.list(childChildren).forEach(childOfChild -> nodesToExplore.add(childOfChild));
            }
        }

        return result;
    }
}

此方法返回属性的决策节点标签列表。