当前位置: 首页 > 知识库问答 >
问题:

随机化SearchCV采样分布

关翰
2023-03-14

根据RandomizedSearchCV文件(重点是mine):

param_distributions:字典或字典列表

使用参数名称 (str) 作为键的字典,以及要尝试的分布或参数列表。分布必须提供 rvs 方法进行采样(例如来自 scipy.stats.分布的方法)。如果给出了一个列表,则对其进行统一采样。如果给出了字典列表,则首先对字典进行统一采样,然后如上所述使用该字典对参数进行采样。

如果我对上述内容的理解是正确的,那么以下示例中的两种算法(XGB 分类器和逻辑递归)都应该以高概率 (

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)

但发生的事情是,每次我运行它时,XGB分类器都会被选择10/10次。我预计会有一个候选人来自逻辑回归,因为每个要抽样的字典的概率为50-50。如果两个算法之间的搜索空间更平衡(“classification__n_estimators”:[100]),则采样按预期工作。有人可以澄清这是怎么回事吗?

共有1个答案

欧金鹏
2023-03-14

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

在修复程序合并之前,您也许可以通过对您不关心的内容使用scipy发行版来解决这个问题,比如说< code>verbose?

 类似资料:
  • 问题内容: 该模块(http://docs.python.org/2/library/random.html)具有几个 固定 功能,可以从中随机采样。例如,将从具有给定均值和sigma值的正态分布中采样随机点。 我正在寻找一种方法,该方法可以使用自己的分布 尽可能快地 在给定间隔内提取一定数量的随机样本。这就是我的意思: 这里是我后和是从中可以得出样本的限制。有这样的东西吗? 问题答案: 您需要使

  • Reference 关于乱序(shuffle)与随机采样(sample)的一点探究 - xybaby - 博客园 洗牌算法 Fisher–Yates shuffle - Wikipedia Knuth-Durstenfeld Shuffle(Fisher–Yates Shuffle 改进版) Knuth-Durstenfeld Shuffle 是一个“原地”(in-place)算法 伪代码 To

  • 问题内容: 在不从javascript中的数组进行替换的情况下,获取随机样本的一种干净方法是什么?所以假设有一个数组 我想随机采样5个唯一值;例如,生成一个长度为5的随机子集。要生成一个随机样本,可以执行以下操作: 但是,如果多次执行此操作,则可能会多次捕获同一项。 问题答案: 我建议使用Fisher-Yates混洗混洗数组的副本并进行切片: 请注意,这不是获取大型数组的随机小子集的最有效方法,因

  • 问题内容: 如何在numpy中以[a,b]间隔采样随机浮点数?不仅是整数,而且是任何实数。例如, 将在之间返回随机数。谢谢。 问题答案: 该均匀分布可能会做你的要求。

  • 我有下面的JSR223采样器,它读取图像,稍微修改它,并发送一个POST multipart/form-data请求。与HTTP采样器相比,我发现它广泛使用了CPU,但我不能使用HTTP采样器,因为它不支持在不保存到文件系统的情况下更改映像。 如果任何人有任何输入来优化JSR223采样器中的脚本,这样它就不会占用大量的CPU,我将很感激。

  • 其中是我想要的,而是绘制示例的限制。在中有类似的内容吗?