Есть ли способ 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.