import theano.tensor as T
import numpy as np
from nolearn.lasagne import NeuralNet
def multilabel_objective(predictions, targets):
epsilon = np.float32(1.0e-6)
one = np.float32(1.0)
pred = T.clip(predictions, epsilon, one - epsilon)
return -T.sum(targets * T.log(pred) + (one - targets) * T.log(one - pred), axis=1)
net = NeuralNet(
# your other parameters here (layers, update, max_epochs...)
# here are the one you're interested in:
objective_loss_function=multilabel_objective,
custom_score=("validation score", lambda x, y: np.mean(np.abs(x - y)))
)
我在网上找到了这个代码并想测试它。它确实有效,结果包括训练损失,测试损失,验证分数和时间等。
但我怎样才能获得F1-微分?另外,如果我在添加以下代码后尝试导入scikit-learn来计算F1:
data = data.astype(np.float32)
classes = classes.astype(np.float32)
net.fit(data, classes)
score = cross_validation.cross_val_score(net, data, classes, scoring='f1', cv=10)
print score
我收到了这个错误:
ValueError:无法处理多标签指标的混合 连续多输出
如何根据上述代码实现F1-micro计算?
答案 0 :(得分:1)
假设测试集上的真实标签为y_true
(形状:(n_samples, n_classes)
,仅由0和1组成),您的测试观察结果为X_test
(形状:{{1 }})。
然后,您可以通过(n_samples, n_features)
在测试集上获得净预测值。
如果您正在进行多类分类:
由于在您的网络中,您已将y_test = net.predict(X_test)
设置为regression
,因此它也应仅由0和1组成。
您可以使用以下方法计算微观平均f1分数:
False
小代码示例来说明这一点(使用虚拟数据,使用您的实际from sklearn.metrics import f1_score
f1_score(y_true, y_pred, average='micro')
和y_test
):
y_true
如果您正在进行多标签分类:
您不输出0和1的矩阵,而是输出概率矩阵。 y_pred [i,j]是观察我属于j类的概率。
您需要定义一个阈值,在该阈值之上,您会说一个观察属于一个给定的类。然后,您可以相应地对标签进行属性处理,并与前一种情况相同。
from sklearn.metrics import f1_score
import numpy as np
y_true = np.array([[0, 0, 1], [0, 1, 0], [0, 0, 1], [0, 0, 1], [0, 1, 0]])
y_pred = np.array([[1, 0, 0], [0, 1, 0], [0, 0, 1], [0, 0, 1], [0, 0, 1]])
t = f1_score(y_true, y_pred, average='micro')