Weka中的实例分类

Posted

技术标签:

【中文标题】Weka中的实例分类【英文标题】:Classification of instances in Weka 【发布时间】:2012-03-25 21:20:55 【问题描述】:

我正在尝试在我的 C# 应用程序中使用 Weka。我使用 IKVM 将 Java 部分引入我的 .NET 应用程序。这似乎工作得很好。但是,当谈到 Weka 的 API 时,我不知所措。如果实例在我的应用程序中以编程方式传递并且不能作为 ARFF 文件提供,我将如何对实例进行分类。

基本上,我正在尝试使用 Weka 的分类器集成一个简单的共指分析。我直接在 Weka 中构建了分类模型并将其保存到磁盘,我的 .NET 应用程序从那里打开它并使用 Weka 的 IKVM 端口来预测类值。

这是我目前得到的:

    // This is the "entry" method for the classification method
    public IEnumerable<AttributedTokenDecorator> Execute(IEnumerable<TokenPair> items)
    
        TokenPair[] pairs = items.ToArray();
        Classifier model = ReadModel(); // reads the Weka generated model
        FastVector fv = CreateFastVector(pairs);

        Instances instances = new Instances("licora", fv, pairs.Length);
        CreateInstances(instances, pairs);

        for(int i = 0; i < instances.numInstances(); i++)
        
            Instance instance = instances.instance(i);
            double classification = model.classifyInstance(instance); // array index out of bounds?

            if(AsBoolean(classification))
                MakeCoreferent(pairs[i]);
        

        throw new NotImplementedException(); // TODO
    

    // This is a helper method to create instances from the internal model files
    private static void CreateInstances(Instances instances, IEnumerable<TokenPair> pairs)
    
        instances.setClassIndex(instances.numAttributes() - 1);
        foreach(var pair in pairs)
        
            var instance = new Instance(instances.numAttributes());
            instance.setDataset(instances);
            for (int i = 0; i < instances.numAttributes(); i++)
            
                var attribute = instances.attribute(i);
                if (pair.Features.ContainsKey(attribute.name()) && pair.Features[attribute.name()] != null)
                
                    var value = pair.Features[attribute.name()];
                    if (attribute.isNumeric()) instance.setValue(attribute, Convert.ToDouble(value));
                    else instance.setValue(attribute, value.ToString());
                
                else
                
                    instance.setMissing(attribute);
                
            
            //instance.setClassMissing();
            instances.add(instance);
        
    

    // This creates the data set's attributes vector
    private FastVector CreateFastVector(TokenPair[] pairs)
    
        var fv = new FastVector();

        foreach (var attribute in _features)
        
            Attribute att;
            if (attribute.Type.Equals(ArffType.Nominal))
            
                var values = new FastVector();
                ExtractValues(values, pairs, attribute.FeatureName);
                att = new Attribute(attribute.FeatureName, values);
            
            else
                att = new Attribute(attribute.FeatureName);

            fv.addElement(att);
        

        
            var classValues = new FastVector(2);
            classValues.addElement("0");
            classValues.addElement("1");
            var classAttribute = new Attribute("isCoref", classValues);
            fv.addElement(classAttribute);
        

        return fv;
    

    // This extracts observed values for nominal attributes
    private static void ExtractValues(FastVector values, IEnumerable<TokenPair> pairs, string featureName)
    
        var strings = (from x in pairs
                       where x.Features.ContainsKey(featureName) && x.Features[featureName] != null
                       select x.Features[featureName].ToString())
            .Distinct().ToArray();

        foreach (var s in strings)
            values.addElement(s);
    

    private Classifier ReadModel()
    
        return (Classifier) SerializationHelper.read(_model);
    

    private static bool AsBoolean(double classifyInstance)
    
        return classifyInstance >= 0.5;
    

由于某种原因,当我调用 model.classifyInstance(instance) 时,Weka 抛出了 IndexOutOfRangeException。我不知道为什么,也想不出如何解决这个问题。

我希望有人可能知道我哪里出错了。我发现的唯一 Weka 文档依赖于 ARFF 文件进行预测,我真的不想去那里。

【问题讨论】:

【参考方案1】:

出于某种奇怪的原因,DTNB 分类器引发了此异常(我在多数投票分类模型中使用了三个)。显然,不使用 DTNB “修复”了这个问题。

【讨论】:

以上是关于Weka中的实例分类的主要内容,如果未能解决你的问题,请参考以下文章

针对 WEKA 中的每个实例提取 SVM 分配的值

Weka中的分类解读

在 Weka 中对单个实例进行分类(MultilayerPerceptron)

类别先验在 Weka 分类中的作用

Weka中决策树和混淆矩阵中正确/错误分类实例之间的差异

Weka 中的不同分类结果:GUI vs Java 库