Scikit learn 随机搜索CV抽样分布

Scikit learn 随机搜索CV抽样分布,scikit-learn,python-3.8,Scikit Learn,Python 3.8,根据随机搜索CV(重点矿山): 参数分布:dict或dict列表 以参数名称(str)作为键和分布的字典或 要尝试的参数列表。分发必须提供rvs方法 用于采样(例如来自scipy.stats.distributions的采样)。如果有一份清单 在给定的条件下,对其进行均匀采样如果给出了DICT列表,则首先 对dict进行均匀采样,然后使用 这句话如上所述。 如果我对上述内容的理解是正确的,则以下示例中的两种算法(XGBClassifier和LogisticRegression)都应以高概率(>9

根据随机搜索CV(重点矿山):

参数分布:dict或dict列表

以参数名称(str)作为键和分布的字典或 要尝试的参数列表。分发必须提供rvs方法 用于采样(例如来自scipy.stats.distributions的采样)。如果有一份清单 在给定的条件下,对其进行均匀采样如果给出了DICT列表,则首先 对dict进行均匀采样,然后使用 这句话如上所述。

如果我对上述内容的理解是正确的,则以下示例中的两种算法(XGBClassifier和LogisticRegression)都应以高概率(>99%)进行采样,假设n_iter=10

from sklearn.datasets import load_breast_cancer
from sklearn.preprocessing import StandardScaler
from xgboost.sklearn import XGBClassifier
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.feature_selection import RFE
from sklearn.model_selection import RandomizedSearchCV
from sklearn.pipeline import Pipeline


param_grid = [
              {'scaler': [StandardScaler()],
               'feature_selection': [RFE(estimator=XGBClassifier(use_label_encoder=False, eval_metric='logloss'))],
               'feature_selection__n_features_to_select': [3],
               'classification': [XGBClassifier(use_label_encoder=False, eval_metric='logloss')],
               'classification__n_estimators': [100, 200, 300, 400, 500, 600, 700, 800, 900, 1000],
               'classification__max_depth': [2, 5, 10],
               },
              {'scaler': [StandardScaler()],
               'feature_selection': [RFE(estimator=LogisticRegression())],
               'feature_selection__n_features_to_select': [3],
               'classification': [LogisticRegression()],
               'classification__C': [0.1],
               },
              ]


pipe = Pipeline(steps=[('scaler', StandardScaler()), ('feature_selection', RFE(estimator=LogisticRegression())),
                       ('classification', LogisticRegression())])

classifier = RandomizedSearchCV(estimator=pipe, param_distributions=param_grid,
                                scoring='neg_brier_score', n_jobs=-1, verbose=10)

data = load_breast_cancer()
X = data.data
y = data.target.ravel()
classifier.fit(X, y)
但是,每次运行XGBClassifier时,都会选择10/10次。我希望有一名候选人来自Logistic Regression,因为每个dict被抽样的概率是50-50。 如果两种算法之间的搜索空间更加平衡(“分类估值器”:[100]),则抽样工作与预期一样。
有人能澄清一下这里发生了什么吗?

是的,这是不正确的行为。有一个问题:当所有条目都是列表(没有一个是scipy分布)时,从
参数网格
中选择点,这意味着它将不成比例地从列表中的较大字典网格中选择点


在修复程序合并之前,您可能可以通过对您不关心的内容使用scipy发行版来解决此问题,例如
verbose

当从在线来源(如文档)引用时,请同时包含链接(已编辑)。