【问题标题】:Using Weka NaiveBayes with Matlab在 Matlab 中使用 Weka NaiveBayes
【发布时间】:2019-11-05 08:38:55
【问题描述】:

我在 Weka 中创建了一个 NaiveBayes 模型。我将模型导出到磁盘。我现在想将此模型注入 MATLAB 2018,以便通过我收到的一些数据检查它的性能。

我在 MATLAB 中加载我的模型,方法如下:

loadedModel = weka.core.SerializationHelper.read('myweka.model');

然后我创建一个 Weka Instance 对象,并让它包含这些数据:

instance = infrequent,low,high,medium-high,high,medium,medium,low,low

如果我运行这两个命令:

loadedModel.distributionForInstance(instance)
loadedModel.classifyInstance(instance)

我看到以下输出:

0.0001
0.9999
1

这对我来说很奇怪,因为如果我在 WEKA ui 中观察到相同的记录,我会看到概率为 0.993 和 0.007 的相同实例,分类为“2”。 (我可以在 WEKA 中多次从磁盘加载相同的模型,并重现此行为,这是正确的)经过进一步调查,我注意到无论我的 Instance 对象具有的属性顺序如何,我总是得到相同的概率输出和通过 MATLAB 调用模型进行相同的分类。

网上有一些帖子有同样的问题,比如:

Always getting the same output

Weka - Classifier returns the same distribution for any input

但是,调用“instance.setClassMissing()”的推荐解决方案并没有解决我的问题。有什么我遗漏的,或者可以尝试做些什么来进一步解决问题吗?

【问题讨论】:

    标签: matlab machine-learning weka


    【解决方案1】:

    您的测试实例是否与您的训练集具有相同的结构?如果没有,您需要提供相同的结构。

    Weka 索引名义属性并在内部存储索引。所以训练文件中的名义属性顺序很重要。例如,如果您的属性在训练中被映射为低=>0,高=>1,您需要在测试集中像这样映射它们。通常这是通过用模型序列化火车头来实现的。

    创建火车头的示例代码:

    Instances trainHeader = new Instances(instances, 0);
    trainHeader.setClassIndex(instances.classIndex());
    

    创建新实例时设置其数据集:

    Instance instance = ...
    instance.setDataset(trainHeader);
    

    【讨论】:

      猜你喜欢
      • 2012-03-22
      • 2012-02-05
      • 2012-02-14
      • 2018-03-12
      • 2011-08-21
      • 2014-03-28
      • 2014-09-12
      • 2013-11-25
      • 2015-03-21
      相关资源
      最近更新 更多