为了账号安全,请及时绑定邮箱和手机立即绑定

在Keras中,如何通过预测方法获得与评估方法相同的精度值?

在Keras中,如何通过预测方法获得与评估方法相同的精度值?

人到中年有点甜 2022-09-06 17:23:44
首先,我按照教程中编码的示例进行操作并创建以下代码:import numpy as npimport pandas as pdimport tensorflow as tffrom tensorflow import feature_columnfrom tensorflow.keras import layersfrom sklearn.model_selection import train_test_splitURL = 'https://storage.googleapis.com/applied-dl/heart.csv'dataframe = pd.read_csv(URL)dataframe.head()train, test = train_test_split(dataframe, test_size=0.2)train, val = train_test_split(train, test_size=0.2)def df_to_dataset(dataframe, shuffle=True, batch_size=32):  dataframe = dataframe.copy()  labels = dataframe.pop('target')  ds = tf.data.Dataset.from_tensor_slices((dict(dataframe), labels))  if shuffle:    ds = ds.shuffle(buffer_size=len(dataframe))  ds = ds.batch(batch_size)  return dsbatch_size = 32train_ds = df_to_dataset(train, batch_size=batch_size)val_ds = df_to_dataset(val, shuffle=False, batch_size=batch_size)test_ds = df_to_dataset(test, shuffle=False, batch_size=batch_size)feature_columns = []age = feature_column.numeric_column("age")# numeric colsfor header in ['age', 'trestbps', 'chol', 'thalach', 'oldpeak', 'slope', 'ca']:  feature_columns.append(feature_column.numeric_column(header))# bucketized colsage_buckets = feature_column.bucketized_column(age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])feature_columns.append(age_buckets)# indicator colsthal = feature_column.categorical_column_with_vocabulary_list(      'thal', ['fixed', 'normal', 'reversible'])thal_one_hot = feature_column.indicator_column(thal)feature_columns.append(thal_one_hot)# embedding colsthal_embedding = feature_column.embedding_column(thal, dimension=8)feature_columns.append(thal_embedding)我的问题是我应该使用什么方法将浮点数结果转换为二进制(0或1)并比较目标?我的最终目标是获得通过评估方法获得的精度值0.6885246。
查看完整描述

1 回答

?
红颜莎娜

TA贡献1842条经验 获得超13个赞

我对Tensorflow教程中最近的这种方式感到非常惊讶,在模型的最后一层()中使用线性激活函数来分类问题,然后在损失函数中要求。我想原因是它可能会导致更好的数字稳定性,如文档中所声称的那样:Dense(1)from_logits=True


from_logits:是否解释为对数值的张量。默认情况下,我们假设 包含概率(即 [0, 1] 中的值)。注意:使用可能数值更稳定。y_predy_predfrom_logits=True


其中 “by defaul” 表示此处损失函数参数的默认值为 。from_logits=False


无论如何,您最终得到了对logits的预测,而不是概率,就像迄今为止在类似教程(和实践中)中通常的情况一样。Logits的问题在于它们缺乏直观的解释,与概率预测相反。


你应该做的是从sigmoid函数传递你的logits,将它们转换为概率:


import numpy as np


def sigmoid(x):

    return 1 / (1 + np.exp(-x))

前四个预测的示例:


preds = np.array([-1.7059733, -0.914219, 2.6422875, -0.50430596])

sigmoid(preds)

# array([0.15368673, 0.28613728, 0.93353404, 0.37652929])

然后将它们转换为阈值为0.5的“硬”预测:


final_preds = [1 if x>0.5 else 0 for x in preds]

final_preds

# [0, 0, 1, 0]

在这种形式下,你可以将它们与基本事实进行比较。


但是,为了避免这种情况,我建议您考虑将最后一层更改为


Dense(1, activation='sigmoid')

并从损失定义中删除该参数。这样,就应该返回硬预测(未测试)。(from_logits=True)model.predict


查看完整回答
反对 回复 2022-09-06
  • 1 回答
  • 0 关注
  • 189 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号