python - 从 scikit-learn 设计矩阵中提取特征和级别的名称
问题描述
有没有办法在 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
为数据框只是为了更好地打印。在这个简单的情况下,我可以弄清楚每列是什么,但对于更复杂的场景,如果有某种方法可以确定每列对应的内容,那就太好了。换句话说,对于设计矩阵中的给定列,它对应于哪个特征?是否缺少指标列?如果它对应于一个分类变量,该列代表哪个级别?
该类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 捆绑的包,会更容易。
解决方案
跟踪功能的一种方法是为管道的每一步保留 DataFrame。
- 参见pd pipe,它也实现了sklearn_stages
在创建新功能时,例如使用 One-Hot-Encoder 时,很容易跟踪每个功能的来源。即my_feature_x1
, my_feature_x2
, ...
推荐阅读
- html - CSS3 没有链接到 HTML5?
- web-services - 测试/托管网络服务
- stm32f4 - STM32 ADC设置频率采样
- python - 如何使用 Python 将 JSON 数据文件映射到 SQLIte 数据库
- javascript - Vanilla JS+AJAX - 检查一个值是否已经存在
- visual-studio-code - 在 vue-cli-3 项目上运行 Mocha Test Explorer 需要哪些 babel 或其他设置?
- php - 检查时间戳的年份
- html - position: fixed 防止元素正确居中
- prolog - 如何从命令行运行 prolog 文件而不是放到 repl 中?
- java - 子类中的构造函数,只有超类的部分参数