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

首先,我按照教程中编码的示例进行操作


并创建以下代码:


import numpy as np

import pandas as pd

import tensorflow as tf


from tensorflow import feature_column

from tensorflow.keras import layers

from sklearn.model_selection import train_test_split


URL = '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 ds


batch_size = 32

train_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 cols

for header in ['age', 'trestbps', 'chol', 'thalach', 'oldpeak', 'slope', 'ca']:

  feature_columns.append(feature_column.numeric_column(header))


# bucketized cols

age_buckets = feature_column.bucketized_column(age, boundaries=[18, 25, 30, 35, 40, 45, 50, 55, 60, 65])

feature_columns.append(age_buckets)


# indicator cols

thal = 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 cols

thal_embedding = feature_column.embedding_column(thal, dimension=8)

feature_columns.append(thal_embedding)


我的问题是我应该使用什么方法将浮点数结果转换为二进制(0或1)并比较目标?我的最终目标是获得通过评估方法获得的精度值0.6885246。


人到中年有点甜
浏览 190回答 1
1回答

红颜莎娜

我对Tensorflow教程中最近的这种方式感到非常惊讶,在模型的最后一层()中使用线性激活函数来分类问题,然后在损失函数中要求。我想原因是它可能会导致更好的数字稳定性,如文档中所声称的那样:Dense(1)from_logits=Truefrom_logits:是否解释为对数值的张量。默认情况下,我们假设 包含概率(即 [0, 1] 中的值)。注意:使用可能数值更稳定。y_predy_predfrom_logits=True其中 “by defaul” 表示此处损失函数参数的默认值为 。from_logits=False无论如何,您最终得到了对logits的预测,而不是概率,就像迄今为止在类似教程(和实践中)中通常的情况一样。Logits的问题在于它们缺乏直观的解释,与概率预测相反。你应该做的是从sigmoid函数传递你的logits,将它们转换为概率:import numpy as npdef 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
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python