【问题标题】:sklearn's `RandomizedSearchCV` not working with `np.random.RandomState`sklearn 的“RandomizedSearchCV”不适用于“np.random.RandomState”
【发布时间】:2017-03-06 14:36:20
【问题描述】:

我正在尝试优化管道并想尝试给 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()

【问题讨论】:

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


    【解决方案1】:

    您观察到的结果是预期的,因为 np.random.RandomState() 类型的对象的类方法 uniform 在调用时立即抽取样本

    与此相比,您对 scipy 的 stats.uniform() 的使用创建了一个尚未从中采样的分布。 (虽然我不确定它是否按您的预期工作;请注意参数)。

    如果你想合并基于np.random.RandomState() 的东西,你必须像docs 中提到的那样构建自己的类:

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

    【讨论】:

    • 谢谢! RandomizedSearchCV(model, param_distributions={"bandwidth":stats.uniform(0.1, 1)}, n_iter=30, n_jobs=2) 有错误吗?我是基于jakevdp.github.io/blog/2013/12/01/kernel-density-estimation
    • @O.rka 统一类不实现构造函数参数as i see it。继承自的上层类仅使用命名参数,如 a 和 b 作为范围。所以我担心,你正在从(0,1)的默认范围内做样本,但我对此不是 100% 确定的。但这应该很容易检查。
    • 它会做这样的事情吗? stats.uniform(5,1).rvs(3).tolist() # [5.172340508345329, 5.137135749628878, 5.932595463037163] 还是后端不一样?
    • @O.rka 我希望它只使用您展示的rvs-方法。它确实看起来你使用它的方式没问题(假设:This distribution is constant between loc and loc + scale. 是你想要的)
    猜你喜欢
    • 2018-03-09
    • 2019-11-28
    • 2019-08-18
    • 2015-03-26
    • 2018-03-25
    • 2018-08-20
    • 2018-02-05
    • 1970-01-01
    • 2016-06-02
    相关资源
    最近更新 更多