我想运行以下命令
RandomizedSearch
:
from scipy.stats import reciprocal, uniform
tree_reg = DecisionTreeRegressor()
param_grid = {
"max_depth": np.arange(1, 12, 1),
"min_samples_leaf": np.arange(2, 2259, 10),
"min_samples_split": np.arange(2, 2259, 2),
"max_leaf_nodes": np.arange(2, 2259, 2),
"max_features": np.arange(2, len(features))
}
rnd_search_tree = RandomizedSearchCV(tree_reg, param_grid,cv=cv_split, n_iter=10000,
scoring=['neg_root_mean_squared_error', 'r2'], refit='neg_root_mean_squared_error',
return_train_score=True, verbose=2)
rnd_search_tree.fit(dataset_prepared_stand, dataset_labels)
其中 2259 是我拥有的数据点数量。但是,我收到以下错误:
OverflowError Traceback (most recent call last)
<ipython-input-809-76074980f31c> in <module>
13 return_train_score=True, verbose=2)
14
---> 15 rnd_search_tree.fit(dataset_prepared_stand, dataset_labels)
~\anaconda3\envs\data_analysis\lib\site-packages\sklearn\utils\validation.py in inner_f(*args, **kwargs)
70 FutureWarning)
71 kwargs.update({k: arg for k, arg in zip(sig.parameters, args)})
---> 72 return f(**kwargs)
73 return inner_f
74
~\anaconda3\envs\data_analysis\lib\site-packages\sklearn\model_selection\_search.py in fit(self, X, y, groups, **fit_params)
734 return results
735
--> 736 self._run_search(evaluate_candidates)
737
738 # For multi-metric evaluation, store the best_index_, best_params_ and
~\anaconda3\envs\data_analysis\lib\site-packages\sklearn\model_selection\_search.py in _run_search(self, evaluate_candidates)
1529 evaluate_candidates(ParameterSampler(
1530 self.param_distributions, self.n_iter,
-> 1531 random_state=self.random_state))
~\anaconda3\envs\data_analysis\lib\site-packages\sklearn\model_selection\_search.py in evaluate_candidates(candidate_params)
698
699 def evaluate_candidates(candidate_params):
--> 700 candidate_params = list(candidate_params)
701 n_candidates = len(candidate_params)
702
~\anaconda3\envs\data_analysis\lib\site-packages\sklearn\model_selection\_search.py in __iter__(self)
283 n_iter = grid_size
284 for i in sample_without_replacement(grid_size, n_iter,
--> 285 random_state=rng):
286 yield param_grid[i]
287
sklearn\utils\_random.pyx in sklearn.utils._random.sample_without_replacement()
OverflowError: Python int too large to convert to C long
如果我只删除其中一个参数进行搜索(或者例如将范围的步长减少到 1000),我就无法理解。有没有办法解决它传递我想尝试的所有值?
我没有看到除了删除
RandomizedSearchCV
之外的其他选择。在内部 RandomSearchCV
调用 sample_without_replacement
从特征空间中采样。当你的特征空间大于 C 的 long
大小时,scikit-learn 的 sample_without_replacement
就会崩溃。
optuna
作为替代方案。它更智能地决定在特征空间中的哪个位置花费时间进行评估(更多地关注高性能区域),并且不需要您事先限制特征空间精度(即,您可以省略步长)。更一般地说,请查看 AutoML 领域。
但是,如果您坚持随机搜索,则必须找到另一种实现。实际上,
optuna
还支持随机采样器。
您可以预先自行采样
n_iter
组合,并在该随机子网格上执行 GridSearchCV:
import random
def parameter_sampler(full_grid, n_iter, random_state=None):
"""
sklearn's ParameterSampler (which, e.g., RandomizedSearchCV uses)
hits overflow error if grid is too large, so we roll our own by
producing a list-of-dicts amenable to be used in a GridSearchCV.
"""
random.seed(random_state)
return [{param_name: [random.choice(param_possibilities)]
for param_name, param_possibilities in full_grid.items()}
for _ in range(n_iter)]
# Somewhere down the road...
param_grid = {...}
gs = GridSearchCV(model,
param_grid=parameter_sampler(param_grid, n_iter=1_000),
...)