我在Python中使用scikit-learn来开发分类算法来预测某些客户的性别。除此之外,我想使用朴素贝叶斯分类器,但我的问题是我有混合的分类数据(例如:“在线注册”,“接受电子邮件通知”等)和连续数据(例如:“年龄”,“长度”)会员资格“等)。我之前没有使用scikit,但我认为高斯朴素贝叶斯适用于连续数据,而伯努利朴素贝叶斯可用于分类数据。但是,由于我想在模型中使用两个分类和连续数据,我真的不知道如何处理这个问题。任何想法将不胜感激!
答案 0 :(得分:43)
您至少有两个选择:
通过计算每个连续变量的百分位数,然后使用百分位数作为bin边界对连续变量进行分箱,将所有数据转换为分类表示。例如,对于一个人的身高,创建以下垃圾箱:“非常小”,“小”,“常规”,“大”,“非常大”,确保每个垃圾箱包含大约20%的训练集人口。我们没有任何实用程序可以在scikit-learn中自动执行此操作,但它自己不应该太复杂。然后在数据的分类表示上插入唯一的多项式NB。
在数据的连续部分独立拟合高斯NB模型,在分类部分上拟合多项NB模型。然后通过将类赋值概率(使用predict_proba
方法)作为新要素np.hstack((multinomial_probas, gaussian_probas))
转换所有数据集,然后在新要素上重新设置新模型(例如新的高斯NB)。
答案 1 :(得分:8)
简单的答案:乘以结果!!它是一样的。
朴素贝叶斯基于贝叶斯定理应用每对特征之间的“天真”独立假设 - 意味着你计算贝叶斯概率依赖于特定特征而不保持其他特征 - 这意味着算法乘以每个概率一个特征与第二个特征的概率(我们完全忽略分母 - 因为它只是一个规范化)。
所以正确的答案是:
答案 2 :(得分:2)
希望我还不算太晚。我最近用NumPy编写了一个名为Mixed Naive Bayes的库。可以在训练数据特征上假设混合了高斯分布和分类(multinoulli)分布。
https://github.com/remykarem/mixed-naive-bayes
编写该库的目的是使API与scikit-learn相似。
在下面的示例中,假定前两个特征来自分类分布,后两个特征是高斯分布。在fit()
方法中,只需指定categorical_features=[0,1]
,表示第0列和第1列将遵循分类分布。
from mixed_naive_bayes import MixedNB
X = [[0, 0, 180.9, 75.0],
[1, 1, 165.2, 61.5],
[2, 1, 166.3, 60.3],
[1, 1, 173.0, 68.2],
[0, 2, 178.4, 71.0]]
y = [0, 0, 1, 1, 0]
clf = MixedNB(categorical_features=[0,1])
clf.fit(X,y)
clf.predict(X)
可通过pip install mixed-naive-bayes
安装的点。有关用法的更多信息,请参见README.md。拉取请求非常感谢:)
答案 3 :(得分:0)
@Yaron 的方法需要一个额外的步骤(下面 4.):
第 4 步是归一化步骤。以@remykarem 的 mixed-naive-bayes
为例(lines 268-278):
if self.gaussian_features.size != 0 and self.categorical_features.size != 0:
finals = t * p * self.priors
elif self.gaussian_features.size != 0:
finals = t * self.priors
elif self.categorical_features.size != 0:
finals = p * self.priors
normalised = finals.T/(np.sum(finals, axis=1) + 1e-6)
normalised = np.moveaxis(normalised, [0, 1], [1, 0])
return normalised
高斯模型和分类模型(分别为 t
和 p
)的概率在第 269 行(上面摘录中的第 2 行)中相乘,然后在第 275 行(第四行)中如 4.上面摘录中从底部开始的行)。