为多类分类python tensorflow keras设置偏差

Posted

技术标签:

【中文标题】为多类分类python tensorflow keras设置偏差【英文标题】:setting bias for multiclass classification python tensorflow keras 【发布时间】:2020-06-04 00:42:07 【问题描述】:

附件model 展示了如何在不平衡分类问题initial_bias = np.log([pos/neg]) 的情况下添加偏差。如果你有不平衡数据的多类分类,有没有办法增加偏差,比如 5 个类有分布(0.4,0.3,0.2.0.08 and 0.02)

2) 在这种情况下如何计算和使用类权重?

更新 1

I found a way to apply weights, still not sure how to use bias

#####adding weights 20 Feb
weight_for_0 = ( 1/ 370)*(370+ 977+ 795)/3
weight_for_1 = ( 1/ 977)*(370+ 977+ 795)/3
weight_for_2 = (1 / 795)*(370+ 977+ 795)/3

#array([0, 1, 2]), array([370, 977, 795])

class_weights_dict = 0: weight_for_0, 1: weight_for_1, 2:weight_for_2
class_weights_dict
Dcnn.fit(train_dataset,
         epochs=NB_EPOCHS,
         callbacks=[MyCustomCallback()],verbose=2,validation_data=test_dataset, class_weight=class_weights_dict)

【问题讨论】:

这是'softmax' + 'categorical_crossentropy'(只有一个类是正确的),还是这是"sigmoid" + "binary_crossentropy"(很多类都可以是正确的)? 只有一个类是正确的。我正在使用sparse_categorical_accuracysoftmax 这将是一个非常复杂的方程要解...不知道网上有没有什么... 当您之前提到"sigmoid" + "binary_crossentropy" (many classes can be correct) 时,它是一个二元分类对吧?如果有两个以上的类,你怎么能使用sigmoid 在下面的答案中。适合度不会改变。 【参考方案1】:

考虑到您使用的是'softmax'

softmax = exp(neurons) / sum(exp(neurons))

你希望类的结果是:

frequency = [0.4 , 0.3 , 0.2 , 0.08 , 0.02]

偏差应由等式(按元素)给出:

frequency = exp(biases) / sum(exp(biases))

这形成了一个方程组:

f1 = e^b1 / (e^b1 + e^b2 + ... + e^b5) f2 = e^b2 / (e^b1 + e^b2 + ... + e^b5) ... f5 = e^b5 / (e^b1 + e^b2 + ... + e^b5)

如果你能解出这个方程组,你就会得到你想要的偏差。

我使用 excel 和 test-error 方法来确定对于您想要的频率,您的偏差应该分别为:

[1.1 , 0.81 , 0.4 , -0.51 , -1.9] 

我真的不知道如何轻松解决该系统,但您可以继续使用 excel 或其他东西进行试验,直到找到解决方案。


向层添加偏差 - 方法 1.

定义层时使用名称,例如:

self.last_dense = layers.Dense(units=3, activation="softmax", name='last_layer')

你可能需要先建立模型,所以:

dummy_predictions = model.predict(np.zeros((1,) + input_shape))

然后你得到权重:

weights_and_biases = model.get_layer('last_layer').get_weights()
w, b = weights_and_biases
new_biases = np.array([-0.45752, 0.51344, 0.30730])
model.get_layer('last_layer').set_weights([w, new_biases])

方法二

def bias_init(bias_shape):
    return K.variable([-0.45752, 0.51344, 0.30730])

self.last_dense = layers.Dense(units=3, activation="softmax", bias_initializer=bias_init)

【讨论】:

我不清楚。如果我们知道 b1, b2,...b5 那么为什么我们不能通过您上面提到的直接公式找到 f1,f2,...f5?为什么我们必须在 excel 中进行实验? @user2543622,你不知道b1和其他人,他们是偏见。您知道f1 和其他人,它们是频率,在您的示例中为[0.4 , 0.3 , 0.2 , 0.08 , 0.02] K.variable([-0.45752, 0.51344, 0.30730]) 中的 K 是什么?是import keras as K 还是import tensorflow.keras.backend as K? (tensorflow.org/api_docs/python/tf/keras/backend/variable) @user2543622,它是keras.backendtensorflow.keras.backend。 (你正在使用的那个) 如果我理解正确,如果你随机抽取样本,那么就选择偏差+权重。如果您进行上采样或下采样以使您的训练数据均匀分布,则仅选择偏差。对吗?【参考方案2】:

除了@Daniel Möller 的回答,求解方程组

f1 = e^b1 / (e^b1 + e^b2 + ... + e^b5)

...

f5 = e^b5 / (e^b1 + e^b2 + ... + e^b5)

你不需要 excel 或任何东西。只需计算bi = ln(fi)

【讨论】:

是的,答案有点误导。我做了计算,就这么简单。此外,偏差对于常数加法是不变的。所以,b_i = ln(f_i) + c 是正确的设置偏差。【参考方案3】:

要计算fi = e^bi / (sum of e^bj),请注意fi/fj = e^(bi-bj)。假设最低频率为 fk。您可以设置bk= 0,然后使用bi = bj + ln(fi/fj) 计算所有其他类偏差。

【讨论】:

以上是关于为多类分类python tensorflow keras设置偏差的主要内容,如果未能解决你的问题,请参考以下文章

使用 R 在 keras 中为多类分类创建混淆矩阵

使用 sklearn 中的 OneVsRestClassifier 将自定义的二元分类调整为多类分类

为多类分类留一出准确率

python中的多类分类

使用 LightGBM 进行多类分类

tensorflow 增强树分类器多类