Я пытаюсь использовать функцию hyperparam_search
в GaussianProcessHyperparamOpt, в Deepchem. Я следую тому, что сделано в тестовом сценарии для класса HyperparamOpt (нет теста для класса gaussianprocess):
После загрузки обучающего набора et c я определяю диктитон для гиперпараметров:
hps = {
'layer_sizes': [1500],
'weight_init_stddevs': [0.02],
'bias_init_consts': [1.],
'dropouts': [0.5],
'penalty': 0.1,
'penalty_type': 'l2',
'batch_size': 50,
'nb_epoch': 10,
'learning_rate': 0.001 }
Затем я делаю функцию model_builder (это я скопировал / вставил из тестового скрипта):
def model_builder(model_params, model_dir):
return dc.models.MultitaskRegressor(
len(tasks), n_features, model_dir=model_dir, **model_params)
Затем я определяю метри c, которая в соответствии с кодом должен быть задан как список длиной 1:
regression_metric = [dc.metrics.Metric(dc.metrics.r2_score)]
Затем я вызываю функцию hyperparameter_search
, давая четыре обязательных аргумента:
optimizer = dc.hyper.GaussianProcessHyperparamOpt(model_builder)
best_hyper_params, best_performance, all_results = optimizer.hyperparam_search(
hps,
train,
valid,
transformers,
regression_metric
)
И я получаю ошибку KeyValue:
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-85-be984f768f5b> in <module>()
5 valid,
6 transformers,
----> 7 metric = regression_metric
8 )
9 # metric = regression_metric
1 frames
/usr/lib/python3.6/os.py in __getitem__(self, key)
667 except KeyError:
668 # raise KeyError with the original key value
--> 669 raise KeyError(key) from None
670 return self.decodevalue(value)
671
KeyError: 'DEEPCHEM_DATA_DIR'
Чтобы доказать, я не сумасшедший, вот код для функции, вы можете видеть, что она ожидает метри c в качестве 4-го аргумента
23 def hyperparam_search(
24 self,
25 params_dict,
26 train_dataset,
27 valid_dataset,
28 output_transformers,
29 metric,
30 direction=True,
31 n_features=1024,
32 n_tasks=1,
33 max_iter=20,
34 search_range=4,
35 hp_invalid_list=[
36 'seed', 'nb_epoch', 'penalty_type', 'dropouts', 'bypass_dropouts',
37 'n_pair_feat', 'fit_transformers', 'min_child_weight',
38 'max_delta_step', 'subsample', 'colsample_bylevel',
39 'colsample_bytree', 'reg_alpha', 'reg_lambda', 'scale_pos_weight',
40 'base_score'
41 ],
42 log_file='GPhypersearch.log'):
43 """Perform hyperparams search using a gaussian process assumption
44
45 params_dict include single-valued parameters being optimized,
46 which should only contain int, float and list of int(float)
47
48 parameters with names in hp_invalid_list will not be changed.
49
50 For Molnet models, self.model_class is model name in string,
51 params_dict = dc.molnet.preset_hyper_parameters.hps[self.model_class]
52
53 Parameters
54 ----------
55 params_dict: dict
56 dict including parameters and their initial values
57 parameters not suitable for optimization can be added to hp_invalid_list
58 train_dataset: dc.data.Dataset struct
59 dataset used for training
60 valid_dataset: dc.data.Dataset struct
61 dataset used for validation(optimization on valid scores)
62 output_transformers: list of dc.trans.Transformer
63 transformers for evaluation
64 metric: list of dc.metrics.Metric
65 metric used for evaluation
Вот как это выглядит странно: если я передам метри c как объект, а не как список, содержащий объект:
regression_metric = dc.metrics.Metric(dc.metrics.r2_score)
Я не получу KeyValue ошибка, но затем происходит сбой, когда функция проверяет, что metri c является списком длины 1: * 1 026 *
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-87-be984f768f5b> in <module>()
5 valid,
6 transformers,
----> 7 metric = regression_metric
8 )
9 # metric = regression_metric
/usr/local/lib/python3.7/site-packages/deepchem/hyper/gaussian_process.py in hyperparam_search(self, params_dict, train_dataset, valid_dataset, output_transformers, metric, direction, n_features, n_tasks, max_iter, search_range, hp_invalid_list, log_file)
89 """
90
---> 91 assert len(metric) == 1, 'Only use one metric'
92 hyper_parameters = params_dict
93 hp_list = list(hyper_parameters.keys())
TypeError: object of type 'Metric' has no len()
Любые пользователи Deepchem, если вы сделали эту функцию работающей, пожалуйста, присоединяйтесь!