`RandomizedSearchCV` от sklearn не работает с `np.random.RandomState`

#numpy #random #scikit-learn #distribution #grid-search

#numpy #Случайный #scikit-учиться #распределение #поиск по сетке

Вопрос:

Я пытаюсь оптимизировать конвейер и хотел попробовать предоставить 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:

То, что вы наблюдаете, ожидаемо, поскольку метод класса uniform объекта типа np.random.RandomState() немедленно извлекает выборку во время вызова.

По сравнению с этим, ваше использование scipy stats.uniform() создает дистрибутив, из которого еще предстоит сделать выборку. (Хотя я не уверен, работает ли он так, как вы ожидаете в вашем случае; будьте осторожны с параметрами).

Если вы хотите включить что-то, основанное на np.random.RandomState() , вам нужно создать свой собственный класс, как указано в документах:

В этом примере используется модуль scipy.stats, который содержит множество полезных распределений для параметров выборки, таких как expon, gamma, uniform или randint. В принципе, может быть передана любая функция, которая предоставляет метод rvs (случайная выборка) для выборки значения. Вызов функции rvs должен предоставлять независимые случайные выборки из возможных значений параметров при последовательных вызовах.

Комментарии:

1. Спасибо! Есть ли ошибка в 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

2. @O.rka Унифицированный класс не реализует аргументы конструктора, как я это вижу . Верхний класс, унаследованный от, использует только именованные аргументы, такие как a и b, для диапазона. Поэтому я боюсь, что то, что вы делаете, выборка из диапазона по умолчанию (0,1), но я не уверен в этом на 100%. Но это должно быть легко проверить.

3. Делает ли он что-то подобное? stats.uniform(5,1).rvs(3).tolist() # [5.172340508345329, 5.137135749628878, 5.932595463037163] или в серверной части все по-другому?

4. @O.rka Я бы ожидал, что он просто использует rvs -метод, как вы показали. И это действительно выглядит так, как вы его использовали, все в порядке (при условии, что: This distribution is constant between loc and loc scale. это то, что вы хотите)