Python weka包装器:从另一个文件中分类实例

时间:2016-09-01 17:10:20

标签: python-2.7 wrapper weka

我正在使用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

注意:我还应该注意,类变量(第二个数据文件中的最后一个功能)是用"?"指定的,表示我不知道的数据有标签。

快速搁置问题: 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

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

1 个答案:

答案 0 :(得分:1)

我知道,

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

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

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

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