使用k折叠交叉验证时出错(pytorch表格)



我正在使用k-fold交叉验证方法,但我遇到了一个错误。完整代码如下:

在这里,我将数据分为训练、测试和验证:

# set aside 20% of train and test data for evaluation
X_train, X_test, y_train, y_test = train_test_split(X, y,
test_size=0.2, shuffle = True, random_state = 8)
# Use the same function above for the validation set
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, 
test_size=0.25, random_state= 8) # 0.25 x 0.8 = 0.2

我们应该有如下的train_data,而不是pytorch表格的X_train和y_train:

train_data = X_train.copy()
train_data.loc[:, 'target'] = y_train
test_data = X_test.copy()
test_data.loc[:, 'target'] = y_test
val_data = X_val.copy()
val_data.loc[:, 'target'] = y_val

这是型号的配置:

data_config = DataConfig(
target=['target'], #target should always be a list. Multi-targets are only supported for regression. Multi-Task Classification is not implemented
continuous_cols=train_data.columns.tolist(),
categorical_cols=[],
normalize_continuous_features=True
)
trainer_config = TrainerConfig(
auto_lr_find=False,
batch_size=512,
max_epochs=50,
# track_grad_norm=2,
gradient_clip_val=10,
)
# experiment_config = ExperimentConfig(project_name="Tabular_test", log_logits=True)
optimizer_config = {'optimizer':'Adam', 'optimizer_params':{'weight_decay': 0, 'amsgrad': False}, 'lr_scheduler':None, 'lr_scheduler_params':{}, 'lr_scheduler_monitor_metric':'valid_loss'}
model_config = TabNetModelConfig(
task="classification",
n_d=10,
n_a=15,
n_steps=2,
n_independent=2,
n_shared=2,
learning_rate=1e-3
)
tabular_model = TabularModel(
data_config=data_config,
model_config=model_config,
optimizer_config=optimizer_config,
trainer_config=trainer_config,
)
mymodel = tabular_model.fit(train= train_data, validation= val_data )

现在我想使用k-fold,但当我运行以下代码时出现错误:

from sklearn.model_selection import  cross_val_score
scores = cross_val_score (mymodel , train_data , scoring = 'r2' , cv = 10)
scores

这就是错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-16-93504b57425a> in <module>
1 from sklearn.model_selection import  cross_val_score
----> 2 scores = cross_val_score (mymodel , train_data , scoring = 'r2' , cv = 10)
3 scores
1 frames
/usr/local/lib/python3.7/dist-packages/sklearn/metrics/_scorer.py in check_scoring(estimator, scoring, allow_none)
448         raise TypeError(
449             "estimator should be an estimator implementing 'fit' method, %r was passed"
--> 450             % estimator
451         )
452     if isinstance(scoring, str):
TypeError: estimator should be an estimator implementing 'fit' method, None was passed

以及当我运行时:

from sklearn.model_selection import  cross_val_score
tabular_model.fit(train= train_data, validation= val_data )
scores = cross_val_score (tabular_model, train_data , scoring = 'r2' , cv = 10)
scores

我得到以下错误:

Empty                                     Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/joblib/parallel.py in dispatch_one_batch(self, iterator)
821             try:
--> 822                 tasks = self._ready_batches.get(block=False)
823             except queue.Empty:
7 frames
Empty: 
During handling of the above exception, another exception occurred:
TypeError                                 Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/sklearn/base.py in clone(estimator, safe)
78                     "it does not seem to be a scikit-learn "
79                     "estimator as it does not implement a "
---> 80                     "'get_params' method." % (repr(estimator), type(estimator))
81                 )
82 
TypeError: Cannot clone object '<pytorch_tabular.tabular_model.TabularModel object at 0x7f46dac439d0>' (type <class 'pytorch_tabular.tabular_model.TabularModel'>): it does not seem to be a scikit-learn estimator as it does not implement a 'get_params' method.

tabular_model.fit返回None(https://github.com/manujosephv/pytorch_tabular/blob/0544fba3c173c5d2bf5153ef189243ff6e0a186f/pytorch_tabular/tabular_model.py#L394)

为了使用cross_val_score,类应该实现一些方法,如fitget_params。这个类没有所有的方法。因此,为了将其用于cross_val_score,您可以扩展此类并添加所需的方法,或者为cross validation使用其他方法。

从v 1.0开始,PyTorch Tabular也有一个低级别的API,可用于交叉验证工作流。可以在这里找到一个例子

最新更新