使用 LingPipe 使用朴素贝叶斯对数据进行分类

Posted

技术标签:

【中文标题】使用 LingPipe 使用朴素贝叶斯对数据进行分类【英文标题】:Classifying data with naive bayes using LingPipe 【发布时间】:2014-03-17 23:06:22 【问题描述】:

我想根据其内容将某些数据分类为不同的类别。我使用朴素贝叶斯分类器完成了它,我得到了一个输出作为它所属的最佳类别。但是现在我想将训练集中的新闻以外的新闻分类到“其他”类中。我无法将除训练数据之外的每个/每个数据手动添加到某个类中,因为它具有大量其他类别。那么有什么方法可以对其他数据进行分类吗?。

private static File TRAINING_DIR = new File("4news-train");
private static File TESTING_DIR = new File("4news-test");
private static String[] CATEGORIES =  "c1", "c2", "c3", "others" ;

private static int NGRAM_SIZE = 6;

public static void main(String[] args) throws ClassNotFoundException, IOException 
    DynamicLMClassifier<NGramProcessLM> classifier = DynamicLMClassifier.createNGramProcess(CATEGORIES, NGRAM_SIZE);
    for (int i = 0; i < CATEGORIES.length; ++i) 
        File classDir = new File(TRAINING_DIR, CATEGORIES[i]);
        if (!classDir.isDirectory()) 
            String msg = "Could not find training directory=" + classDir + "\nTraining directory not found";
            System.out.println(msg); // in case exception gets lost in shell
            throw new IllegalArgumentException(msg);
        

        String[] trainingFiles = classDir.list();
        for (int j = 0; j < trainingFiles.length; ++j) 
            File file = new File(classDir, trainingFiles[j]);
            String text = Files.readFromFile(file, "ISO-8859-1");
            System.out.println("Training on " + CATEGORIES[i] + "/" + trainingFiles[j]);
            Classification classification = new Classification(CATEGORIES[i]);
            Classified<CharSequence> classified = new Classified<CharSequence>(text, classification);
            classifier.handle(classified);
        
    

【问题讨论】:

不确定你在问什么。您的训练集仅比较 C1、C2、C3 类别,您想分类为 4 个类别:C1、C2、C3、其他? 我强烈建议您使用铅笔并确保您了解需要进行哪些计算。您面临的挑战与代码无关,而是与计算有关,因此您的问题可能最适合 stats.stackexchange.com 如果您需要任何计算帮助,请参阅以下说明:inf.ed.ac.uk/teaching/courses/inf2b/lectureSchedule.html @matcheek 我相信问题实际上是关于 LingPipe 库,而不是关于朴素贝叶斯本身。 @matcheek 这不仅与 lingpipe 库有关,还与朴素贝叶斯有关。我想将所有那些不属于 c1、c2、c3 的数据分类到“其他”类别中。我只是问我该如何实现它 我已经建立了一个避免频繁训练的中间模型。因此,在该模型中,我指定了测试部分。此代码是我首先尝试的。我在 c1 的不同文件夹中训练了内容,我指定了有关 c1 的数据并对其进行了训练。同样,我也必须训练“其他人”。所以我也必须将训练数据构建到“其他”文件夹。所以除了c1、c2、c3相关的数据之外,我还要收集大量的数据进行训练。应该有一些限制吧 【参考方案1】:

只需序列化对象...这意味着将中间对象写入文件,这将是您的模型...

那么对于测试,您只需将数据传递到模型中,无需每次都进行训练......这对您来说会很容易

【讨论】:

【参考方案2】:

朴素贝叶斯在计算时为您提供每个分类的“信心”

P(y|x) ~ P(y)P(x|y)

直到通过P(x) 标准化,x 成为类y 的一部分的概率。你可以简单地切断这个值,然后说,

cl(x) = "other" iff max_over y(P(y|x)) < T

其中T 可以是例如对训练集的最小置信度

T = min_over x and y in Training set( P(y|x) )

【讨论】:

我认为,从他/她的代码来看,问题是如何使用 LingPipe 库来做到这一点。 我不认为T = min_over x and y in Training set( P(y|x) ) 是个好主意,这是有偏见的,你对你训练的结果非常有信心......你可以在使用交叉验证的同时做到这一点跨度> @amit 如果您正在对标记数据进行培训,那么可以合理地假设,在任何情况下这些数据都不应该交给“其他人”,当然这只是一个最简单的想法/方法,可以通过多种方式“平滑”。例如,我们可以分析训练数据上的整个 P(y|x)(有无 CV),并选择阈值来切断异常值,例如通过置信椭圆等。 @jkbkot - 这里所说的问题不是实现的,因为它不是 NB 的“默认”用法。因此,核心问题是在思想层面解决实际任务,实施是完全不同的方面。 是的,我同意这个问题表述得很草率 :) 如果您查看代码和用户的其他问题,它看起来更像是关于 LingPipe 的问题。

以上是关于使用 LingPipe 使用朴素贝叶斯对数据进行分类的主要内容,如果未能解决你的问题,请参考以下文章

Python之朴素贝叶斯对展会数据分类

实战:朴素贝叶斯对文档进行分类

统计学习方法朴素贝叶斯对鸢尾花(iris)数据集进行训练预测

朴素贝叶斯对训练观察的数量敏感吗?

利用朴素贝叶斯对名字进行性别预测

实战|朴素贝叶斯分类对文档进行分类