我正在进行推文分类,每条推文可以属于几个类别中的一个。训练集的输出给出的是每个样本属于每个类别的概率。例如:推文#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的情况下,我认为最简单的处理方法是:
- 根据以下规则拆分(复制)你的训练样本:给定(x, [p1, p2, …, pk])样本(其中pi是第i个类别的概率),创建人工训练样本:(x, 1, p1), (x, 2, p2), …, (x, k, pk)。这样你会得到k个新观察,每个都“附着”在一个类别上,pi被视为样本权重,这是sklearn中的NB可以接受的。
- 使用
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 ]