Равномерно распределенные случайные величины в алгоритме RandomSearchCV - PullRequest
0 голосов
/ 18 июня 2020

Хотелось бы уточнить одну вещь. Я знаю, что следующая команда сгенерирует равномерно распределенную случайную переменную между (lo c, loc + scale)

from scipy.stats import uniform
C =uniform.rvs(loc=0,scale=4)
print(C)

, и давайте предположим, что я хочу использовать это распределение в логистической c регрессии, пока с использованием алгоритма RandomiizedSearchCV, как показано ниже:

parameters =dict(C =uniform(loc=0,scale=4),penalty=['l2', 'l1'])
from sklearn.model_selection import RandomizedSearchCV
clf = RandomizedSearchCV(logreg, parameters, random_state=0)
search = clf.fit(iris.data, iris.target)
print(search.best_params_)

, но я не понял одного: RandomizedSearchCV похож на поиск по сетке, просто он пытается выбрать случайное количество комбинаций с заданным количеством испытаний (n_iter ), но здесь C - это объект, это не массив или что-то вроде этого, даже я не могу распечатать его значение, так как я могу понять этот код? как он генерирует случайное число? без указания РВС?

1 Ответ

1 голос
/ 18 июня 2020

Не совсем понятно, в чем именно заключается ваш вопрос. Тем не менее, согласно документации для аргумента param_distributions (здесь parameters):

Словарь с именами параметров (str) в качестве ключей и распределений или списков параметры, чтобы попробовать. Распределения должны предоставлять метод rvs для выборки (например, из scipy.stats.distributions). Если список представлен, он выбирается равномерно.

Итак, на каждой итерации происходит следующее:

  • Пример значения для C в соответствии с равномерным распределением в [0, 4]
  • Выберите значение для penalty, равномерно между l1 и l2 (т.е. с 50% вероятностью для каждого)
  • Используйте эти выборочные значения для запуска CV и сохраните результаты

Используя пример из документации (практически идентично параметрам в вашем вопросе):

from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import RandomizedSearchCV
from scipy.stats import uniform

iris = load_iris()
logistic = LogisticRegression(solver='saga', tol=1e-2, max_iter=200,
                               random_state=0)
distributions = dict(C=uniform(loc=0, scale=4),
                      penalty=['l2', 'l1'])

clf = RandomizedSearchCV(logistic, distributions, random_state=0)
search = clf.fit(iris.data, iris.target)

получаем

search.best_params_
# {'C': 2.195254015709299, 'penalty': 'l1'}

Мы можем go сделайте следующий шаг и посмотрите все (10) использованные комбинации, а также их производительность:

import pandas as pd
df = pd.DataFrame(search.cv_results_)
print(df[['params','mean_test_score']])
# result:
                                        params  mean_test_score
0    {'C': 2.195254015709299, 'penalty': 'l1'}         0.980000
1   {'C': 3.3770629943240693, 'penalty': 'l1'}         0.980000
2   {'C': 2.1795327319875875, 'penalty': 'l1'}         0.980000
3   {'C': 2.4942547871438894, 'penalty': 'l2'}         0.980000
4     {'C': 1.75034884505077, 'penalty': 'l2'}         0.980000
5  {'C': 0.22685190926977272, 'penalty': 'l2'}         0.966667
6   {'C': 1.5337660753031108, 'penalty': 'l2'}         0.980000
7   {'C': 3.2486749151019727, 'penalty': 'l2'}         0.980000
8   {'C': 2.2721782443757292, 'penalty': 'l1'}         0.980000
9     {'C': 3.34431505414951, 'penalty': 'l2'}         0.980000

, откуда действительно очевидно, что все значения C были в [0, 1], так как просил. Кроме того, поскольку было несколько комбинаций, которые достигли наилучшего результата 0,98, scikit-learn использует первую, возвращенную в cv_results_.

Присмотревшись, мы видим, что только 4 испытания были выполнены с l1 штраф (а не 50% от 10, т.е. 5, как можно было бы ожидать), но этого следует ожидать с небольшими случайными выборками (здесь только 10).

...