Я хочу лучше понять kfold и как выбрать лучшую модель после ее реализации в качестве метода перекрестной проверки.
Согласно этому источнику: https://machinelearningmastery.com/k-fold-cross-validation/
шаги Чтобы выполнить kfold:
- Случайно перемешать набор данных
- Разделить набор данных на k групп
Для каждой уникальной группы:
Взять группу в качестве набора данных для удержания или тестирования
Взять оставшиеся группы в качестве набора данных для обучения
Установите модель на тренировочном наборе и оцените ее на тестовом наборе
Сохраните оценочный балл и откажитесь от модели
4. Подведите итог навыка модели, используя образец оценочных баллов модели
Однако у меня есть вопрос относительно этого процесса.
что такое Сохранить оценку за оценку и отказаться от модели , которая должна означать? как ты делаешь это?
После моего исследования я считаю, что это может иметь отношение к методу sklearn cross_val_score()
, но когда я пытаюсь реализовать его, передав ему model
, он выдает следующую ошибку :
Traceback (most recent call last):
Файл "D: \ ProgramData \ Miniconda3 \ envs \ Env_DLexp1 \ lib \ site-packages \ joblib \ parallel.py", строка 797, в dispatch_one_batch tasks = self._ready_batches.get (блок = False) _queue.Empty
Во время обработки вышеуказанного исключения произошло другое исключение:
Traceback (most recent call last):
File "D:\temporary.py", line 187, in <module>
scores = cross_val_score(model, X_test, y_test, cv=kf,scoring="accuracy")
File "D:\ProgramData\Miniconda3\envs\Env_DLexp1\lib\site-packages\sklearn\model_selection\_validation.py", line 390, in cross_val_score
error_score=error_score)
File "D:\ProgramData\Miniconda3\envs\Env_DLexp1\lib\site-packages\sklearn\model_selection\_validation.py", line 236, in cross_validate
for train, test in cv.split(X, y, groups))
File "D:\ProgramData\Miniconda3\envs\Env_DLexp1\lib\site-packages\joblib\parallel.py", line 1004, in __call__
if self.dispatch_one_batch(iterator):
File "D:\ProgramData\Miniconda3\envs\Env_DLexp1\lib\site-packages\joblib\parallel.py", line 808, in dispatch_one_batch
islice = list(itertools.islice(iterator, big_batch_size))
File "D:\ProgramData\Miniconda3\envs\Env_DLexp1\lib\site-packages\sklearn\model_selection\_validation.py", line 236, in <genexpr>
for train, test in cv.split(X, y, groups))
File "D:\ProgramData\Miniconda3\envs\Env_DLexp1\lib\site-packages\sklearn\base.py", line 67, in clone
% (repr(estimator), type(estimator)))
TypeError: Cannot clone object '<keras.engine.sequential.Sequential object at 0x00000267F9C851C8>' (type <class 'keras.engine.sequential.Sequential'>): it does not seem to be a scikit-learn estimator as it does not implement a 'get_params' methods.
Согласно документации, https://scikit-learn.org/stable/modules/generated/sklearn.model_selection.cross_val_score.html, первый аргумент для cross_val_score()
должен быть оценщик, который они определяют как «объект оценки, реализующий« соответствие ». Объект, используемый для подгонки данных».
Поэтому я не могу понять исключение.
Это релевантная часть моего кода:
model = Sequential()
model.add(Embedding(max_words, embedding_dim, input_length=maxlen))
model.add(Conv1D(filters=32, kernel_size=8, activation='relu'))
model.add(BatchNormalization(weights=None, epsilon=1e-06, momentum=0.9))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(10, activation='relu'))
model.add(Dense(4, activation='softmax'))
print(model.summary())
from sklearn.metrics import precision_recall_fscore_support
from sklearn.model_selection import GridSearchCV,cross_val_score
kf = KFold(n_splits=4, random_state=None, shuffle=True)
print(kf)
for train_index, test_index in kf.split(data):
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = data[train_index], data[test_index]
y_train, y_test = labels[train_index], labels[test_index]
Adam=keras.optimizers.Adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
model.compile(optimizer=Adam,
loss='sparse_categorical_crossentropy',
metrics=['sparse_categorical_accuracy'])
history = model.fit(X_train, y_train,
epochs=15,
batch_size=32,
verbose=1,
callbacks=callbacks_list,
validation_data=(X_test, y_test)
)
scores = cross_val_score(model, X_test, y_test, cv=kf,scoring="accuracy")
print(scores)
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
Буду признателен за любую помощь, которую вы можете мне оказать. Пожалуйста, примите во внимание, что я не ученый данных или разработчик.