【问题标题】:Python weka wrapper: classify instances from another filePython weka wrapper:对来自另一个文件的实例进行分类
【发布时间】:2017-01-09 16:19:00
【问题描述】:

我正在使用Ubuntu 15.10Python 2.7,并且当前安装了python weka-wrapper 包。

我正在执行以下操作:(1) 根据我从.csv 文件加载的数据训练分类器。 (2) 从另一个.csv 文件加载第二组数据——该数据具有相同的标头,用于指定用于训练原始分类器的特征。 (3) 我正在尝试使用经过训练的分类器对从第二个文件加载的数据进行分类——实际上,我真正想要的是每个实例符合某个类的概率(但这是一个我将很快指出的旁白)

这是我的代码,它将经过训练的分类器和(第二个)文件名作为输入:

 def classifyData(classifier,datFile):

    loader = Loader(classname="weka.core.converters.CSVLoader")
    data = loader.load_file(datFile)
    data.class_is_last()

    preds = []
    dists = []

    iCount = 0
    for inst in data:
           iCount+=1
           pred = classifier.classify_instance(inst)
           dist = classifier.distribution_for_instance(inst)
           preds.append(pred)
           dists.append(dists)

    return preds,dists

注意:我还要注意,类变量(第二个数据文件中的最后一个特征)用“?”指定,表示我没有标签的数据。 p>

简短的问题: dist 变量是否包含类别的概率?如果没有,我将如何获得这些信息?

运行此函数会产生以下错误:

 Exception in thread "Thread-0" java.lang.ArrayIndexOutOfBoundsException: 1
at weka.classifiers.meta.Bagging.distributionForInstance(Bagging.java:816)
at weka.classifiers.AbstractClassifier.classifyInstance(AbstractClassifier.java:173)
 Traceback (most recent call last):
 File "parsFunc.py", line 33, in main
initProb = classifyData(classifTrain,ttDir+"temp.csv")
 File "parsFunc.py", line 136, in classifyData
pred = classifier.classify_instance(inst)
 File "/usr/local/lib/python2.7/dist-packages/weka/classifiers.py", line 105, in classify_instance
return self.__classify(inst.jobject)
 File "/usr/local/lib/python2.7/dist-packages/javabridge/jutil.py", line 852, in fn
raise JavaException(x)
 javabridge.jutil.JavaException: 1

不完全是这里出了什么问题。我知道第二个文件中的实例数量与用于训练模型的实例数量相同,并且标题相同。任何帮助将不胜感激!

【问题讨论】:

    标签: python-2.7 wrapper weka


    【解决方案1】:

    javabridge.jutil.JavaException: 1 不是很有帮助,我知道,但它指向一个ArrayIndexOutOfBoundsException。 Weka 要求训练和测试集(或您要对其进行预测的数据)具有精确相同的格式,不仅强制执行属性的顺序,而且强制执行标签的顺序(以防万一名义属性)。后者是必要的,因为 Weka 在内部将标签索引存储为数字,因此标签的内部表示,例如 1,在标签 {yes,no}{no,yes} 的情况下具有不同的含义。

    使用 CSV 文件时,无法确保标签的数量和/或标签的顺序,因为 CSVLoader 使用它遇到的任何字符串作为标签。 在您的情况下,您的类属性列中没有任何标签(它们都表示为缺失),这很可能导致您遇到该异常。

    怎么办?使用 ARFF 文件而不是 CSV 文件,因为它们有一个定义属性的标题(以及标称属性的标签)。通过将训练集的标头存储在磁盘上,您可以重新使用它来创建具有正确结构的测试集。

    快速回答:是的,dist 包含类概率,与类标签对齐。

    【讨论】:

    • 感谢您的建议。我想知道:有没有办法指定 arff 文件头输出——即在头中指定两个类的名称,然后编写一个包含这些测试实例的 arff 文件?我的代码更像是一个“现实世界”设置,其中动态生成新实例,写入文件,加载此文件,然后使用先前学习的分类器对实例进行分类。我想如果需要的话我可以手动编写代码来创建这个头文件......或者从作为 txt 文件打开的训练 arff 文件中复制它......
    • 我已经实现了将我的数据写入 arff 文件的代码,使用训练 arff 文件的标题——这绝对是我的代码现在可以工作的方式。谢谢您的建议。如果您更新答案以建议使用培训 arff 文件的标题来创建测试 arff 文件,我将接受您的回答。再次感谢!
    • 我已经相应地更新了答案。还回答了您的速成问题
    • 非常感谢!接受。
    猜你喜欢
    • 2015-02-01
    • 2012-10-13
    • 2012-02-14
    • 2021-07-24
    • 2015-01-21
    • 2011-07-27
    • 1970-01-01
    • 2015-10-21
    • 2014-03-02
    相关资源
    最近更新 更多