使用 scipy 分布运行 RandomizedSearchCV 时出现“溢出错误:Python int 太大,无法转换为 C long”

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

我想运行以下命令

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),我就无法理解。有没有办法解决它传递我想尝试的所有值?

python scipy integer-overflow grid-search
2个回答
3
投票

我没有看到除了删除

RandomizedSearchCV
之外的其他选择。在内部
RandomSearchCV
调用
sample_without_replacement
从特征空间中采样。当你的特征空间大于 C 的
long
大小时,scikit-learn 的
sample_without_replacement
就会崩溃。

幸运的是,随机搜索无论如何都很糟糕。查看

optuna
作为替代方案。它更智能地决定在特征空间中的哪个位置花费时间进行评估(更多地关注高性能区域),并且不需要您事先限制特征空间精度(即,您可以省略步长)。更一般地说,请查看 AutoML 领域。

但是,如果您坚持随机搜索,则必须找到另一种实现。实际上,

optuna
支持随机采样器


0
投票

您可以预先自行采样

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),
                  ...)
© www.soinside.com 2019 - 2024. All rights reserved.