【发布时间】:2016-01-06 12:30:59
【问题描述】:
我正在尝试使用 Weka 对未标记的字符串进行分类,我不是数据挖掘方面的专家,所以我一直在为不同的术语而苦苦挣扎。我正在做的是在运行 M5Rules 分类器后提供训练数据并设置未标记的字符串,我实际上得到了一个输出,但我不知道这是什么意思:
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());
}
}
最后是几张截图,以防我在文件夹层次结构中出错:
【问题讨论】:
-
我想帮助您,但缺少重要信息。你的数据到底是什么样的?有什么特点? (我猜只是字符串。)可能的标签是什么?您的输出表明您只有一个实例。我还认为您不应该从测试数据中删除类标签,因为没有它您将无法评估分类器的性能。
-
@Sentry 好的,基本上训练和测试数据都是描述交易的两三行句子,例如travel-1.txt 的内容是“购买我们的 L.E 1100 电子优惠券(原价 L.E 1850)并在壮观的 MinaMark 度假村以 HB 为基础在双人标准间获得 2 晚 3 晚住宿”,所以我认为这是唯一的功能。目前可能的标签是[旅行或健康]。我只是想预测一笔交易作为开始,所以我只尝试一个实例。
标签: weka