Python weka 包装器:对来自另一个文件的实例进行分类
Python weka wrapper: classify instances from another file
我正在使用 Ubuntu 15.10
、Python 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 标签对齐。
我正在使用 Ubuntu 15.10
、Python 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 标签对齐。