【问题标题】:Weka: Supervised Discretize issue and error during attribute selection "Not enough training instances"Weka:属性选择期间的监督离散问题和错误“没有足够的训练实例”
【发布时间】:2012-10-11 16:12:36
【问题描述】:

过去一个月左右,我一直在自学 Weka API(我是一名学生)。我正在编写一个程序,该程序将过滤一组特定的数据并最终为其构建一个贝叶斯网络,一周前我完成了我的离散化类和属性选择类。就在几天前,我意识到我需要将我的离散化函数更改为有监督的,并最终使用默认的 Fayyad & Irani 方法,在我这样做之后,我开始在我的属性选择类中出现这个错误:

Exception in thread "main" weka.core.WekaException: 
weka.attributeSelection.CfsSubsetEval: Not enough training instances with class labels (required: 1, provided: 0)!
at weka.core.Capabilities.test(Capabilities.java:1138)
at weka.core.Capabilities.test(Capabilities.java:1023)
at weka.core.Capabilities.testWithFail(Capabilities.java:1302)
at weka.attributeSelection.CfsSubsetEval.buildEvaluator(CfsSubsetEval.java:331)
at weka.attributeSelection.AttributeSelection.SelectAttributes(AttributeSelection.java:597)
at weka.filters.supervised.attribute.AttributeSelection.batchFinished(AttributeSelection.java:456)
at weka.filters.Filter.useFilter(Filter.java:663)
at AttributeSelectionFilter.selectionFilter(AttributeSelectionFilter.java:29)
at Runner.main(Runner.java:70)

我在更改之前的属性选择工作得很好,所以我认为我可能在我的离散化类中做错了。这个问题的另一部分与此有关,因为我还注意到我的离散类似乎并没有真正离散化数据;它只是将所有数字数据放入一个范围内,而不是像 Fayyad & Irani 那样战略性地对其进行分类。

这是我的离散化类:

import weka.core.Instances;
import weka.filters.Filter;
import weka.filters.supervised.attribute.Discretize;
import weka.filters.unsupervised.attribute.NumericToNominal;

public class DiscretizeFilter
{
    private Instances data;
    private boolean sensitiveOption;
    private Filter filter = new Discretize();

    public DiscretizeFilter(Instances data, boolean sensitiveOption)
    {
        this.data = data;
        this.sensitiveOption = sensitiveOption;
    }

    public Instances discreteFilter() throws Exception
    {
        NumericToNominal nm = new NumericToNominal();
        nm.setInputFormat(data);
        Filter.useFilter(data, nm);
        Instances nominalData = nm.getOutputFormat();

        if(sensitiveOption)//if the user wants extra sensitivity
        {
            String options[] = new String[1];
            options[0] = options[0];
            options[2] = "-E";
            ((Discretize) filter).setOptions(options);
        }
        filter.setInputFormat(nominalData);
        Filter.useFilter(nominalData,filter);
        return filter.getOutputFormat();
    }
}

这是我的属性选择类:

import weka.attributeSelection.BestFirst;
import weka.attributeSelection.CfsSubsetEval;
import weka.core.Instances;
import weka.filters.supervised.attribute.AttributeSelection;

public class AttributeSelectionFilter 
{
    public Instances selectionFilter(Instances data) throws Exception
    {
        AttributeSelection filter = new AttributeSelection();

        for(int i = 0; i < data.numInstances(); i++)
        {
            filter.input(data.instance(i));
        }
        CfsSubsetEval eval = new CfsSubsetEval();
        BestFirst search = new BestFirst();
        filter.setSearch(search);
        filter.setEvaluator(eval);

        filter.setInputFormat(data);
        AttributeSelection.useFilter(data, filter);

        return filter.getOutputFormat();
    }

    public int attributeCounter(Instances data)
    {
        return data.numAttributes();
    }
}

任何帮助将不胜感激!!!

【问题讨论】:

    标签: java attributes selection weka labels


    【解决方案1】:

    我想通了,是我误解了 Discretize 类中“outputFormat()”方法的描述。相反,我从 useFilter() 获得了过滤后的实例,这解决了我的问题!我只是给属性选择过滤器提供了错误的数据类型。

    【讨论】:

      【解决方案2】:

      Weka 在内部将属性值存储为双精度值。似乎引发了异常,因为您的数据集中的每个实例 (data) 都“缺少一个类”,即无论出于何种原因都被赋予了内部类属性值 NaN(“不是数字”)。我建议仔细检查 data's 类属性是否已正确创建/设置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-22
        • 1970-01-01
        • 1970-01-01
        • 2015-04-30
        • 1970-01-01
        • 2021-11-15
        • 2017-12-24
        相关资源
        最近更新 更多