Не совсем понятно, в чем именно заключается ваш вопрос. Тем не менее, согласно документации для аргумента 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).