gpt4 book ai didi

python - 通过嵌套 RFECV 和 GridSearchCV 传递管道的问题

转载 作者:行者123 更新时间:2023-12-04 17:32:10 25 4
gpt4 key购买 nike

我正在尝试对 sklearn 中的嵌套 CV 的内循环执行特征选择和网格搜索。虽然我可以将管道作为估算器传递给 RFECV,但当我将 RFECV 作为估算器传递给 GridSearchCV 时,我会收到拟合错误>.

我发现将管道中模型的名称更改为“估计器”会将错误移至具有“回归无效参数”的管道,而不是在 RFECV 中,无论我将其命名为模型是无效参数。

我已经使用 rfcv.get_params().keys()pipeline.get_params().keys() 验证了我正在调用的参数确实存在。

如果我将 SGDRegressor() 直接命名为“估计器”并完全忽略管道,我不会收到此错误,但此模型需要对 Y 变量进行特征缩放和对数转换。

from sklearn.compose import TransformedTargetRegressor
from sklearn.pipeline import Pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.feature_selection import RFECV
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import SGDRegressor

import numpy as np
# random sample data
X = np.random.rand(100,2)
y = np.random.rand(100)

#passing coef amd importance through pipe and TransformedTargetRegressor
class MyPipeline(Pipeline):
@property
def coef_(self):
return self._final_estimator.coef_
@property
def feature_importances_(self):
return self._final_estimator.feature_importances_

class MyTransformedTargetRegressor(TransformedTargetRegressor):
@property
def feature_importances_(self):
return self.regressor_.feature_importances_

@property
def coef_(self):
return self.regressor_.coef_

# build pipeline
pipeline = MyPipeline([ ('scaler', MinMaxScaler()),
('estimator', MyTransformedTargetRegressor(regressor=SGDRegressor(), func=np.log1p, inverse_func=np.expm1))])

# define tuning grid
parameters = {"estimator__regressor__alpha": [1e-5,1e-4,1e-3,1e-2,1e-1],
"estimator__regressor__l1_ratio": [0.001,0.25,0.5,0.75,0.999]}

# instantiate inner cv
inner_kv = KFold(n_splits=5, shuffle=True, random_state=42)
rfcv = RFECV(estimator=pipeline, step=1, cv=inner_kv, scoring="neg_mean_squared_error")

cv = GridSearchCV(estimator=rfcv, param_grid=parameters, cv=inner_kv, iid=True,
scoring= "neg_mean_squared_error", n_jobs=-1, verbose=True)
cv.fit(X,y)

我收到以下错误,可以确认 regressor 是估算器管道的参数:

ValueError: Invalid parameter regressor for estimator MyPipeline(memory=None,
steps=[('scaler', MinMaxScaler(copy=True, feature_range=(0, 1))),
('estimator',
MyTransformedTargetRegressor(check_inverse=True,
func=<ufunc 'log1p'>,
inverse_func=<ufunc 'expm1'>,
regressor=SGDRegressor(alpha=0.0001,
average=False,
early_stopping=False,
epsilon=0.1,
eta0=0.01,
fit_intercept=True,
l1_ratio=0.15,
learning_rate='invscaling',
loss='squared_loss',
max_iter=1000,
n_iter_no_change=5,
penalty='l2',
power_t=0.25,
random_state=None,
shuffle=True,
tol=0.001,
validation_fraction=0.1,
verbose=0,
warm_start=False),
transformer=None))],
verbose=False). Check the list of available parameters with `estimator.get_params().keys()`.

谢谢

最佳答案

它必须是 estimator__estimator__regressor 因为你在 rfecv 中有管道。

试试这个!

parameters = {"estimator__estimator__regressor__alpha": [1e-5,1e-4,1e-3,1e-2,1e-1], 
"estimator__estimator__regressor__l1_ratio": [0.001,0.25,0.5,0.75,0.999]}

注意:嵌套 CV 不是正确的方法。也许你可以单独进行特征选择,然后进行模型训练。

关于python - 通过嵌套 RFECV 和 GridSearchCV 传递管道的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58678439/

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