Python 如何将FunctionTransformer与GridSearchCV一起制作成管道?;

Python 如何将FunctionTransformer与GridSearchCV一起制作成管道?;,python,machine-learning,scikit-learn,Python,Machine Learning,Scikit Learn,基本上,我想将列索引作为超参数处理。然后将此超参数与管道中的其他模型超参数一起调整。在下面的示例中,col_idx是我的超参数。我自定义了一个名为log\u columns的函数,它可以对某些列执行日志转换,并且该函数可以传递到FunctionTransformer。然后将FunctionTransformer和模型放入管道中 from sklearn.svm import SVC from sklearn.decomposition import PCA from sklearn.datase

基本上,我想将列索引作为超参数处理。然后将此超参数与管道中的其他模型超参数一起调整。在下面的示例中,
col_idx
是我的超参数。我自定义了一个名为
log\u columns
的函数,它可以对某些列执行日志转换,并且该函数可以传递到
FunctionTransformer
。然后将FunctionTransformer和模型放入管道中

from sklearn.svm import SVC
from sklearn.decomposition import PCA
from sklearn.datasets import load_digits
from sklearn.pipeline import make_pipeline
from sklearn.model_selection import GridSearchCV
from sklearn.preprocessing import FunctionTransformer


def 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 X

pipe = 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()`.
ValueError:估计器的参数col_idx无效
FunctionTransformer(接受稀疏=假,检查逆=真,
func=,inv\u kw\u args=无,
逆函数=None,kw\u args=None,pass\u y='deprecated',
验证=无)。使用检查可用参数的列表
`estimator.get_params().keys()`。

我不确定
FunctionTransformer
是否允许我做我期望的事情。如果没有,我渴望知道其他优雅的方法。谢谢

首先,您应该检查可以调整的参数:
pipe.get_params().keys()


之后,请查看如何组织
参数网格
首先,您应该检查可以调整的参数:
管道。获取参数().keys()


之后,请查看关于如何组织
参数网格
col\u idx
不是
FunctionTransformer
类的有效参数,但
kw\u args
是。
kw_args
func
的附加关键字参数字典。就你而言, 唯一的关键字参数是
col\u idx

试试这个:

param_grid=dict(
功能变压器功率参数=[
{'col_idx':无},
{'col_idx':[1]}
],
pca\u n\u分量=[2,5,10],
svc_uuuc=[0.1,10100],
)

col\u idx
不是
FunctionTransformer
类的有效参数,但
kw\u args
是。
kw_args
func
的附加关键字参数字典。就你而言, 唯一的关键字参数是
col\u idx

试试这个:

param_grid=dict(
功能变压器功率参数=[
{'col_idx':无},
{'col_idx':[1]}
],
pca\u n\u分量=[2,5,10],
svc_uuuc=[0.1,10100],
)