当前位置: 首页 > 知识库问答 >
问题:

如何测试Weka文本分类(FilteredClassifier)

秦凯定
2023-03-14

我们看了很多这样的例子,但到目前为止没有运气。我想对自由文本进行分类。

  1. 配置文本分类器。使用StringToWordVector和LibSVM筛选分类器
  2. 训练分类器(添加大量文档,训练过滤文本)
  3. 序列化Filtered分类器到磁盘,退出应用程序

那以后吧

  1. 加载序列化的Filtered分类器
  2. 分类东西!

当我试图从磁盘中读取并分类东西时,它就可以了。所有文档和示例都显示了正在同时构建的训练列表和测试列表,在我的例子中,我试图在事后构建一个测试列表。

一个FilteredClassifier本身不足以创建一个测试实例,它的“字典”与原始训练集相同,那么我如何保存所有需要在以后分类的内容呢?

http://weka.wikispaces.com/UseJava代码中的WEKA只是说“从某处加载的实例”,而没有提到使用类似的字典。

ClassifierFramework cf = new WekaSVM();
if (!cf.isTrained()) {
  train(cf); // Train, save to disk
  cf = new WekaSVM(); // reloads from file
}
cf.test("this is a test");

最后会呕吐

java.lang.ArrayIndexOutOfBoundsException: 2
at weka.core.DenseInstance.value(DenseInstance.java:332)
at weka.filters.unsupervised.attribute.StringToWordVector.convertInstancewoDocNorm(StringToWordVector.java:1587)
at weka.filters.unsupervised.attribute.StringToWordVector.input(StringToWordVector.java:688)
at weka.classifiers.meta.FilteredClassifier.filterInstance(FilteredClassifier.java:465)
at weka.classifiers.meta.FilteredClassifier.distributionForInstance(FilteredClassifier.java:495)
at weka.classifiers.AbstractClassifier.classifyInstance(AbstractClassifier.java:70)
at ratchetclassify.lab.WekaSVM.test(WekaSVM.java:125)

共有1个答案

濮俭
2023-03-14

序列化包含训练数据定义的实例——类似字典?-序列化分类器时:

Instances trainInstances = ... //

Instances trainHeader = new Instances(trainInstances, 0);
trainHeader.setClassIndex(trainInstances .classIndex());

OutputStream os = new FileOutputStream(fileName);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(os);
objectOutputStream.writeObject(classifier);
if (trainHeader != null)
    objectOutputStream.writeObject(trainHeader);
objectOutputStream.flush();
objectOutputStream.close();

使渴望:

Classifier classifier = null;
Instances trainHeader = null;

InputStream is = new BufferedInputStream(new FileInputStream(fileName));
ObjectInputStream objectInputStream = new ObjectInputStream(is);
classifier = (Classifier) objectInputStream.readObject();
try { // see if we can load the header
    trainHeader = (Instances) objectInputStream.readObject();
} catch (Exception e) {
} 
objectInputStream.close();

使用trainHeader创建新的实例

int numAttributes = trainHeader.numAttributes();
double[] vals = new double[numAttributes];

for (int i = 0; i < numAttributes - 1; i++) {
    Attribute attribute = trainHeader.attribute(i);

    //If your attribute is nominal or string:       
    double value = attribute.indexOfValue(myStrVal); //get myStrVal from your source

    //If your attribute is numeric
    double value = myNumericVal; //get myNumericVal from your source

    vals[i] = value;
}

vals[numAttributes] = Instance.missingValue();

Instance instance = new Instance(1.0, vals);
instance.setDataset(trainHeader);
return instance;
 类似资料:
  • 所以我们在一组15k推文上运行多项式朴素贝叶斯分类算法。我们首先根据Weka的StringToWordVector函数将每条推文分解成一个单词特征向量。然后,我们将结果保存到一个新的arff文件中,作为我们的训练集提供给用户。我们用另一组5k推文重复这个过程,并使用从我们的训练集中导出的相同模型重新评估测试集。 我们想做的是输出weka在测试集中分类的每个句子及其分类...我们可以看到算法的性能和

  • 我试图在一个有32个属性的数据集上对分类机器学习算法进行数据建模,最后一列是目标类。我将属性数从32改进为6,我觉得这对我的分类模型更有用。 我尝试执行J48和一些增量分类算法。我期望输出结构包括混淆矩阵、更正和分类错误的实例、kappa值。 但是我的结果没有给出任何关于正确和错误分类实例的信息。此外,它也没有预测混淆矩阵和Kappa值。我收到的只是这样: ===总结=== 相关系数0.9482

  • 我对机器学习很陌生。对不起,如果我的英语有任何错误。 我使用weka J48分类来预测是真是假。我有将近999K的训练套件,我用来训练模型。我使用了3倍的交叉验证方法来训练模型,使我的准确率达到了约84%。 现在在存储模型之后。我试着在50k数据集上测试它。结果非常糟糕,其中50%是不匹配的。我有11个属性,包括名词和数字字段。 我不知道为什么会这样。 我有两个问题。 我怎样训练才能在测试集中表现

  • 问题内容: 我已经成功地训练了一个分类器(bayesnet),并构建了一个测试集 (ARFF格式),该测试集具有一个实例,但缺少一个值。 如何获得缺失值的预测?我已经 用GUI测试了两种ARFF结构(培训和测试)。他们工作。我根本不知道 如何获取预测值… 问题答案: 您要使用它将返回双精度值,即单值的预测。该方法适用于多个实例。

  • 问题内容: 我已经成功地训练了一个分类器(bayesnet),并构建了一个测试集(ARFF格式),该测试集具有一个实例,但缺少一个值。 如何获得缺失值的预测?我已经用GUI测试了两种ARFF结构(培训和测试)。他们工作。我根本不知道如何获取预测值… 问题答案: 您要使用它将返回双精度值,即单值的预测。该方法适用于多个实例。

  • 我正在Weka中使用Metacost函数。我想查看分类器的总成本。有人能告诉我如何查看总成本吗?我正在使用Weka GUI浏览器。 我尝试在分类选项卡的“更多选项”部分启用成本敏感评估选项。但是,由于我必须输入两次成本矩阵(一次在元成本中,一次在更多选项部分),系统会返回元成本的总成本还是成本敏感分类器?我有点困惑。 提前谢谢你