gpt4 book ai didi

python - param-grid 将参数传递给底层函数。迷失在 kw_args

转载 作者:太空宇宙 更新时间:2023-11-04 04:40:58 24 4
gpt4 key购买 nike

我迷路了。希望有人能给出一些启示。

我已经建立了一个管道(sklearn 管道,准确地说是一个不平衡学习 pipeline)

管道的第一步是 FunctionSampler (imbalanced-learn 0.4.0dev 仅在 Git-hub 上可用)它是下面第 3 步中定义的自定义函数的 API 包装器。我希望能够将一系列参数传递给底层函数 - 这是我的问题。

然后我构建了一个范围为 max_samples 的网格搜索,但是当我适合时我得到了错误。

我是 python 的新手 - 如果我没有看到明显的答案,我深表歉意。

非常感谢!

1 定义自定义函数

In [90]: def outlier_rejection(X, y, max_samples):
...: model = IsolationForest(max_samples=max_samples, contamination=0.4, random_state=rng)
...: model.fit(X)
...: y_pred = model.predict(X)
...: return X[y_pred ==1], y[y_pred == 1]
...:

2 构建流水线

  pipe = make_pipeline(FunctionSampler(func=outlier_rejection, kw_args={'max_samples':1}), LogisticRegression(random_state=rng))

3 显示我需要在 kw_args 中传递 max_samples 的管道

Pipeline(memory=None,
steps=[('functionsampler', FunctionSampler(accept_sparse=True,
func=<function outlier_rejection at 0x000001173B3E9EA0>,
kw_args={'max_samples': 1})), ('logisticregression', LogisticRegression(C=1.0, class_weight=None, dual=False, fit_intercept=True,
intercept_scaling=1, max...ect at 0x0000011737DCA1B0>,
solver='liblinear', tol=0.0001, verbose=0, warm_start=False))])

4 构建网格搜索

cv = GridSearchCV(pipe, param_grid={'logisticregression__C': [1., 10.], 'functionsampler__max_samples': [1, 10, 100]})

5 fit cv 得到如下错误

ValueError: Invalid parameter max_samples for estimator FunctionSampler(accept_sparse=True,
func=<function outlier_rejection at 0x000001173B3E9EA0>,
kw_args={'max_samples': 1}). Check the list of available parameters with `estimator.get_params().keys()`.

最佳答案

这里的第一个问题是您试图将 max_samples 参数传递给 FunctionSampler(),但是 FunctionSampler() 没有将 max_samples 作为命名参数。

相反,max_samples 作为 kw_args 参数中的一个条目属于 FunctionSampler()

这表明您应该传入类似

的内容
'functionsampler__kw_args': {'max_samples': [1, 10, 100]}

GridSearchCV param_grid 参数(注意:我不确定为什么它在你的代码中被称为 params,参数是位置或在 docs 中命名为 param_grid)。

但是...您不能将字典作为 param_grid 参数中的值进行传递。这样做会引发错误:

ValueError: Parameter values for parameter (functionsampler__kw_args) need to be a sequence(but not a string) or np.ndarray.

我能想到的最佳解决方案是将 FunctionSampler() 包装在一个类中,该类接受来自 的单独的 keyvalues 参数>param_grid(例如functionsamplerwrapper__key),然后将它们放在一起作为FunctionSampler() 期望的kw_args 指令。像这样:

from imblearn import FunctionSampler
from imblearn.pipeline import make_pipeline
from sklearn.ensemble import IsolationForest
from sklearn.model_selection import GridSearchCV
from sklearn.linear_model import LogisticRegression


class FunctionSamplerWrapper(object):
def unwrap(self, key, values):
return FunctionSampler(func=outlier_rejection, kw_args={key[0]: values})

pipe = make_pipeline(FunctionSamplerWrapper().unwrap(key = ['max_samples'],
values = [1]),
LogisticRegression(random_state=rng))

cv = GridSearchCV(pipe,
[{'logisticregression__C': [1., 10.],
'functionsamplerwrapper__key': ['max_samples'],
'functionsamplerwrapper__values': [1, 10, 100]}])

注意 - 我只是检查它是否运行无误(确实如此),但我还没有实际测试数据以确保功能正确。
希望这会有所帮助。

关于python - param-grid 将参数传递给底层函数。迷失在 kw_args,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50659056/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com