2

我想使用 Scikit-learn 的半监督朴素贝叶斯(伯努利)的实现。根据github 中的这个链接,一年前有一些工作和讨论(半监督NB 类)。另一方面,似乎还有另一种不同的实现(函数 fit_semi?),它似乎后来被另一个用户打磨了。但是,它们都没有在当前的稳定版本中可用。

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

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

编辑

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

4

1 回答 1

4

几个月前,我在 GitHub 上打开了一个关于这个主题的问题。可以将相应的代码添加到 scikit-learn 的当前 master 分支。

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

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

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

  2. 需要对类进行编辑,LabelBinarizer这可以sklearn/preprocessing.py在 master 分支的文件中找到。整个类必须由其在@larsmansemnb分支中的定义替换。在那里,它驻留在文件中sklearn/preprocessing/__init__.py

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

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

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

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

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

于 2013-01-31T11:29:24.757 回答