我有一个非常简单的模型-
model = Sequential([
Dense(64,'relu'),
Dense(384,'relu'),
Dense(384,'relu'),
Dense(512,'relu'),
Dense(512,'relu'),
Dense(512,'relu'),
Dense(512,'relu'),
Dense(312,'relu'),
Dense(1,'sigmoid'),
])
工作也很简单。
initial_learning_rate = 0.0008
decay = tf.keras.optimizers.schedules.ExponentialDecay(
initial_learning_rate,
decay_steps=75,
decay_rate=0.95,
staircase=False)
optmizer = Adam(learning_rate=decay, amsgrad=True) #0.0005
model.compile(
optimizer=optmizer,
loss='BinaryCrossentropy',
metrics=[
'accuracy',
'Precision',
'Recall',
'AUC',
]
)
我拥有的数据集有大约800多个特性、150000个观察值和60-40个序列测试分割(在以前的模型中,我确实有一个验证集,但为了获得关于良好体系结构的基本概念,我跳过了验证集,并将测试集用作验证集)
模型的最后一层返回一个介于0和1之间的值。在生产过程中,我必须最终返回概率,而不是1/0,但数据集的实际输出仅包含1和0,而不是概率。所以,这就是为什么我使用上述体系结构进行培训-
model.fit(
X_train,
y_train,
batch_size=512,
epochs=1000,
validation_data = (X_train,y_train),
)
现在问题来了:因为数据有点不平衡,所以我不得不严重依赖精确度、召回率和auc分数。但是,当我尝试使用各种阈值和sklearn函数来计算它时,训练期间的值会发生很大的变化。
纪元114/1000 166/166[=================================================================================================================================-2s 11ms/步长-损失:0.0746-准确度:0.9782-准确度:0.9863-准确度:0.8497-准确度:0.9850-准确度:0.9863-准确度:0.8497-准确度auc:0.9850
纪元115/1000 166/166[====================================================================================================================================-2s 11ms/步长-损失:0.0746-准确度:0.9782-准确度:0.9863-准确度:0.8497-准确度:0.9850-准确度:0.9863-准确度:0.8497-准确度auc:0.9850
纪元116/1000 162/166[============================>。]预计到达时间:0s-损失:0.0746-准确度:0.9782-准确度:0.9862-召回率:0.8498-auc:0.9850
从最佳纪元结束时恢复模型权重。166/166[===================================================2s 11ms/步-损耗:0.0746-准确度:0.9782-精度:0.9863-召回率:0.8497-auc:0.9850-瓦尔-损耗:0.0746-瓦尔-精确度:0.9782-瓦尔-精确度:0.9863-瓦尔-召回率:0.8497-瓦尔-auc:0.9850
sklearn测试(验证)分数设置为阈值0.5-
[[45912 3240]
[ 4132 3370]]
Precession: 0.5098335854765507
Recall: 0.4492135430551853
Acuracy: 0.8698767959896918
是我做错了什么,还是我只是把结果解释错了。最终,我决定为这些指标创建自定义函数,但这也相当困难,我真的想了解tensorflow是如何确定一个阈值,将输出概率分为两类,以提供进动、回忆、准确度和auc,以及为什么这些值与使用sklearn计算的实际值相差如此之远。
暂无答案!
目前还没有任何答案,快来回答吧!