我想使用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
中,可以在这里访问。
当前主分支中的
naive_bayes.py
文件必须由emnb
分支中的旧文件替换。需要编辑类
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
。
但请记住,这是高度实验性的。这只是让旧代码工作的一个设置。