Как сохранить оценку kfold с помощью cross_val_score()

Я хочу более четко понять kfold и то, как выбрать лучшую модель после того, как она будет реализована как метод перекрестной проверки.

По данным этого источника: https://machinelearningmastery.com/k-fold-cross-validation/ шаги для выполнения kfold:

  1. Случайно перемешать набор данных
  2. Разбейте набор данных на k групп
  3. Для каждой уникальной группы:

    • Возьмите группу как опорный или тестовый набор данных

    • Остальные группы возьмите как набор обучающих данных.

    • Установите модель на обучающую выборку и оцените ее на тестовой выборке.

    • Сохраните оценочную оценку и выбросьте модель

4. Резюмируйте навыки модели, используя выборку оценок модели.

Однако у меня есть вопрос по поводу этого процесса.

что такое Сохранить оценку и отказаться от модели, которую предполагается означать? как ты делаешь это?

После своего исследования я считаю, что это может быть связано с методом склеарна. 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(block=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))

Буду признателен за любую помощь, которую вы можете мне оказать. Учтите, что я не специалист по данным и не разработчик.

1 ответ

что такое Сохранить оценку и отказаться от модели, которая должна означать?

Сохранение оценки означает сохранение оценки фактической модели, протестированной в итерации CV, чтобы просто сохранить ее в памяти для сравнения со следующими оценками.

как ты делаешь это?

Вы можете использовать cross_val_score() из sklearn при использовании алгоритмов sklearn, но вы работаете с keras, поэтому вам нужно будет работать с классом KFold, взгляните на это ядро kaggle, оно показывает нужную вам реализацию. В Интернете есть множество подобных примеров, просто выберите тот, который вам понятнее всего.

Поэтому я не могу понять исключение.

Cross_val_score() принимает оценщик в качестве первого параметра. Что такое оценщик? Согласно документации, оценщик - это класс, который реализует определенную структуру в соответствии с этой документацией.

Как видите, ваша модель keras не реализует часть структуры, поэтому вы получаете сообщение об ошибке: это не похоже на оценку scikit-learn, поскольку она не реализует методы get_params.

Другие вопросы по тегам