from sklearn.model_selection import KFold
from keras.losses import binary_crossentropy
from keras.optimizers import Adam
from keras.callbacks import EarlyStopping
from sklearn.model_selection import cross_val_score
batch_size = 50
no_epochs = 100
optimizer = Adam()
validation_split = 0.2
verbosity = 1
num_folds = 10
Загрузка данных
input_train, input_test, target_train, target_test = train_test_split(X, y, test_size=0.2, random_state=123)
Анализ чисел в виде чисел с плавающей запятой
input_train = input_train.astype('float32')
input_test = input_test.astype('float32')
# Нормализация данных
input_train = input_train / 255
input_test = input_test / 255
Определение контейнеров для оценки сгиба
acc_per_fold = []
loss_per_fold = []
Объединение входов и целей
inputs = np.concatenate((input_train, input_test), axis=0)
targets = np.concatenate((target_train, target_test), axis=0)
Определение K-кратного перекрестного валидатора
kfold = KFold(n_splits=num_folds, shuffle=True)
es = EarlyStopping(monitor='val_loss', mode='min', verbose=1, patience=int(5))
fold_no = 1
for train, test in kfold.split(inputs, targets):
# Определение архитектуры модели
model = Sequential() # can put parameters like input_dim and change when run
model.add(Dense(5, input_dim=X_train.shape[1], activation='relu'))
model.add(Dense(8, activation='sigmoid'))
model.add(Dense(5, activation='sigmoid'))
model.add(Dense(1, activation='sigmoid') )
# Скомпилируйте модель
model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])
# Подгоните данные к модели
history = model.fit(inputs[train], targets[train],
batch_size=batch_size,
epochs=no_epochs,
verbose=verbosity,
validation_split=0.2,
callbacks=[es])
def scorer(model, X, y):
return accuracy_score(y, model.predict(X))
model2 = KerasClassifier(model)
Проверьте, как ваша модель keras работает с 5-кратной перекрестной проверкой
kfold = cross_val_score(model2, X, y, cv=5, scoring=scorer)
# Печать средняя точность на сгиб
print('Mean Accuracy Per Fold:', kfold.mean())
# Вывести стандартное отклонение на сгиб
print('Standard Deviation Per Fold:', kfold.std())
Код работает до тех пор, пока не начнется ячейка, начинающаяся с def Scorer, которая генерирует следующую ошибку:
/usr/local/lib/python3.6/dist-packages/sklearn/model_selection/_validation.py:536: FitFailedWarning: Estimator fit failed. The score on this train-test partition for these parameters will be set to nan. Details:
TypeError: __call__() missing 1 required positional argument: 'inputs'
FitFailedWarning)
Mean Accuracy Per Fold: nan
Standard Deviation Per Fold: nan