这个问题是关于聚类任务的Multilabel多类分类.这是两个很好的定义,以确保没有人混淆两者:
多类分类是指具有两个以上类的分类任务; 例如,分类一组水果图像,可以是橙子,苹果或梨.多类分类假设每个样本被分配给一个且仅一个标签:水果可以是苹果或梨,但不能同时.
多标签分类为每个样本分配一组目标标签.这可以被认为是预测不相互排斥的数据点的属性,例如与文档相关的主题.文本可能同时涉及任何宗教,政治,金融或教育,也可能不属于任何一种.
根据多标签分类的定义,我们可以理解样本可能有多个真正的二进制标签,因此关于宗教和政治的示例文本将具有如下目标:y = [1,1,0,0].
如果不是使用二进制标签,我们有概率或分数.所以我们的目标现在看起来就像这样:y = [0.5, 0.4, 0.0, 0.1]例如,概率总和为1.该文件是50%的宗教信仰,40%的政治和10%的教育.当然,像这样标记数据集并不是真的可行,所以让我们看看另一组任务,更准确地说是聚类任务,以便了解这是如何发生的.
对于群集任务,我们有一个数据集[a,b,c,d,e]及其真集群[abce,d].可以将聚类视为一种分类任务,其中类是一组操作:与活动集群合并或启动新集群.想象一个逐步构建这些集群的系统.它当然会犯错误,从而[ab,c,d]在过程中产生不连贯的聚类.在查看下一个样本时e,现在无法确切地确定应该添加哪个群集,因为它的真正群集现在被分成两部分.由于我们知道一组正确的聚类,我们可以为每个动作(或潜在的合并)分配一个基于精确或回忆的分数y = [0.5, 0.3, 0, 0.2](这些数字是我想象的结果,而不是精确或召回).那么我们的标签在这里是什么?我们应该与这些集群中的任何集群合并,还是应该启动仅包含新集群的集群e?
一个简单的解决方案是将最高分作为我们的真实标签或潜在行动,因为缺乏更好的术语并使用正常的分类成本函数.这意味着我们的潜在行动merge e->ab是唯一真实的答案,其他一切都同样糟糕.在我看来,这似乎是错误的,因为这两个动作merge e->c,并merge e->d会受到惩罚,即使前者不一定是错的一样.
回到多标签分类,是否有任何成本函数允许这样的"加权标签"而不是1和0.或者我是以错误的角度看待这个?
cluster-analysis machine-learning neural-network multilabel-classification
在多标签分类问题中,我使用MultiLabelBinarizer将我的20个文本标签转换为零和一的二进制列表。
经过预测,我得到了20个二进制值的列表,我想输出相应的文本标签。
我只是想知道MultiLabelBinarizer()是否提供返回转换,还是我应该手动进行转换。
我是机器学习的新手。我已经为一个问题苦苦挣扎了几周了,希望有人可以在这里提供帮助:
我有一个带有一个连续变量的数据集,其余的都是分类的。我设法对分类变量进行编码,并希望构建一个多输出分类器。
这是我的数据集:我的数据集 快照 我具有以下功能:A,B我想预测:C,D,E,F,G
数据集如下所示:A,B,C,D,E,F,G
我花了几天时间在scikitlearn上有关多输出分类器的文档上,但在我看来,这些文档都不是很清楚。
谁能为我指出正确的方向,以找到一些有关如何创建分类器并使用一些示例数据进行预测的示例代码?
预先感谢您PS:我没有使用TensorFlow,感谢您对sklearn的帮助。
python machine-learning scikit-learn multilabel-classification data-science
对不起,我觉得我忽略了一些非常明显的事情.
但是如何发生以下情况:
$ cat myTrainFile.txt
1:1 |f 1:12 2:13
2:1 |f 3:23 4:234
3:1 |f 5:12 6:34
$ cat myTestFile.txt
14:1 |f 1:12 2:13
14:1 |f 3:23 4:234
14:1 |f 5:12 6:34
$ vw --csoaa 3 -f myModel.model --compressed < myTrainFile.txt
final_regressor = myModel.model
...
...
$ vw -t -i myModel.model -p myPred.pred < myTestFile.txt
only testing
Num weight bits = 18
...
...
$ cat myPred.pred
14.000000
14.000000
14.000000
Run Code Online (Sandbox Code Playgroud)
因此测试文件与列车文件相同,但对于标签.因此,我希望vw能够生成从火车文件中学到的原始标签,因为它完全忽略了测试文件中的标签.
但是,它似乎重现了测试文件中的标签?!?
显然,我在这里做了一些完全错误的事......但是什么呢?
我尝试使用从nolearn包导入的DBN函数,这是我的代码:
from nolearn.dbn import DBN
import numpy as np
from sklearn import cross_validation
fileName = 'data.csv'
fileName_1 = 'label.csv'
data = np.genfromtxt(fileName, dtype=float, delimiter = ',')
label = np.genfromtxt(fileName_1, dtype=int, delimiter = ',')
clf = DBN(
[data, 300, 10],
learn_rates=0.3,
learn_rate_decays=0.9,
epochs=10,
verbose=1,
)
clf.fit(data,label)
score = cross_validation.cross_val_score(clf, data, label,scoring='f1', cv=10)
print score
Run Code Online (Sandbox Code Playgroud)
由于我的数据具有形状(1231,229)和带有形状(1231,13)的标签,因此标签集看起来像([0 0 1 0 1 0 1 0 0 0 1 1 0] ...,[.. ..]),当我运行我的代码时,我得到了这个错误信息:输入形状不好(1231,13).我想知道这里可能发生两个问题:
我正在使用precision_recall_fscore_supportfromsklearn来计算微精度和微召回。
问题是该函数为它们返回完全相同的值。这是一个多类分类问题,我不确定出了什么问题。
这是代码:
t = precision_recall_fscore_support(y_test, classifier.predict(x_test), average='micro')
print(t)
Run Code Online (Sandbox Code Playgroud)
这是输出:
微精度:(0.3359375、0.3359375、0.3359375、无)
我正在使用 keras 构建多输出分类模型。我的数据集是这样的
[x1,x2,x3,x4,y1,y2,y3]
x1,x2,x3 是特征,y1,y2,y3 是标签,y1,y2,y3 是多类。
我已经建立了一个模型(我忽略了一些隐藏层):
def baseline_model(input_dim=23,output_dim=3):
model_in = Input(shape=(input_dim,))
model = Dense(input_dim*5,kernel_initializer='uniform',input_dim=input_dim)(model_in)
model = Activation(activation='relu')(model)
model = Dropout(0.5)(model)
...................
model = Dense(output_dim,kernel_initializer='uniform')(model)
model = Activation(activation='sigmoid')(model)
model = Model(model_in,model)
model.compile(optimizer='adam',loss='binary_crossentropy', metrics=['accuracy'])
return model
Run Code Online (Sandbox Code Playgroud)
然后我尝试使用keras的方法使其支持分类:
estimator = KerasClassifier(build_fn=baseline_model)
estimator.fit()
estimator.predict(df[0:10])
Run Code Online (Sandbox Code Playgroud)
但我发现结果不是多输出的,只输出一维。
[0,0,0,0,0,0,0,0,0,0]
那么对于多输出分类问题,我们能不能使用KerasClassifier函数来学习呢?
multilabel-classification deep-learning keras tensorflow multiclass-classification
在我的实验中,我试图训练一个神经网络来检测患者是否表现出症状 A、B、C、D。我的数据由每位患者的不同角度照片以及他们是否表现出症状 A、B、C、D 组成。
现在,在 pytoch 中,我正在使用 MSELoss 并将测试误差计算为分类总数中正确分类的总数。我想这太天真了,甚至是不恰当的。
测试误差计算的示例如下:假设我们有 2 名患者,每人都有两张图像。那么总共会有 16 个分类(1 个分类代表患者 1 是否有照片 1 中的症状 A、B、C、D 等)。如果模型正确预测照片 1 中的患者 1 表现出症状 A,那么正确分类的总数就会增加 1。
multilabel-classification deep-learning multiclass-classification pytorch loss-function
我们正在尝试在 pytorch 中使用 CNN 实现多标签分类。我们有 8 个标签和大约 260 张图像,使用 90/10 分割作为训练/验证集。
\n\n这些类别高度不平衡,最常见的类别出现在 140 多张图像中。另一方面,最不频繁的类别出现在少于 5 个图像中。
\n\n我们最初尝试了 BCEWithLogitsLoss 函数,该函数导致模型预测所有图像的相同标签。
\n\n然后,我们实施了焦点损失方法来处理类别不平衡,如下所示:
\n\n import\xc2\xa0torch.nn\xc2\xa0as\xc2\xa0nn\n import\xc2\xa0torch\n\n class\xc2\xa0FocalLoss(nn.Module):\n def\xc2\xa0__init__(self,\xc2\xa0alpha=1,\xc2\xa0gamma=2):\n super(FocalLoss,\xc2\xa0self).__init__()\n self.alpha\xc2\xa0=\xc2\xa0alpha\n self.gamma\xc2\xa0=\xc2\xa0gamma\n\n def\xc2\xa0forward(self,\xc2\xa0outputs,\xc2\xa0targets):\n bce_criterion\xc2\xa0=\xc2\xa0nn.BCEWithLogitsLoss()\n bce_loss\xc2\xa0=\xc2\xa0bce_criterion(outputs,\xc2\xa0targets)\n pt\xc2\xa0=\xc2\xa0torch.exp(-bce_loss)\n focal_loss\xc2\xa0=\xc2\xa0self.alpha\xc2\xa0*\xc2\xa0(1\xc2\xa0-\xc2\xa0pt)\xc2\xa0**\xc2\xa0self.gamma\xc2\xa0*\xc2\xa0bce_loss\n return\xc2\xa0focal_loss \nRun Code Online (Sandbox Code Playgroud)\n\n这导致模型为每个图像预测空集(无标签),因为它无法获得任何类别大于 0.5 的置信度。
\n\npytorch 有没有办法帮助解决这种情况?
\nmachine-learning multilabel-classification conv-neural-network pytorch
我希望使用 ML.NET 实现多标签分类。我读过几篇文章,说这不可能直接实现,而是通过问题转换将其转换为多个二元分类问题。n因此,如果我的数据集有标签,基本上我将需要创建分类器n。我尝试通过明智地拆分数据集标签来做到这一点。但fit方法抛出以下异常。我正在传递标签列的值作为1给定标签的所有条目。
System.ArgumentOutOfRangeException:“必须至少为 2。参数名称:numClasses”
1这可以通过添加具有特定标签 as 的条目和所有其他条目 as来解决0,但由于每个标签的条目数量较少,我认为这会稀释学习并可能导致准确性降低。
有人可以建议使用 ML.NET 实现多标签分类的任何其他方法吗?
python ×3
scikit-learn ×3
pytorch ×2
c# ×1
data-science ×1
dbn ×1
keras ×1
ml.net ×1
nolearn ×1
tensorflow ×1
vowpalwabbit ×1