У меня есть хороший конвейер, который делает следующее:
pipeline = Pipeline([
("first transformer", ct),
("second transformer", OHE),
('standard_scaler', MinMaxScaler()),
("logistic regression", estimator)
])
Часть оценки такова:
estimator = MultiOutputClassifier(
estimator = LogisticRegression(penalty = "l2", C=2)
)
Метка DataFrame имеет форму (1000, 2), и пока все работает хорошо.
Чтобы настроить модель, я теперь пытаюсь добавить SelectKBest, чтобы ограничить функции, используемые для вычислений. К сожалению, добавление этого кода в конвейер:
('feature_selection', SelectKBest(score_func=f_regression, k=9))
возвращает эту ошибку:
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),
])