组中的二进制分类

Binary-Classification in Groups

我正在研究我认为是二元分类问题。

假设我有3个例句。对于每个句子,我将其分成任意的块。现在,对于 n = 1...4,句子 S 可能有 X(n) 个块。为了对我的问题使用监督学习,我将这些块中的一个标记为正确的块,比如 X(2) = 1,而其余标记为零,X(1,3,4) = 0。

我现在想用 属性 训练一个分类器,如果它从句子 S 中标记一个块为正面,那么它不能将句子 S 中的任何其他块标记为正面。即 S 中所有剩余的块自动变为零。

我知道这在某种程度上构成了我数据中的依赖关系,但我不确定如何对其建模 correctly/which 要使用的建模类型。

提前致谢!

其实看起来很简单的分类,只是你输入的形式

chunk 1, chunk 2, chunk 3, chunk 4 

并且输出是一个标签的单热编码,说明哪个块是正的,仅此而已。所以你有正常的"multiclass"分类,注意更多。

无需转到任何复杂的结构化预测变量。

我想我会在@lejlot 的回答中添加一些细节。

在我的例子中,每个块包含 4 个特征 (f_num)。如果 n 是训练示例的数量,则每个训练示例 X(n) 具有任意数量的块 X(c_num)。为了对它们进行适当的多类分类,我操纵数据,使每个训练示例成为 k 个条目的列表,其中 k = c_num * f_num 和 c_num = max (X(c_num)) 在所有训练示例上。如有必要,每个示例都用零填充。

因此,我的训练数据的两个示例如下所示:

dataX = [[0.281716105245517, 0.10665638086841528, 0.040441347270615546, 0.28939545406713674, 0.10708721346704864, 0.03575772540627547, 0.2919388156600431, 0.10567033629920064, 0.03548559505822619, 0.30111236802413277, 0.10374468925995455, 0.03198108511697361, 0.2712227031280739, 0.07861422245376401, 0.024556163928986227, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0], [0.29104112097787405, 0.10762980405837547, 0.03363727715955192, 0.31072658779074447, 0.11590693257359923, 0.03705562014318057, 0.3337477701497378, 0.14185185185185187, 0.05529482551143203, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]]
dataY = [2, 1]

其中dataY是目标标签,表示第二个块是第一个例子的答案;第一个块,第二个例子。

完成后,我 运行 来自 sklearn 库的 OvR 分类器如下:

# import libraries
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC

# get data and train
dataX, dataY = getYour(awesome, training, data)
fit = OneVsRestClassifier(LinearSVC(random_state=0)).fit(dataX, dataY)

# fit data and count number of correct
# classifications
correct = 0
prediction = fit.predict(yourNeatTestDataX)
for i in range(len(yourNeatTestDataY)):
    if dataY[i] == prediction[i]:
        correct += 1

print "Matches:", correct, "of", len(dataY),"=",float(correct)/len(dataY)