from skmultilearn.problem_transform import LabelPowerset
import tensorflow.contrib.learn as skflow
# assume data is loaded using
# and is available in X_train/X_test, y_train/y_test
# initialize LabelPowerset multi-label classifier
# with tensor flow DNN base classifier
classifier = LabelPowerset(skflow.TensorFlowDNNClassifier(OPTIONS))
# train
classifier.fit(X_train, y_train)
# predict
predictions = classifier.predict(X_test)
3 回答
您还可以尝试使用Label Powerset方法将问题从多标签转换为多类别 . Label Powerset转换将训练集中证明的每个标签组合视为一个不同的类,并构造一个多类分类器的实例 - 并在预测后将指定的类转换回多标签的情况 . 它在scikit-multilearn和scikit-compatibility包装器中通过tensorflow Estimator或通过input_fn或使用skflow提供 . 然后将其插入LabelPowerset的实例中 .
代码可以如下:
最天真(和合理)的方法是训练分类网络,并移除softmax层并用sigmoids向量替换它 . 这样,您可以将多个单元激活为1 .
您可以查看分类网络的on TF-slim示例 . 在路径
datasets
下,您将找到有关如何为图像和类准备TFExample
"file pattern"的示例大多数解决方案都是指sigmoid损失,而sigmoid在我的情况下通过张量流中的
tf.nn.sigmoid_cross_entropy_with_logits(labels,logits)
很好地解决了多标签分类问题 .然而,当我处理类不 balancer 问题时,负面情况远远超过正面情况,我发现我编辑的softsign损失比sigmoid好得多 . 调整系数
gamma
被添加到标签以将负类的梯度降低3/4 .标签是多热编码向量,如[0,1,0,1,0],logits~(-inf,inf)