我正在使用Ubuntu 15.10
,Python 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
这里不完全是错的。我知道第二个文件中的实例数与用于训练模型的实例数相同,并且标题是相同的。任何帮助将不胜感激!
答案 0 :(得分:1)
javabridge.jutil.JavaException: 1
不是很有帮助,但它指的是ArrayIndexOutOfBoundsException
。 Weka要求训练和测试集(或您想要预测的数据)具有精确相同的格式,不仅强制执行属性的顺序,还要强制标签的顺序(以防万一)名义属性)。后者是必要的,因为Weka在内部将标签索引存储为数字,因此标签的内部表示(例如1)在标签{yes,no}
而不是{no,yes}
的情况下具有不同的含义。 / p>
使用CSV文件时,无法确保标签数量和/或标签顺序,因为CSVLoader
使用它遇到的任何字符串作为标签。
在您的情况下,您的类属性列中没有任何标签(它们都表示为缺失),这很可能导致您遇到的异常。
怎么办?使用ARFF文件而不是CSV文件,因为它们具有定义属性的标头(以及标称属性的标签)。通过将训练集的标题存储在磁盘上,您可以重新使用它来创建具有正确结构的测试集。
快速回答:是的,dist
包含类概率,与类标签对齐。