Scikit-learn:半监督朴素贝叶斯实现



我想使用Scikit-learn的半监督朴素贝叶斯(Bernoulli)实现。根据github中的这个链接,一年前有一些关于它的工作和讨论(类semiupervisednb)。另一方面,似乎有另一个不同的实现(函数fit_semi?),它似乎是由另一个用户后来完善的。但是,在当前的稳定版本中没有一个可用。

谁能给我一个例子,我如何使用这两个实现之一与当前版本的scikit-learn,以建立一个半监督朴素贝叶斯?谢谢。

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

编辑

我在我的项目中尝试了SemiSupervisedNB的代码,将未标记类的标签从-1更改为2(我使用来自NLTK的SKlearnClassifier,我的未标记类获得标签2)。但是,我得到ValueError:数组在计算d(模型的当前和以前参数之间的差异)时不得包含inf或nan,因为拦截数组包含inf值…知道怎么解决这个问题吗?

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

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

基本代码位于两个文件中:
  1. 当前主分支中的naive_bayes.py文件必须由emnb分支中的旧文件替换。

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

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

我刚刚创建了我自己的scikit-learn存储库分支,并将实验文件添加到当前稳定分支0.13.X之上。这个分支被称为0.13.X-emnb,可以在这里访问。如果您查看我最近的三个提交(1、2和3),您可以看到我更改了哪些文件和新创建了哪些文件。

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

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

但请记住,这是高度实验性的。这只是让旧代码工作的一个设置。

相关内容

  • 没有找到相关文章

最新更新