2017-04-16 1 views
0

Il y a un problème de pré-traitement de données avec l'aide de la v0.3.10 python-WEKA-wrapper que j'avais source de confusion pour deux journées.Exception avec l'étiquette double lorsque les données de transformation de numérique à la valeur nominale via v0.3.10 python-WEKA-emballage

J'utilise le create_instances_from_matrices() pour générer mon ensemble de données de ndarray à instance, qui est de type numérique.

Et puis enregistrez l'ensemble de données dans un fichier arff (numeric_data.arff) via

Saver(classname="weka.core.converters.ArffSaver") 

ensuite essayé de transformer mon jeu de données type nominal avec

Filter(classname="weka.filters.unsupervised.attribute.NumericToNominal", options=["-R", "first-last"]) 

La sortie de message d'exception comme :

Exception dans le fil "Thread-0" java.lang.Illeg alArgumentException: A attribut nominal (x2) ne peut pas avoir des étiquettes en double (1).

Cependant, avec le même jeu de données (numeric_data.arff) Je généré, il peut être transformée de type nominal par Weka GUI Explorateur v3.8.1 avec succès.

Je vais être apprécié avec une idée peut aider.

Merci!

Répondre

0

Le problème est très probablement que vous avez de petites valeurs (< 10^6), que Weka tous tourne à 0.0 lors de l'enregistrement (Weka ne sort que 6 chiffres après la virgule décimale par défaut). Si vous appliquez votre filtre à l'ensemble de données avant de l'enregistrer, cela devrait fonctionner.

Vous pouvez également indiquer à ArffSaver le nombre de décimales que vous souhaitez utiliser lors de l'enregistrement du fichier (option -decimal). Voir aussi le Javadoc de la classe ArffSaver.

+0

Je l'avais essayé, mais encore échoué sans enregistrer dans un fichier arff. Et aussi, ces valeurs des étiquettes dupliquées sont toutes 1 (entières), pas de petites valeurs. –

+0

Le python-WEKA-emballage a une [liste de diffusion] (https://groups.google.com/forum/#!forum/python-weka-wrapper) que vous pouvez publier votre script et le jeu de données pour l'analyse. – fracpete

0

(extrait de discussion sur la liste de diffusion, pour répondre correctement à cette question)

Le filtre NumericToNominal est un filtre très stupide. Son seul but était de disposer d'un moyen simple de convertir des valeurs numériques censées être des valeurs catégorielles (par exemple, 1.0, 2.0 en étiquettes 1 et 2). Lorsque vous convertissez des nombres en étiquettes, les décimales sont coupées après 6 décimales. Cependant, il n'a pas vérifié si cela pouvait conduire à générer des étiquettes en double. Par exemple, 2.00000001 et 2.0 généreront tous les deux 2 (ou 2.0) comme étiquette.

Vous pouvez utiliser le filtre NumericCleaner pour supprimer ces décimales arrière, .: par exemple

# round to specified number of decimals 
decimals = 3 
cleaner = Filter(classname="weka.filters.unsupervised.attribute.NumericCleaner", options=["-R", "first-last", "-decimals", str(decimals)]) 
cleaner.inputformat(data) 
data = cleaner.filter(data)