使用sklearn一键编码后,如何给出列名?

时间:2019-05-28 09:19:01

标签: python encoding scikit-learn one-hot-encoding

这是我的问题,希望有人能帮助我解决这个问题。

为说明起见,我的数据集中有10多个类别列,每个列都有200-300个类别。我想将它们转换为二进制值。为此,我使用了第一个标签编码器将字符串类别转换为数字。标签编码器代码和输出如下所示。

https://i.stack.imgur.com/MIVHV.png

在标签编码器之后,我再次使用了一个来自scikit-learn的Hot Encoder,它可以正常工作。但是问题是,我需要在一个热编码器之后添加列名。例如,A列在编码前具有分类值。 A = [1,2,3,4,..]

应该像编码后一样

  

A-1,A-2,A-3

任何人都知道一种热编码后如何将列名分配给(旧列名-值名称或数字)。这是我的一种热门编码,它是输出的;

https://i.stack.imgur.com/kgrNa.png

我需要列带有名称的列,因为我训练了ANN,但是每次出现数据时,我都无法一次又一次地转换所有过去的数据。因此,我想每次仅添加新的。还是谢谢你。

3 个答案:

答案 0 :(得分:9)

此示例可能对将来的读者有所帮助

import pandas as pd
from sklearn.preprocessing import OneHotEncoder

train_X = pd.DataFrame({'Sex':['male', 'female']*3, 'AgeGroup':[0,15,30,45,60,75]})
>>>
     Sex     AgeGroup
0    male         0
1  female        15
2    male        30
3  female        45
4    male        60
5  female        75
encoder=OneHotEncoder(sparse=False)

train_X_encoded = pd.DataFrame (encoder.fit_transform(train_X[['Sex']]))

train_X_encoded.columns = encoder.get_feature_names(['Sex'])

train_X.drop(['Sex'] ,axis=1, inplace=True)

OH_X_train= pd.concat([train_X, train_X_encoded ], axis=1)
>>>
    AgeGroup  Sex_female  Sex_male
0         0         0.0       1.0
1        15         1.0       0.0
2        30         0.0       1.0
3        45         1.0       0.0
4        60         0.0       1.0
5        75         1.0       0.0`

答案 1 :(得分:1)

嘿,我遇到了同样的问题,我有一个自定义 Estimator,它扩展了 Sklearn.base 的 BaseEstimator 类

我在 init 中添加了一个名为 self.feature_names 的类属性,然后作为转换方法的最后一步,使用结果中的列更新了 self.feature_names。

from sklearn.base import BaseEstimator, TransformerMixin
import pandas as pd

class CustomOneHotEncoder(BaseEstimator, TransformerMixin):

    def __init__(self, **kwargs):
        self.feature_names = []

    def fit(self, X, y=None):
        return self

    def transform(self, X):

        result = pd.get_dummies(X)
        self.feature_names = result.columns

        return result

我知道一些基本知识,但它可以完成我需要的工作。

如果您想从 sklearn 管道中检索特征重要性的列名,您可以从分类器步骤中获取特征,并从一个热编码步骤中获取列名。

a = model.best_estimator_.named_steps["clf"].feature_importances_
b = model.best_estimator_.named_steps["ohc"].feature_names

df = pd.DataFrame(a,b)
df.sort_values(by=[0], ascending=False).head(20)

答案 2 :(得分:0)

您可以使用.get_feature_names()属性获取列名。

>>> ohenc.get_feature_names()
>>> x_cat_df.columns = ohenc.get_feature_names()

详细示例为here