FeatureUnion: сохранить существующие функции плюс добавить новые инженерные функции (также известные как преобразованные столбцы) - PullRequest
0 голосов
/ 05 мая 2020

Допустим, у меня есть набор данных с двумя числовыми столбцами, и я хотел бы добавить третий столбец, который является продуктом двух (или какой-либо другой функцией двух существующих столбцов). Я могу вычислить новую функцию, используя ColumnTransformer:

tfs = make_column_transformer(
  (FunctionTransformer(lambda X: np.sqrt(X[:,0] - X[:,1]).reshape(-1, 1)), ["colX", "colY"]),
)

(X это pandas DataFrame, поэтому индексация по именам столбцов. Также обратите внимание на reshape, которые мне пришлось Может быть, у кого-то есть идея получше.)

Как написано выше, я хотел бы сохранить исходные функции (аналогичные тем, что делает sklearn.preprocessing.PolynomialFeatures), т.е. использовать все 3 столбца для соответствия линейной модели ( или обычно используйте их в конвейере sklearn). Как мне это сделать?

Например,

df = pd.DataFrame({'colX': [3, 4], 'colY': [2, 1]}) 
tfs = make_column_transformer(
  (FunctionTransformer(lambda X: np.sqrt(X[:,0] - X[:,1]).reshape(-1, 1)), ["colX", "colY"]),
)
tfs.fit_transform(df)

дает

array([[1.        ],
      [1.73205081]])

, но я хотел бы получить массив, включающий исходные столбцы, чтобы передать это в pipeline.

Единственный способ, который я мог придумать, - это FeatureUnion с преобразованием идентичности для первых двух столбцов. Есть ли более прямой способ?

(я хотел бы создать конвейер, а не изменять DataFrame, чтобы не забыть сделать аугментацию при вызове model.predict().)

1 Ответ

0 голосов
/ 05 мая 2020

При более внимательном чтении документации я обнаружил, что можно передать «строки в специальном регистре», чтобы «указать на удаление столбцов или их пропускание через непреобразованные, соответственно».

Таким образом, одна из возможностей достижения моей цели:

tfs = make_column_transformer(
  (FunctionTransformer(lambda X: np.sqrt(X[:,0] - X[:,1]).reshape(-1, 1)), ["colX", "colY"]),
  ("passthrough", df.columns)
)

, что дает

array([[1.        , 3.        , 2.        ],
       [1.73205081, 4.        , 1.        ]])

В конце концов, нет необходимости в FeatureUnion, но это можно сделать с помощью ColumnTransformer или make_column_transformer в одиночку, соответственно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...