Извлекайте названия функций и уровней из матрицы дизайна scikit-learn - PullRequest
1 голос
/ 07 апреля 2020

Есть ли способ scikit-learn для извлечения или вычисления имен элементов и уровней для матрицы проектирования? Вот пример:

import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.compose import make_column_transformer
from sklearn.pipeline import make_pipeline

df = pd.DataFrame(
    {
        'a': [np.nan, 2, 3, 4],
        'b': [5, 6, 7, np.nan],
        'c': ['u', 'v', 'u', 'v'],
        'd': [False, True, False, False],
        'e': ['r', 'r', 's', 's']
    }
)

scale_impute = make_pipeline(
    StandardScaler(),
    SimpleImputer(strategy='median', add_indicator=True)
)

transformer = make_column_transformer(
    (scale_impute, ['a', 'b']),
    (OneHotEncoder(), ['c', 'e']),
    remainder='passthrough'
)

X = transformer.fit_transform(df)

На консоли мы видим это:

In [7]: df                                                                                                                                                      
Out[7]: 
     a    b  c      d  e
0  NaN  5.0  u  False  r
1  2.0  6.0  v   True  r
2  3.0  7.0  u  False  s
3  4.0  NaN  v  False  s

In [8]: pd.DataFrame(X)                                                                                                                                         
Out[8]: 
          0         1    2    3    4    5    6    7    8
0  0.000000 -1.224745  1.0  0.0  1.0  0.0  1.0  0.0  0.0
1 -1.224745  0.000000  0.0  0.0  0.0  1.0  1.0  0.0  1.0
2  0.000000  1.224745  0.0  0.0  1.0  0.0  0.0  1.0  0.0
3  1.224745  0.000000  0.0  1.0  0.0  1.0  0.0  1.0  0.0

, где я преобразовал X во фрейм данных только для лучшей печати. В этом простом случае я могу выяснить, что представляет собой каждый столбец, но для более сложного сценария ios было бы неплохо, если бы был какой-то метод определения того, что соответствует каждому столбцу. Другими словами, для какого столбца в матрице дизайна, какой функции он соответствует? Это отсутствующий столбец индикатора? Если он соответствует категориальной переменной, какой уровень представляет столбец?

Класс ColumnTransformer имеет метод get_feature_names(), который, похоже, может делать то, что я хочу, но он не работает для этого примера:

In [10]: transformer.get_feature_names()                                                                                                                        
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-10-20eb841d2d36> in <module>
----> 1 transformer.get_feature_names()

/opt/anaconda3/lib/python3.7/site-packages/sklearn/compose/_column_transformer.py in get_feature_names(self)
    352                 raise AttributeError("Transformer %s (type %s) does not "
    353                                      "provide get_feature_names."
--> 354                                      % (str(name), type(trans).__name__))
    355             feature_names.extend([name + "__" + f for f in
    356                                   trans.get_feature_names()])

AttributeError: Transformer pipeline (type Pipeline) does not provide get_feature_names.

Я использую Scikit-Learn версии 0.23.1.

Я видел пакет patsy-learn , который может работать, но мне нужно запустить мой код на университетском суперкомпьютере, где будет проще, если я буду придерживаться пакетов, которые поставляются с Anaconda.

1 Ответ

1 голос
/ 07 апреля 2020

Один из способов отслеживания ваших функций - это сохранение DataFrames для каждого отдельного шага вашего конвейера.

При создании новых функций, например при использовании One-Hot-Encoder, становится легко отслеживать, откуда происходит каждая функция. т.е. my_feature_x1, my_feature_x2, ...

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