【问题标题】:Scikit-learn: is semi-supervised Naive Bayes implementation available?Scikit-learn:半监督朴素贝叶斯实现可用吗?
【发布时间】:2013-01-02 19:53:12
【问题描述】:

我想使用 Scikit-learn 的半监督朴素贝叶斯 (Bernoulli) 的实现。根据this link in github 的说法,一年前有一些工作和讨论(半监督NB 类)。另一方面,似乎有another different implementation (function fit_semi?) which seems it was polished by another user afterwards。但是,它们都没有在当前的稳定版本中可用。

有人可以向我展示一个示例,说明如何在当前版本的 scikit-learn 中使用这两种实现之一来构建半监督朴素贝叶斯?谢谢。

P.S.:我正在使用来自 NLTK 的 scikit-learn 分类器和 SklearnClassifier 类

编辑

我在我的项目中尝试了 SemiSupervisedNB 的代码,将未标记类的标签从 -1 更改为 2(我正在使用 NLTK 中的 SKlearnClassifier,我的未标记类获得标签 2)。但是,我收到 ValueError: array must not contain infs or NaNs when computing d(模型的当前参数和先前参数之间的差异),因为截距数组包含 inf 值......关于如何解决这个问题的任何想法?

【问题讨论】:

  • 您可以尝试检查分支并进行处理,但我不确定它目前是否处于良好状态 - 它也远远落后于当前的稳定。您可以尝试将分支变基/合并到当前主控上。但是如果你不熟悉 git / 项目,你可能会遇到一些问题。或者只是等待@larsmans 发表评论并告诉你该怎么做;)
  • 感谢您的回复。不幸的是,我现在没有太多时间审查代码......我也会等待@ogrisel :)
  • 很抱歉,但我真的没有时间解决这个问题,甚至没有时间指导你如何去做。半监督的 NB 应该可以工作(一位同事几个月前尝试过),但与当前的 scikit-learn 完全不匹配。正如@amueller 建议的那样,您可以尝试重新设置它。
  • @AM2 几个月前我开了一个issue on GitHub 关于这个话题。我找到了一种实现SemiSupervisedNB 工作的方法。但是,到目前为止,我还没有测试过所描述的对主分支的更改是否会影响其他分类器或代码。谨慎尝试!
  • @Peter Stahl 谢谢。我在我的项目中尝试了 SemiSupervisedNB 的代码,将未标记类的标签从 -1 更改为 2(我正在使用 NLTK 中的 SKlearnClassifier,我的未标记类获得标签 2)。但是,我收到 ValueError: array must not contain infs or NaNs when computing d(模型的当前参数和先前参数之间的差异),因为截距数组包含 inf 值......关于如何解决这个问题的任何想法?

标签: python classification bayesian scikit-learn bayesian-networks


【解决方案1】:

几个月前,我就这个话题开了一个issue on GitHub。可以将各自的代码添加到 scikit-learn 的当前 master 分支中。

用户@larsmans 大约一年前在文件sklearn/naive_bayes.py 中添加了一个实验类SemisupervisedNB。此代码位于他的分叉 scikit-learn 存储库的分支 emnb 中,可以访问 here

基本代码位于两个文件中:

  1. 当前 master 分支中的文件 naive_bayes.py 必须替换为 emnb 分支中的旧文件。

  2. 需要编辑 LabelBinarizer 类,可以在 master 分支的文件 sklearn/preprocessing.py 中找到。整个类必须由其在@larsmans 的emnb 分支中的定义替换。在那里,它位于文件sklearn/preprocessing/__init__.py

尽管一年来朴素贝叶斯分类器的代码没有太大变化,但还是添加了一些错误修复。因此,保留文件 naive_bayes.py 和类 LabelBinarizer 的当前版本并给实验版本不同的名称是有意义的。

我刚刚创建了自己的 scikit-learn 存储库分支,并将实验文件添加到当前稳定分支 0.13.X 之上。这个分支叫做0.13.X-emnb,可以访问here。如果您查看我最近的三个提交(123),您会看到我已更改和新创建的文件。

由于SemisupervisedNB 不能与其他分类器的最新版本一起使用,我刚刚在naive_bayes.py 旁边添加了一个名为semisupervised_naive_bayes.py 的新模块。在那里,您可以在重命名的版本中找到旧版本的分类器,例如SemiMultinomialNB 而不是 MultinomialNB,这样它们就不会与分类器的最新版本发生冲突。同样,我在LabelBinarizer 旁边添加了一个类SemisupervisedLabelBinarizer(名称的选择有点不幸,但至少它的用途很明确)。

因此,如果您想使用分类器的半监督版本,请使用模块 sklearn.semisupervised_naive_bayes。对于当前版本,请使用模块sklearn.naive_bayes

但请记住,这是高度实验性的。这只是使旧代码正常工作的设置。我没有搜索错误。

【讨论】:

  • 感谢您的时间和耐心,终于让它在当前分支上运行。我不得不将 semisupervised_naive_bayes.py 的第 501 行和第 448 行分别更改为“SemiBaseDiscreteNB”和“SemiBernoulliNB”。
  • @AM2 没问题。不客气。 :) 我自己需要半监督版本,这就是为什么我如此详细地处理了这个问题。我很高兴能帮上忙。
  • @AM2 哦,我明白了,我已经更改了 448 和 501 两条被遗忘的行中的类名。谢谢你告诉我。
  • 再次感谢!为了使用这个分类器,我修改了 NLTK 的 SKlearnClassifier。当使用 relabel_all=false 运行它时,EM 总是在 2 次迭代后停止,这看起来不太好......顺便说一句,semisupervised_naive_bayes.py 的第 567 行似乎在 relabel_all=false 的情况下执行,但是 X_unlabeled 没有定义,因为条件第 545 行中的 if 块没有被清除。这似乎是原始实现的错误,但我不确定
  • @AM2 你是对的,这似乎确实是一个错误。你知道如何解决这个问题吗?
猜你喜欢
  • 2015-09-16
  • 2018-06-06
  • 2012-10-13
  • 2021-02-09
  • 2017-06-21
  • 2016-05-01
  • 2012-04-09
  • 2018-06-19
  • 2018-08-31
相关资源
最近更新 更多