我試圖在TensorFlow中設置一個成本敏感的二進制分類學習,它會對假陽性和假陰性施加不同的處罰。有誰知道如何從一組懲罰權重$(w_1,w_2,w_3,w_4)$ for(真正的正面,假的正面,假的負面,真正的負面)創建一個損失函數。Tensorflow的成本敏感學習
我去了所提供的標準成本函數,但無法弄清楚如何將它們結合起來得到與上面類似的東西。
我試圖在TensorFlow中設置一個成本敏感的二進制分類學習,它會對假陽性和假陰性施加不同的處罰。有誰知道如何從一組懲罰權重$(w_1,w_2,w_3,w_4)$ for(真正的正面,假的正面,假的負面,真正的負面)創建一個損失函數。Tensorflow的成本敏感學習
我去了所提供的標準成本函數,但無法弄清楚如何將它們結合起來得到與上面類似的東西。
我不知道任何人誰已經建立了一個成本敏感的神經網絡分類器,但Alejandro Correa Bahnsen已發表學術論文爲cost sensitive logistic regression和cost sensitive decision trees和一個非常有據可查的蟒蛇cost sensitive classification library named CostCla的。如果您熟悉scikit-learn,CostCla非常易於使用。
您應該能夠使用庫中的Bayes minimum risk model到您的神經網絡的minimize the cost,因爲它適合輸出任何分類器預測概率的成本模型。
請注意,CostCla旨在針對每個樣品使用不同的成本。您爲您的培訓和測試樣品提供成本矩陣。但是,如果適用於您的問題,則可以使成本矩陣中的所有行都相同。
以下是關於這個問題的一些額外的學術論文:
cost_matrix:
[[0,1,100],
[1,0,1],
[1,20,0]]
標籤:
[1,2]
Y *:
[[0,1,0],
[0,0,1]]
Y(預測):
[[0.2,0.3,0.5],
[0.1,0.2,0.7]]
標籤,cost_matrix - > cost_embedding:
[[1,0,1],
[1,20,0]]
它明顯0.3在[0.2,0.3 ,0.5]指的是[0,1,0]的正確的可能性,所以它不應該與損失相關。
0.7在[0.1,0.2,0.7]中是相同的。換句話說,y *中值爲1的pos與損失不相關。
所以,我有(1-Y *):
[[1,0,1],
[1,1,0]]
然後,熵是目標*日誌(預測)+(1-目標)*日誌(1-預測),和在Y值0 *,應當使用(1-目標)*日誌(1-預測),所以我用(1-預測)所述(1-Y)
1-Y:
[[0.8,*0.7*,0.5],
[0.9,0.8,*0.3*]]
(斜體num是無用)
the定製損失
[[1,0,1], [1,20,0]] * log([[0.8,0.7,0.5],[0.9,0.8,0.3]]) *
[[1,0,1],[1,1,0]]
,你可以看到(1-Y *)可以在這裏放下
因此損失-tf.reduce_mean(cost_embedding *日誌(1-Y)) ,以使其適用,應該是:
-tf.reduce_mean(cost_embedding*log(tf.clip((1-y),1e-10)))
演示低於
import tensorflow as tf
import numpy as np
hidden_units = 50
num_class = 3
class Model():
def __init__(self,name_scope,is_custom):
self.name_scope = name_scope
self.is_custom = is_custom
self.input_x = tf.placeholder(tf.float32,[None,hidden_units])
self.input_y = tf.placeholder(tf.int32,[None])
self.instantiate_weights()
self.logits = self.inference()
self.predictions = tf.argmax(self.logits,axis=1)
self.losses,self.train_op = self.opitmizer()
def instantiate_weights(self):
with tf.variable_scope(self.name_scope + 'FC'):
self.W = tf.get_variable('W',[hidden_units,num_class])
self.b = tf.get_variable('b',[num_class])
self.cost_matrix = tf.constant(
np.array([[0,1,100],[1,0,100],[20,5,0]]),
dtype = tf.float32
)
def inference(self):
return tf.matmul(self.input_x,self.W) + self.b
def opitmizer(self):
if not self.is_custom:
loss = tf.nn.sparse_softmax_cross_entropy_with_logits\
(labels=self.input_y,logits=self.logits)
else:
batch_cost_matrix = tf.nn.embedding_lookup(
self.cost_matrix,self.input_y
)
loss = - tf.log(1 - tf.nn.softmax(self.logits))\
* batch_cost_matrix
train_op = tf.train.AdamOptimizer().minimize(loss)
return loss,train_op
import random
batch_size = 128
norm_model = Model('norm',False)
custom_model = Model('cost',True)
split_point = int(0.9 * dataset_size)
train_set = datasets[:split_point]
test_set = datasets[split_point:]
with tf.Session() as sess:
sess.run(tf.global_variables_initializer())
for i in range(100):
batch_index = random.sample(range(split_point),batch_size)
train_batch = train_set[batch_index]
train_labels = lables[batch_index]
_,eval_predict,eval_loss = sess.run([norm_model.train_op,
norm_model.predictions,norm_model.losses],
feed_dict={
norm_model.input_x:train_batch,
norm_model.input_y:train_labels
})
_,eval_predict1,eval_loss1 = sess.run([custom_model.train_op,
custom_model.predictions,custom_model.losses],
feed_dict={
custom_model.input_x:train_batch,
custom_model.input_y:train_labels
})
# print '默認',eval_predict,'\n自定義',eval_predict1
print np.sum(((eval_predict == train_labels)==True).astype(np.int)),\
np.sum(((eval_predict1 == train_labels)==True).astype(np.int))
if i%10 == 0:
print '默認測試',sess.run(norm_model.predictions,
feed_dict={
norm_model.input_x:test_set,
norm_model.input_y:lables[split_point:]
})
print '自定義測試',sess.run(custom_model.predictions,
feed_dict={
custom_model.input_x:test_set,
custom_model.input_y:lables[split_point:]
})
謝謝你,這是非常有益的 – LazyCat