簡體   English   中英

如何使用 KerasClassifier 計算損失

[英]How to calculate loss with KerasClassifier

我正在使用 sklearn 中的 KerasClassifier 來包裝我的 Keras 模型,以執行 K 折交叉驗證。

model = KerasClassifier(build_fn=create_model, epochs=20, batch_size=8, verbose = 1)    
kfold = KFold(n_splits=10)
scoring = ['accuracy', 'precision', 'recall', 'f1']
results = cross_validate(estimator=model,
                               X=x_train,
                               y=y_train,
                               cv=kfold,
                               scoring=scoring,
                               return_train_score=True,
                              return_estimator=True)

然后我根據指標在函數返回的 10 個估計器中選擇最佳模型:

best_model = results['estimators'][2] #for example the second model

現在,我想對x_test執行預測並獲得准確度和損失指標。 我該怎么做? 我試過model.evaluate(x_test, y_test)但模型是 KerasClassifier 所以我得到一個錯誤。

關鍵是您的KerasClassifier實例模仿了標准的 scikit-learn分類器。 換句話說,它是一種scikit-learn 野獸,而且,它不提供方法.evaluate()

因此,您可以調用best_model.score(X_test, y_test) ,它會像標准 sklearn 分類器一樣自動返回准確率。 另一方面,您可以通過KerasClassifier實例的history_屬性訪問在訓練期間獲得的損失值。

這是一個例子:

!pip install scikeras    

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split, cross_validate, KFold
import tensorflow as tf
import tensorflow.keras
from tensorflow.keras.layers import Dense
from tensorflow.keras.models import Sequential
from scikeras.wrappers import KerasClassifier

X, y = make_classification(n_samples=100, n_features=20, n_informative=5, random_state=42)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

def build_nn():
    ann = Sequential()
    ann.add(Dense(20, input_dim=X_train.shape[1], activation='relu', name="Hidden_Layer_1"))
    ann.add(Dense(1, activation='sigmoid', name='Output_Layer'))
    ann.compile(loss='binary_crossentropy', optimizer= 'adam', metrics = 'accuracy')
return ann

keras_clf = KerasClassifier(model = build_nn, optimizer="adam", optimizer__learning_rate=0.001, epochs=100, verbose=0)

kfold = KFold(n_splits=10)
scoring = ['accuracy', 'precision', 'recall', 'f1']
results = cross_validate(estimator=keras_clf, X=X_train, y=y_train, scoring=scoring, cv=kfold, return_train_score=True, return_estimator=True)

best_model = results['estimator'][2]

# accuracy
best_model.score(X_test, y_test)

# loss values
best_model.history_['loss']

最終觀察到,如果有疑問,您可以調用dir(object)來獲取指定對象的所有屬性和方法的列表( dir(best_model)在您的情況下)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM