tensorflow为验证集的进动、召回和准确性提供了错误的值

mbyulnm0  于 2021-08-20  发布在  Java
关注(0)|答案(0)|浏览(208)

我有一个非常简单的模型-

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计算的实际值相差如此之远。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题