组中的二进制分类

时间:2016-06-16 12:55:16

标签: machine-learning classification regression data-modeling

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

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

我现在想用这个属性训练一个分类器,如果它从句子S中肯定地标记了一个块,那么它就不能正确标记句子S中的任何其他块。这就是S中剩余的剩余块自动变为零。

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

提前致谢!

2 个答案:

答案 0 :(得分:0)

实际上它看起来像一个简单的分类,只是你输入的形式

public bool IsUpdated { get; set; }

并且输出是一个标签的热编码,说明哪个块是正的,就是全部。所以你有正常的“多类”分类,注意更多。

没有必要去任何复杂的结构化预测器。

答案 1 :(得分:0)

我想我会在@ 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 classier,如下所示:

# 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)