Scikit-learn 多类别朴素贝叶斯分类器的概率输出 y

我正在进行推文分类,每条推文可以属于几个类别中的一个。训练集的输出给出的是每个样本属于每个类别的概率。例如:推文#1:C1-0.6, C2-0.4, C3-0.0(C1、C2、C3为类别)

我计划使用Scikit-learn的朴素贝叶斯分类器。我在naive_bayes.py中找不到一个可以接受每个类别概率作为训练输入的fit方法。我需要一个可以接受训练集每个类别输出概率的分类器(即:y.shape = [n_samples, n_classes])。

我该如何处理我的数据集以应用朴素贝叶斯分类器?


回答:

这并不容易,因为“类别概率”可以有多种解释。

在NB分类器和sklearn的情况下,我认为最简单的处理方法是:

  1. 根据以下规则拆分(复制)你的训练样本:给定(x, [p1, p2, …, pk])样本(其中pi是第i个类别的概率),创建人工训练样本:(x, 1, p1), (x, 2, p2), …, (x, k, pk)。这样你会得到k个新观察,每个都“附着”在一个类别上,pi被视为样本权重,这是sklearn中的NB可以接受的。
  2. 使用fit(X,Y,sample_weights)训练你的NB(其中X是你x观察的矩阵,Y是前一步的类别矩阵,sample_weights是前一步的pi矩阵)。

例如,如果你的训练集由两个点组成:

  • ( [0 1], [0.6 0.4] )
  • ( [1 3], [0.1 0.9] )

你将它们转换为:

  • ( [0 1], 1, 0.6)
  • ( [0 1], 2, 0.4)
  • ( [1 3], 1, 0.1)
  • ( [1 3], 2, 0.9)

并使用以下数据训练NB:

  • X = [ [0 1], [0 1], [1 3], [1 3] ]
  • Y = [ 1, 2, 1, 2 ]
  • sample_weights = [ 0.6 0.4 0.1 0.9 ]

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注