Machine learning 类的WEKA分类似然

Machine learning 类的WEKA分类似然,machine-learning,weka,Machine Learning,Weka,我想知道WEKA中是否有一种方法可以为分类输出一些“最佳猜测” 我的场景是:例如,我使用交叉验证对数据进行分类,然后在weka的输出中,我得到如下结果:这是对该实例分类的3个最佳猜测。我想要的是,即使一个实例并没有正确分类,我也会得到该实例的3到5个最佳猜测的输出 例如: 类别:A、B、C、D、E 实例:1…10 而产出将是: 实例1 90%的可能性为A类,75%的可能性为B类,60%的可能性为C类 谢谢 我不知道你是否可以在本机上完成,但你可以得到每个类的概率,对它们进行排序,然后取前三个 您

我想知道WEKA中是否有一种方法可以为分类输出一些“最佳猜测”

我的场景是:例如,我使用交叉验证对数据进行分类,然后在weka的输出中,我得到如下结果:这是对该实例分类的3个最佳猜测。我想要的是,即使一个实例并没有正确分类,我也会得到该实例的3到5个最佳猜测的输出

例如:

类别:A、B、C、D、E 实例:1…10

而产出将是: 实例1 90%的可能性为A类,75%的可能性为B类,60%的可能性为C类


谢谢

我不知道你是否可以在本机上完成,但你可以得到每个类的概率,对它们进行排序,然后取前三个


您需要的函数是distributionForInstance(Instance Instance),它返回一个
double[]
,给出每个类的概率。

一般来说不是这样。并非所有分类器都提供您想要的信息——在大多数情况下(例如,对于决策树),决策是明确的(尽管可能不正确),没有置信值。您的任务需要能够处理不确定性的分类器(例如朴素贝叶斯分类器)


从技术上讲,最简单的方法可能是训练模型,然后对单个实例进行分类,Weka应该为您提供所需的输出。一般来说,您当然也可以对一组实例执行此操作,但我不认为Weka提供了这种开箱即用的功能。您可能需要自定义代码或通过API(例如在R中)使用它。

当您计算实例的概率时,您是如何做到这一点的

我已经发布了新实例的零件规则和数据,但就手动计算而言,我不确定如何执行此操作!谢谢

编辑:现在计算:

私有浮点[]getProbDist(字符串拆分){

//例如(52/2)表示52个正确分类的实例和2个错误分类的实例

    if(prob_dis.length > 2)
        return null;

    if(prob_dis.length == 1){
        String temp = prob_dis[0];
        prob_dis = new String[2];
        prob_dis[0] = "1";
        prob_dis[1] = temp; 
    }

    float p1 = new Float(prob_dis[0]);
    float p2 = new  Float(prob_dis[1]);
    // assumes two tags
    float[] tag_prob = new float[2];

    tag_prob[1] = 1 - tag_prob[1];
    tag_prob[0] = (float)p2/p1;

// returns double[] as being the probabilities

return tag_prob;    
}

Weka的API有一个名为Classifier.distributionForInstance()的方法,可用于获得分类预测分布。然后,您可以通过降低概率对分布进行排序,以获得前N个预测

下面是一个打印出来的函数:(1)测试实例的基本真值标签;(2)classifyInstance()中的预测标签;(3)distributionForInstance()中的预测分布。我在J48中使用了这个函数,但它应该可以用于其他分类器

输入参数是序列化模型文件(可以在模型训练阶段创建并应用-d选项)和ARFF格式的测试文件

public void测试(String modelFileSerialized,String testFileARFF)
抛出异常
{
//反序列化分类器。
分类器=
(分类器)weka.core.SerializationHelper.read(
模型文件化);
//加载测试实例。
实例testInstances=DataSource.read(testFileARFF);
//将每个实例中的最后一个属性标记为true类。
testInstances.setClassIndex(testInstances.numAttributes()-1);
int numTestInstances=testInstances.numInstances();
System.out.printf(“有%d个测试实例,\n”,numTestInstances);
//循环每个测试实例。
对于(int i=0;i
我打算通过API使用它