基本上,我希望将列索引视为超参数。然后在pipeline中与其他模型超参数一起调整这个超参数。在下面的例子中,col_idx
是我的超参数。我定义了一个名为log_columns
的函数,可以对某些列进行对数变换,并且该函数可以传递给FunctionTransformer
。然后将FunctionTransformer和模型放入pipeline中。
from sklearn.svm import SVCfrom sklearn.decomposition import PCAfrom sklearn.datasets import load_digitsfrom sklearn.pipeline import make_pipelinefrom sklearn.model_selection import GridSearchCVfrom sklearn.preprocessing import FunctionTransformerdef log_columns(X, col_idx = None): log_func = np.vectorize(np.log) if col_idx is None: return X for idx in col_idx: X[:,idx] = log_func(X[:,idx]) return Xpipe = make_pipeline(FunctionTransformer(log_columns, ), PCA(), SVC())param_grid = dict(functiontransformer__col_idx = [None, [1]], pca__n_components=[2, 5, 10], svc__C=[0.1, 10, 100], )grid_search = GridSearchCV(pipe, param_grid=param_grid)digits = load_digits()res = grid_search.fit(digits.data, digits.target)
然后,我收到了以下错误消息:
ValueError: Invalid parameter col_idx for estimator FunctionTransformer(accept_sparse=False, check_inverse=True, func=<function log_columns at 0x1764998c8>, inv_kw_args=None, inverse_func=None, kw_args=None, pass_y='deprecated', validate=None). Check the list of available parameters with `estimator.get_params().keys()`.
我不确定FunctionTransformer
是否允许我按预期进行操作。如果不行,我渴望了解其他优雅的方法。谢谢!
回答:
col_idx
不是FunctionTransformer
类的有效参数,但kw_args
是。kw_args
是func
的附加关键字参数字典。在你的情况下,唯一的关键字参数是col_idx
。
尝试这样做:
param_grid = dict( functiontransformer__kw_args=[ {'col_idx': None}, {'col_idx': [1]} ], pca__n_components=[2, 5, 10], svc__C=[0.1, 10, 100],)