2013-03-07 161 views
1

我想分类使用Weka未标记的字符串,我不是数据挖掘方面的专家,所以我一直在努力与不同的条款。我在做什么是我所提供的训练数据和设置运行M5Rules分类后无标签的字符串,我真的开始输出,但我不知道是什么意思:Weka分类和预测类

run: 
{17 1,35 1,64 1,135 1,205 1,214 1,215 1,284 1,288 1,309 1,343 1,461 1,493 1,500 1,552 1,806 -0.038168} | -0.03816793850062397 
-0.03816793850062397 -> 

Results 
====== 

Correlation coefficient     0  
Mean absolute error      0  
Root mean squared error     0  
Relative absolute error     0  % 
Root relative squared error    0  % 
Total Number of Instances    1  

BUILD SUCCESSFUL (total time: 1 second) 

的源代码如下:

public Categorizer(){ 

    try{ 

     //*** READ ARRF FILES */////////////////////////////////////////////////////// 
     //BufferedReader trainReader = new BufferedReader(new FileReader("c:/Users/Yehia A.Salam/Desktop/dd/training-data.arff"));//File with text examples 
     //BufferedReader classifyReader = new BufferedReader(new FileReader("c:/Users/Yehia A.Salam/Desktop/dd/test-data.arff"));//File with text to classify 

     // Create trainning data instance 
     TextDirectoryLoader loader = new TextDirectoryLoader(); 
     loader.setDirectory(new File("c:/Users/Yehia A.Salam/Desktop/dd/training-data")); 
     Instances dataRaw = loader.getDataSet(); 

     StringToWordVector filter = new StringToWordVector(); 
     filter.setInputFormat(dataRaw); 
     Instances dataTraining = Filter.useFilter(dataRaw, filter); 
     dataTraining.setClassIndex(dataRaw.numAttributes() - 1); 

     // Create test data instances 
     loader.setDirectory(new File("c:/Users/Yehia A.Salam/Desktop/dd/test-data")); 
     dataRaw = loader.getDataSet(); 
     Instances dataTest = Filter.useFilter(dataRaw, filter); 
     dataTest.setClassIndex(dataTest.numAttributes() - 1); 


     // Classify 
     FilteredClassifier model = new FilteredClassifier(); 
     model.setFilter(new StringToWordVector()); 
     model.setClassifier(new M5Rules()); 
     model.buildClassifier(dataTraining); 

     for (int i = 0; i < dataTest.numInstances(); i++) { 
      dataTest.instance(i).setClassMissing(); 
      double cls = model.classifyInstance(dataTest.instance(i)); 
      dataTest.instance(i).setClassValue(cls); 
      System.out.println(dataTest.instance(i).toString() + " | " + cls); 
      System.out.println(cls + " -> " + dataTest.instance(i).classAttribute().value((int) cls)); 

      // evaluate classifier and print some statistics 
      Evaluation eval = new Evaluation(dataTraining); 
      eval.evaluateModelOnce(cls, dataTest.instance(i)); 
      System.out.println(eval.toSummaryString("\nResults\n======\n", false)); 
     } 

    } 
    catch(FileNotFoundException e){ 

     System.err.println(e.getMessage()); 
    } 
    catch(IOException i){ 

     System.err.println(i.getMessage()); 
    } 
    catch(Exception o){ 

     System.err.println(o.getMessage()); 
    } 
    } 

最后一对夫妇的情况下,屏幕截图的我做了什么错在文件夹层次结构: unlabeled string training data for the health class training data for the travel class

+0

我想帮助你,但缺少重要信息。你的数据到底是什么样的?什么是功能? (我只是猜测字符串。)可能的标签是什么?你的输出是暗示你只有一个实例。我也认为你不应该从测试数据中删除类标签,因为如果没有它,你将无法评估分类器的性能。 – Sentry 2013-03-08 15:44:59

+0

@Sentry基本上,训练和测试数据都是描述交易的两三行句子,例如, travel-1.txt的内容为“购买我们的LE 1100电子优惠券(原始价值LE 1850),并在壮观的MinaMark度假村的HB基础上的双人标准房中获得3晚住宿,所以我认为这是唯一的功能。现在可能的标签是[旅行或健康]。我只是试图预测一笔交易,因此我只尝试一个实例。 – 2013-03-08 16:37:03

回答

1

TL;博士:

  • 你的类指标设置为随机特征
  • 你必须使用一个分类,而不是回归算法

问题是你如何初始化自己的数据集。尽管weka通常将类放在最后一列,但TextDirectoryLoader不会。其实,你并不需要手动设置类指数,它已经被设置,所以删除线

(第一行是错误的,无论如何,因为你使用属性的数量从原始数据。集,而是选择已过滤的数据集的列)

如果然后运行你的代码,你会得到这样的:

weka.classifiers.functions.LinearRegression: Cannot handle binary class! 

正如我已经猜到了,M5Rules不是一个分类,但对于回归。如果使用J48RandomForest等分类器,则会得到更明智的输出结果。只要改变行

model.setClassifier(new M5Rules()); 

model.setClassifier(new RandomForest()); 

至于你的输出,这里是我做的是:

{17 1,35 1,64 1,135 1,205 1,214 1,215 1,284 1,288 1,309 1,343 1,461 1,493 1,500 1,552 1,806 -0.038168} | -0.03816793850062397 
-0.03816793850062397 -> 

是线的结果

System.out.println(dataTest.instance(i).toString() + " | " + cls); 
System.out.println(cls + " -> " + dataTest.instance(i).classAttribute().value((int) cls)); 

因此,您会看到您的实例序列号为sparse ARFF,其次是|和该类的功能。

通常情况下,类应为整数,但是从M5Rules的文件,我得到这是回归问题分类,这样你就不会得到独立的类,但连续的值,你的情况-0.03816793850062397

由于您(错误地)将数字特征设置为类标签,因此M5Rules不会发出抱怨并给出输出。如果你使用实际的分类器,你会得到你的标签“健康”或“旅行”。

其余部分是有关分类器性能的标准统计信息,但对于只有一个分类器实例它们是无用的。它看起来像一个样本被正确分类,所以所有的错误都是零。

Correlation coefficient     0  
Mean absolute error      0  
Root mean squared error     0  
Relative absolute error     0  % 
Root relative squared error    0  % 
Total Number of Instances    1  

+0

但M5rules正确的算法在这里使用?取决于我上面的问题? – 2013-03-10 16:28:16

+0

@ YehiaA.Salam嗯,你想做什么?你可以使用任何分类器,BayesNet,SVM,kNN,J48 ... – Sentry 2013-03-10 16:34:40

+0

@ YehiaA.Salam你可以尝试另一种算法,看看它是否更好? – Sentry 2013-03-11 12:12:44

0

万一别人有M5P得到了同样的错误,请尝试,看看是否ARFF只是一个标题或空。

否则试试

model.buildClassifier(....) 

代替

model.setClassifier(....); 

这解决了这个问题对我来说。