如何在使用 sklearn 进行一次热编码后给出列名?

Posted

技术标签:

【中文标题】如何在使用 sklearn 进行一次热编码后给出列名?【英文标题】:How to give column names after one-hot encoding with sklearn? 【发布时间】:2019-10-13 18:48:48 【问题描述】:

这是我的问题,希望有人能帮我弄清楚..

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

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

编码后应该是这样的,

A-1、A-2、A-3

任何人都知道如何在一次热编码后将列名分配给(旧列名-值名称或编号)。这是我的一个热编码和它的输出;

我需要带有名称的列,因为我训练了一个人工神经网络,但是每次出现数据时,我都无法一次又一次地转换所有过去的数据。所以,我想每次都添加新的。还是谢谢..

【问题讨论】:

请DO NOT use images of code。 从代码编辑器中复制实际文本,将其粘贴到问题中,然后将其格式化为代码。这有助于其他人更轻松地阅读和测试您的代码 【参考方案1】:

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

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

详细示例为here。

更新

从 1.0 版开始,使用 get_feature_names_out

【讨论】:

get_feature_names 在 scikit-learn 1.2 中已弃用,请改用 get_feature_names_out 谢谢。我认为它在 v1.0 中已被弃用。 reference。 BTW,1.2版本还没发布!【参考方案2】:

更新:根据@Venkatachalam 的回答,get_feature_names() 方法已在scikit-learn 1.0 中弃用。尝试运行它时会收到警告。相反,请使用get_feature_names_out():

import pandas as pd
from category_encoders.one_hot import OneHotEncoder

ohenc = OneHotEncoder(sparse=False)
x_cat_df = pd.DataFrame(ohenc.fit_transform(xtrain_lbl))
x_cat_df.columns = ohenc.get_feature_names_out(input_features=xtrain_lbl.columns)

OneHotEncoder()中设置参数sparse=False会返回一个数组而不是稀疏矩阵,所以后面不需要转换。 fit_transform() 会在一行中计算参数和变换训练集。

来源:OneHotEncoder documentation

【讨论】:

【参考方案3】:

category_encoders 包还有另一种简单的方法,此方法使用管道,这也是数据科学最佳实践之一。

import pandas as pd
from category_encoders.one_hot import OneHotEncoder

X = pd.DataFrame('Sex':['male', 'female']*3, 'AgeGroup':[0,15,30,45,60,75])

ohe = OneHotEncoder(use_cat_names=True)
ohe.fit_transform(X)

【讨论】:

【参考方案4】:

嘿,我遇到了同样的问题,我有一个自定义 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)

【讨论】:

【参考方案5】:

这个例子可以帮助未来的读者:

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`

【讨论】:

尝试运行此示例并显示:'ValueError: could not convert string to float:'female'' 谢谢!混凝土和它的工作原理

以上是关于如何在使用 sklearn 进行一次热编码后给出列名?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 sklearn 对 CSV 文件中的多列进行一次热编码?

使用 sklearn 或 pandas 进行一次热编码后,如何在混合数据集(数值 + 分类)上应用 KNN

如何在 Python 中对数据框列进行一次热编码?

一次对多列进行一次热编码并附加到主数据集?

Scikit-Learn-对熊猫数据帧的某些列进行一次热编码

如何在 python 中对数字进行一次热编码?