关于使用独立数据集通过 weka 验证文本分类的问题

Posted

技术标签:

【中文标题】关于使用独立数据集通过 weka 验证文本分类的问题【英文标题】:questions about using a standalone dataset to validate text classification with weka 【发布时间】:2012-08-24 16:50:43 【问题描述】:

我正在尝试使用 weka 对垃圾邮件和非垃圾邮件进行分类。

将 100 条带标签的垃圾邮件和另外 100 万条带标签的非垃圾邮件作为训练数据集,我使用 stringtowordvector 作为过滤器来训练分类器。 crossValidateModel 的结果非常好。但是我想使用独立的测试集来评估分类器,以确保将任何其他 msg 从训练集中分类出来是可靠的。

我的问题:

我也必须在测试数据集上使用stringtowordvector,以创建独立于训练 arff 文件的独立 .arff 文件。两个数据集中出现的同一个词有 2 个不同的属性索引,分别在这 2 个 .arff 文件中。例如,单词“money”在训练.arff 文件中具有矩阵索引10,但在测试.arff 文件中它被索引为50th 属性。

我担心已经训练好的分类器会与 2 个数据集中的所有这些词不匹配,因为它们具有不同的矩阵索引。更具体地说,训练中的向量 1 1,2 1,3 5 .arff 代表 "i want to to to to to....",但在测试.arff 文件这个相同的向量代表"money does not not not not ....."。那么,这个验证如何可靠呢?

crossValidateModel 使用来自同一个 arff 文件的实例,因此 weka 必须正确匹配索引和单词。我的目标是用大量标记的数据集训练它,然后用它来分类任何单个未标记的味精。每次我想对单个味精进行分类时,我都必须将此味精转换为一个 .arff 文件,该文件具有与训练 .arff 文件完全不同的属性列表和矩阵索引。 (我没有使用 windows 工具,我在我的程序中使用了 weka .jar api)。 有什么帮助吗?

【问题讨论】:

您能否详细说明为什么向量以这种方式表示您在此处提供的两个示例的字符串。为什么你把“to”和“not”这个词重复了这么多次? 还要考虑交叉验证在评估分类器质量方面通常比手动拆分训练测试集更稳健。这是因为它确实对整个数据集的不同子集进行了多次训练和测试,然后对结果进行平均,确保您总体上而不是偶然做得很好。见 en.wikipedia.org/wiki/…> 致 Abhishek Shivkumar,对于不清楚的例子,我很抱歉。我只想表达:训练集和测试集以不同的方式表示字符串。例如,1 1,2 1,3 5-> “我要到到到”,1->我,2->想要,3->到,所以“到”重复5次。但可能在测试集中,.,1 1,2 1,3 5->"money not not not not not",where 1->money,2->does,3->not,here" not" 重复 5 次,相同的向量,但不同的字符串,weka 如何验证这个测试集的分类?我希望我清楚,tks to kaz:tks,我知道交叉验证会做得很好。但我的目标是在未来对新实例进行分类(例如用户生成的内容,而不是我们已经拥有的内容),所以使用训练有素的分类器来判断我的生产系统中的味精 【参考方案1】:

您需要从您的训练集创建一个特征映射文件,以实现您想要的。特征图文件通常采用以下格式:

someword:1
someotherword:2
yetanotherword:3
...

这有效地将每个单词映射到某个索引。因此,您要做的是遍历训练集中的所有文件,并将训练集中存在的每个单词映射到一个唯一的 id,该 id 将代表单词在 ARFF 中的索引。

假设您的训练集包含一个带有 "i want to to to to to make money" 字样的文件,那么您的特征图将如下所示:

i:1
want:2
to:3
make:4
money:5

您的 ARFF 中的属性如下所示:

@ATTRIBUTE i NUMERIC
@ATTRIBUTE want NUMERIC
@ATTRIBUTE to NUMERIC
@ATTRIBUTE make NUMERIC
@ATTRIBUTE money NUMERIC

每个属性代表单词在电子邮件中出现的次数。

然后,如果您想为测试集创建 ARFF,您需要遍历测试集中的所有文件,并且对于遇到的每个单词,请在特征图中查找。如果这个词在你的特征图中,你就知道在那个词映射到的索引处增加属性的值。如果这个词不在你的特征图中,那么你就忽略它,因为你的分类器没有接受过这个词的训练,甚至不知道这个词的存在。

这将使您的训练集的属性与您已完美对齐的任何测试集的属性保持一致。

我建议您将特征映射文件作为 Java HashMap<String, Integer> 从单词 (String) 映射到属性索引 (Integer) 读取,以便在获取测试集电子邮件的属性值时快速查找单词.

【讨论】:

以上是关于关于使用独立数据集通过 weka 验证文本分类的问题的主要内容,如果未能解决你的问题,请参考以下文章

weka中的一元类文本分类?

weka 中用于推文分类的 N 折交叉验证

使用 Weka 进行文本分类

如何在 Weka Explorer 中应用分类器?

Weka 中 SMO、NaiveBayes 和 BayesNet 分类器的不同结果

如何在 weka 中添加恶意特征进行分类作为数据集