Как я могу избежать пропуска 1 обязательного позиционного аргумента: ошибка «входов» в перекрестной проверке? - PullRequest
0 голосов
/ 30 апреля 2020
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
...