Bra*_*wan 2 python machine-learning scikit-learn
基本上,我想将列索引视为超参数。然后调整这个超参数以及管道中的其他模型超参数。在下面的示例中,这col_idx是我的超参数。我自己定义了一个函数调用log_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)
Run Code Online (Sandbox Code Playgroud)
然后,我收到以下错误消息:
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()`.
Run Code Online (Sandbox Code Playgroud)
我不确定是否FunctionTransformer允许我做我期望的事情。如果没有,我很想知道其他优雅的方法。谢谢!
小智 7
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],
)
Run Code Online (Sandbox Code Playgroud)