我正在尝试使用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());
}
}最后是几个屏幕截图,以防我在文件夹层次结构中出错:



发布于 2013-03-10 23:17:48
tl;dr:
问题是你如何初始化你的数据集。尽管weka通常将类放在最后一列,但TextDirectoryLoader不会。
dataTraining.setClassIndex(dataRaw.numAttributes() - 1);
dataTest.setClassIndex(dataTest.numAttributes() - 1);(第一行无论如何都是错误的,因为您使用了原始数据集中的属性数,但选择了已经过滤的数据集的列。)
如果您随后运行您的代码,您将得到以下结果:
weka.classifiers.functions.LinearRegression: Cannot handle binary class!正如我已经猜到的,M5Rules不是分类器,而是用于回归。如果您使用像J48或RandomForest这样的分类器,您将获得更合理的输出。只需更改行即可
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 发布于 2016-01-06 12:31:00
以防其他人在M5P中遇到同样的错误,请尝试查看Arff是否只是一个头文件或空文件。
否则请尝试
model.buildClassifier(....) 而不是
model.setClassifier(....); 这为我解决了这个问题。
https://stackoverflow.com/questions/15280072
复制相似问题