Используйте ColumnTransformer.get_feature_names для создания обратного сопоставления объектов - PullRequest
0 голосов
/ 15 октября 2019

Предположим, у меня есть некоторый DataFrame:

import numpy as np
import pandas as pd

df = pd.DataFrame(
    {
            'a': list('abcde'),
            'b': list('aaabb')
    }
)

И я хочу использовать sklearn.compose.ColumnTransformer для его преобразования:

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

transformer = ColumnTransformer(
    [
        ('a', OneHotEncoder(), ['a']),
        ('b', OneHotEncoder(), ['b']),
    ]
)

transformer.fit(df)

Я могу получить имена функций из этого преобразователя, напримерИтак:

transformer.get_feature_names()
# ['a__x0_a', 'a__x0_b', 'a__x0_c', 'a__x0_d', 'a__x0_e', 'b__x0_a', 'b__x0_b']

Но как я могу получить сопоставление исходной «родительской» функции с каждой «дочерней» функцией?

1 Ответ

0 голосов
/ 15 октября 2019

Попробуйте это:

>>> from sklearn.base import *
>>> from sklearn.preprocessing import SimpleImputer
>>> import re
>>> transformers = [
...     (feature, t_inst)
...     for feature, t_inst, _ in transformer.transformers_
...     if isinstance(t_inst, BaseEstimator)
... ]
>>> full_mapping = {}
>>> for feature, t_inst in transformers:
...     feature_names = t_inst.get_feature_names()
...     if isinstance(t_inst, OneHotEncoder):
...             feature_names = list(map(lambda x: re.sub('^x0', feature, x), feature_names))
...     elif isinstance(t_inst, (SimpleImputer,)):
...             pass
...     else:
...             raise ValueError(f'Transformer type {t_inst.__class__.__name__} not supported')
...     full_mapping[feature] = feature_names
... 
>>> full_mapping
{'a': ['a_a', 'a_b', 'a_c', 'a_d', 'a_e'], 'b': ['b_a', 'b_b']}

Обратите внимание на использование re.sub для очистки некоторых шаблонов имен объектов, родных для sklearn.compose.ColumnTransformer.

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