Python 使用scikit学习在朴素贝叶斯分类器中混合分类数据和连续数据

Python 使用scikit学习在朴素贝叶斯分类器中混合分类数据和连续数据,python,machine-learning,data-mining,classification,scikit-learn,Python,Machine Learning,Data Mining,Classification,Scikit Learn,我正在使用Python中的scikit learn开发一个分类算法,以预测特定客户的性别。除其他外,我想使用Naive Bayes分类器,但我的问题是,我混合了分类数据(例如:“在线注册”、“接受电子邮件通知”等)和连续数据(例如:“年龄”、“会员长度”等)。我以前很少使用scikit,但我认为高斯朴素贝叶斯适合于连续数据,而伯努利朴素贝叶斯可以用于分类数据。然而,由于我希望在我的模型中同时包含分类数据和连续数据,所以我真的不知道如何处理这个问题。任何想法都将不胜感激 您至少有两种选择: 通过

我正在使用Python中的scikit learn开发一个分类算法,以预测特定客户的性别。除其他外,我想使用Naive Bayes分类器,但我的问题是,我混合了分类数据(例如:“在线注册”、“接受电子邮件通知”等)和连续数据(例如:“年龄”、“会员长度”等)。我以前很少使用scikit,但我认为高斯朴素贝叶斯适合于连续数据,而伯努利朴素贝叶斯可以用于分类数据。然而,由于我希望在我的模型中同时包含分类数据和连续数据,所以我真的不知道如何处理这个问题。任何想法都将不胜感激

您至少有两种选择:

  • 通过计算每个连续变量的百分位数,然后使用百分位数作为bin边界对连续变量进行装箱,将所有数据转换为分类表示。例如,针对一个人的身高,创建以下箱子:“非常小”、“很小”、“普通”、“很大”、“非常大”,确保每个箱子包含训练集中大约20%的人口。在scikit learn中,我们没有任何工具可以自动执行此操作,但自己完成此操作应该不会太复杂。然后在数据的分类表示上拟合一个唯一的多项式NB

  • 在数据的连续部分独立拟合高斯NB模型,在分类部分独立拟合多项式NB模型。然后通过将类分配概率(使用
    预测概率
    方法)作为新特征来转换所有数据集:
    np.hstack((多项式概率,高斯概率))
    ,然后在新特征上重新构建新模型(例如新的高斯NB)


    • 简单的答案是:乘以结果!!都一样

      基于“朴素”应用贝叶斯定理的朴素贝叶斯假设每对特征之间的独立性——这意味着计算依赖于特定特征的贝叶斯概率,而不保留其他特征——这意味着算法将一个特征的每个概率与第二个特征的概率相乘(我们完全忽略了分母——因为它只是一个规范化器)

      因此,正确的答案是:

    • 根据分类变量计算概率
    • 从连续变量计算概率
    • 乘以1和2

    • 希望我不会太晚。我最近编写了一个名为混合朴素贝叶斯(Mixed Naive Bayes)的库,用NumPy编写。它可以在训练数据特性上假设高斯分布和分类分布(multinoulli)的混合

      库的编写使得API与的类似

      在下面的示例中,假设前2个特征来自分类分布,后2个是高斯分布。在
      fit()
      方法中,只需指定
      category_特征=[0,1]
      ,指示列0和1遵循分类分布

      从mixed_naive_bayes导入MixedNB
      X=[[0,0180.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(分类特征=[0,1])
      clf.配合(X,y)
      clf.predict(X)
      

      Pip可通过
      Pip install mixed naive bayes安装。有关用法的详细信息,请参阅README.md文件。非常感谢拉取请求:)

      @Yaron的方法需要额外的步骤(4.如下):

    • 根据分类变量计算概率
    • 从连续变量计算概率
    • 乘以1。二,。
    • 除以3。乘以1的乘积之和。二,编辑:我的实际意思是分母应该是(给定低血压的事件概率是肯定的)+(给定低血压的证据概率是否定的)(这是一个二元问题,没有失去普遍性)。因此,给出证据的假设(是或否)的概率总和为1
    • 第四步。这是标准化步骤。以@remykarem的
      混合朴素贝叶斯为例():


      高斯模型和分类模型的概率(
      t
      p
      分别)在第269行(上面摘录的第2行)中相乘,然后在第4行中进行归一化。在第275行(上面摘录底部的第四行)。

      @ogrisel:我认为第二种方法可能会忽略连续数据和分类数据之间的相关性,对吗?例如,假设在线注册的年轻人通常是男性,但不在线注册的年轻人通常是女性。但为了具体起见,进一步假设高斯NB模型预测年轻人(不知道分类数据)通常是男性。由于只有这种概率被传递到第二阶段高斯NB,它将错过相关性。@unutbu:naiveBayes分类器假设给定类的特征独立。上面列出的第一种方法将独立学习
      P(年龄|性别)
      P(注册类型|性别)
      。对于给定的性别,年龄和注册类型之间的相关性将不会被捕获。@ogrisel我们是否可以使用一个热编码将n类的分类变量转换为0到n-1之间的值,并保持GaussianNB()的连续变量?根据这篇帖子:@jai,不!首先,一个热编码与转换为0和n-1之间的值不同。其次,将分类变量转换为介于0和n-1之间的值,然后将其视为连续变量是没有意义的。第三,一个热门的分类变量是如此的非高斯,以至于将它们视为高斯变量(这是高斯b所假定的)是不可能的,
              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