Python weka 包装器:对来自另一个文件的实例进行分类

Python weka wrapper: classify instances from another file

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

我正在执行以下操作:(1) 根据我从 .csv 文件加载的数据训练 classifier。 (2) 从另一个 .csv 文件加载第二组数据——该数据具有相同的 header 指定用于训练原始 class生成器。 (3) 我正在尝试使用经过训练的 classifier 来 class 验证从第二个文件加载的数据——实际上,我真正想要的是,是每个实例符合某个 class 的概率(但这是我稍后会指出的旁白)

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

 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

注意:我还应该注意到class变量(第二个数据文件中的最后一个特征)用“?”指定,代表数据我没有标签。

小问题: dist 变量是否包含 class 的概率?如果没有,我如何获得这些信息?

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

 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

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

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

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

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

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