sklearn的`RandomizedSearchCV`不能与`np.random.RandomState`一起使用

时间:2016-10-24 18:12:13

标签: numpy random scikit-learn distribution grid-search

我正在尝试优化管道,并希望尝试给RandomizedSearchCV一个np.random.RandomState对象。我不能工作,但我可以给它其他发行版。

我可以使用特殊语法为RandomSearchCV提供np.random.RandomState(0).uniform(0.1,1.0)吗?

from scipy import stats
import numpy as np
from sklearn.neighbors import KernelDensity
from sklearn.grid_search import RandomizedSearchCV

# Generate data
x = np.random.normal(5,1,size=int(1e3))

# Make model
model = KernelDensity()

# Gridsearch for best params
# This one works
search_params = RandomizedSearchCV(model, param_distributions={"bandwidth":stats.uniform(0.1, 1)}, n_iter=30, n_jobs=2)
search_params.fit(x[:, None])

# RandomizedSearchCV(cv=None, error_score='raise',
#           estimator=KernelDensity(algorithm='auto', atol=0, bandwidth=1.0, breadth_first=True,
#        kernel='gaussian', leaf_size=40, metric='euclidean',
#        metric_params=None, rtol=0),
#           fit_params={}, iid=True, n_iter=30, n_jobs=2,
#           param_distributions={'bandwidth': <scipy.stats._distn_infrastructure.rv_frozen object at 0x106ab7da0>},
#           pre_dispatch='2*n_jobs', random_state=None, refit=True,
#           scoring=None, verbose=0)

# This one doesn't work :(
search_params = RandomizedSearchCV(model, param_distributions={"bandwidth":np.random.RandomState(0).uniform(0.1, 1)}, n_iter=30, n_jobs=2)
# TypeError: object of type 'float' has no len()

1 个答案:

答案 0 :(得分:2)

您所观察到的内容是正确的,因为类型为uniform 的对象的类方法np.random.RandomState()会在通话时立即抽取样本

与此相比,您对scipy stats.uniform() 的使用会创建一个尚未从进行抽样的分布。 (虽然我不确定它是否像你期望的那样工作;但要注意参数)。

如果你想根据np.random.RandomState()加入一些东西,你必须像docs中提到的那样建立自己的类:

  

此示例使用scipy.stats模块,该模块包含许多用于采样参数的有用分布,例如expon,gamma,uniform或randint。原则上,可以传递任何函数,该函数提供rvs(随机变量样本)方法来对值进行采样。对rvs函数的调用应该在连续调用时提供来自可能参数值的独立随机样本。