【问题标题】:RandomizedSearchCV sampling distributionRandomizedSearchCV 抽样分布
【发布时间】:2021-03-23 20:39:50
【问题描述】:

根据 RandomizedSearchCV documentation(强调我的):

param_distributions:字典或字典列表

以参数名称 (str) 作为键和分布的字典或 要尝试的参数列表。发行版必须提供 rvs 方法 用于采样(例如来自 scipy.stats.distributions 的采样)。如果一个列表 给定,均匀采样。 如果给出一个字典列表,首先 对字典进行均匀采样,然后使用 上面那个字典。

如果我对上面的理解是正确的,那么在给定 n_iter = 10 的情况下,以下示例中的两种算法(XGBClassifier 和 LogisticRegression)都应该以高概率(>99%)进行采样。

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 次。我希望一个候选人来自逻辑回归,因为每个字典被采样的概率是 50-50。 如果两个算法之间的搜索空间更加平衡('classification__n_estimators': [100]),那么采样按预期工作。 有人可以澄清这里发生了什么吗?

【问题讨论】:

  • 引用在线资源(例如文档)时,请同时附上链接(已编辑)。

标签: scikit-learn python-3.8


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-11
    • 2020-06-17
    • 1970-01-01
    • 2020-06-29
    • 2015-08-28
    • 1970-01-01
    • 2018-11-24
    相关资源
    最近更新 更多