2017-02-13 4 views
0

Я работаю с Weka в Python. Я бы хотел использовать weka.attributeSelection.ChiSquaredAttributeEval для выбора атрибутов. Тем не менее, я неоднократно получаю эту ошибку:python-weka-wrapper: ChiSquaredAttributeEval класс не найден

Failed to get class weka/attributeSelection/ChiSquaredAttributeEval 
Exception in thread "Thread-1" java.lang.NoClassDefFoundError: weka/attributeSelection/ChiSquaredAttributeEval 
Caused by: java.lang.ClassNotFoundException: weka.attributeSelection.ChiSquaredAttributeEval 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:424) 
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:357) 

Я могу использовать другой метод выбора атрибута, хотя, weka.attributeSelection.CfsSubsetEval. Может ли кто-нибудь просветить меня, что я должен сделать сейчас, чтобы работать ChiSquaredAttributeEval?

(я где-то читал, что я должен вручную установить class_path в jvm, как в jvm.start(class_path=mypath), но это не помогло.)

Я использую Python 2.7.13, питон-ВЕКА-обертка 0,3. 10, Java 1.7.0.

ответ

1

Оценка атрибута ChiSquaredAttributeEval не является частью ядра Weka, но отдельно package. Поэтому вам нужно запустить JVM с пакетами, включенными с использованием jvm.start(packages=True) (из документации API).

Вот рабочий пример:

import sys 
import weka.core.jvm as jvm 
import weka.core.packages as pkg 
from weka.core.converters import Loader 
from weka.attribute_selection import ASSearch 
from weka.attribute_selection import ASEvaluation 
from weka.attribute_selection import AttributeSelection 

# start JVM with packages 
jvm.start(packages=True) 

# package installed? 
chisq_name = "chiSquaredAttributeEval" 
chisq_installed = False 
for p in pkg.installed_packages(): 
    if p.name == chisq_name: 
     chisq_installed = True 
if not chisq_installed: 
    pkg.install_package(chisq_name) 
    print("pkg %s installed, please restart" % chisq_name) 
    jvm.stop() 
    sys.exit(1) 

# load a dataset 
data_file = "/adjust/the/path/anneal.arff" 
print("Loading dataset: " + data_file) 
loader = Loader("weka.core.converters.ArffLoader") 
anneal_data = loader.load_file(data_file) 
anneal_data.class_is_last() 

# perform attribute selection 
search = ASSearch(classname="weka.attributeSelection.Ranker", options=["-N", "-1"]) 
evaluation = ASEvaluation(classname="weka.attributeSelection.ChiSquaredAttributeEval") 
attsel = AttributeSelection() 
attsel.search(search) 
attsel.evaluator(evaluation) 
attsel.select_attributes(anneal_data) 
print("# attributes: " + str(attsel.number_attributes_selected)) 
print("attributes: " + str(attsel.selected_attributes)) 
print("result string:\n" + attsel.results_string) 

jvm.stop() 
+0

Пробовал ваше предложение, но она по-прежнему не работает ... –

+0

я добавил рабочий пример. – fracpete

+0

Я думаю, что ваш код, вероятно, работает. Я столкнулся с другой ошибкой: «javabridge.jutil.JavaException: не удалось создать временный файл» при установке пакета. Любая идея, как это исправить? –

Смежные вопросы