从scikit学习设计矩阵中提取特征和级别的名称

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从scikit学习设计矩阵中提取特征和级别的名称相关的知识,希望对你有一定的参考价值。

是否可以通过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。

[在创建新功能时,例如使用单热编码器时,可以轻松跟踪每个功能的来源。即my_feature_x1my_feature_x2,...

以上是关于从scikit学习设计矩阵中提取特征和级别的名称的主要内容,如果未能解决你的问题,请参考以下文章

[机器学习与scikit-learn-42]:特征提取-1-从字典中提取特征

从 Sklearn 管道中提取具有特征名称的特征重要性

[机器学习与scikit-learn-43]:特征工程-特征提取(编码)-2-什么是特征提取以及文本词频向量

在 scikit-learn 中,DBSCAN 可以使用稀疏矩阵吗?

如何在python中使用scikit-image greycomatrix()函数?

scikit-bio 从 gff3 文件中提取基因组特征