如何使用cross_val_score()保留kfold的评估分数

问题描述 投票:0回答:1

我想更清楚地理解kfold,以及在将其作为交叉验证方法实施后如何选择最佳模型。

据此消息来源:https://machinelearningmastery.com/k-fold-cross-validation/执行kfold的步骤是:

  1. 随机随机播放数据集
  2. 将数据集分成k组
  3. 对于每个唯一组:

    • 将组作为保留或测试数据集

    • 将其余的组作为训练数据集

    • 在训练集上拟合模型并在测试集上进行评估

    • 保留评估分数并丢弃模型

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中任务= 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.htmlcross_val_score()的第一个参数必须是一个估算器,它们定义为“实现'fit'的估算器对象。用于拟合数据的对象”。 

因此,我无法理解该异常。

这是我的代码的相关部分:

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))

我会很感激您能给我任何帮助。请考虑一下我不是数据科学家还是开发人员。 
python scikit-learn deep-learning cross-validation k-fold
1个回答
0
投票
什么是保留评估分数并丢弃应该意思?

保留评估方法是保存在CV迭代中测试的实际模型的评估,只是将其保存在内存中以便与下一个评估进行比较。

你怎么做?

使用sklearn算法时,可以使用sklearn的cross_val_score(),但是您正在使用keras,因此您将需要使用类KFold,看看此kaggle kernel,它显示了所需的实现。互联网上有很多这样的示例,只需选择您最了解的示例即可。

因此,我无法理解该异常。

cross_val_score()接受一个估算器作为第一个参数。什么是估计量?根据文档,估计器是实现的类,该类具有定义的结构,紧随this documentation.

如您所见,您的keras模型没有实现结构的一部分,因此会出现错误:

它似乎不是scikit-learn估计器,因为它没有实现'get_params'方法。] >

© www.soinside.com 2019 - 2024. All rights reserved.