亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在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 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號