对流水线中的同一个估计器使用不同的特征

Using different features for the same estimator in the pipeline

我有一个很好的管道,可以执行以下操作:

pipeline = Pipeline([
    ("first transformer", ct),
    ("second transformer", OHE),
    ('standard_scaler', MinMaxScaler()),
    ("logistic regression", estimator)
])

估算器部分是这样的:

estimator = MultiOutputClassifier(
    estimator = LogisticRegression(penalty="l2", C=2)
)

Label DataFrame 的形状为 (1000, 2),到目前为止一切正常。

为了调整模型,我现在尝试添加 SelectKBest 以限制用于计算的特征。不幸的是,将此代码添加到管道中:

('feature_selection', SelectKBest(score_func=f_regression, k=9))

returns 这个错误:

ValueError: y should be a 1d array, got an array of shape (20030, 2) instead.

我了解它的来源,并且仅使用一个标签 (1000, 1) 即可解决问题,但这意味着我需要为每个标签创建两个单独的管道。

是否有任何方法可以在此管道中包含特征选择而不诉诸于此?

由于您希望(可能)为每个输出使用不同的特征子集,您应该将 SelectKBest 放入管道中,其中 LogisticRegression 位于 MultiOutputClassifier.

clf = Pipeline([
    ("feature_selection", SelectKBest(score_func=f_regression, k=9)),
    ("logistic regression", LogisticRegression(penalty="l2", C=2)),
])
estimator = MultiOutputClassifier(clf)

pipeline = Pipeline([
    ("first transformer", ct),
    ("second transformer", OHE),
    ('standard_scaler', MinMaxScaler()),
    ("select_and_model", estimator),
])