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

Posted

技术标签:

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

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

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

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

编码后应该是这样的,

A-1、A-2、A-3

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

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

【问题讨论】:

使用 Dataframe.get_dummies() 代替 scikit 转换器,它会自动为它们分配适当的列名 如果您想创建一个 API 或您想要序列化标签和一个热编码器以便能够将输入数据快速转换为模型可读数据的东西,这可能不合适. 当我使用 DataFrame.get_dummies 时,我收到一条错误消息,指出 AttributeError: 'DataFrame' object has no attribute 'get_dummies' 问题会更好,代码为 text 而不是图像。 【参考方案1】:

我使用以下代码将每个 one-hot 编码列重命名为“原始 name_one-hot 编码名称”。因此,对于您的示例,它将给出 A_1、A_2、A_3。请随意将下面的“_”更改为“-”。

#Create list of columns with "object" dtype
cat_cols = [col for col in df_pro.columns if df_pro[col].dtype == np.object]

#Find the array of new columns from one-hot encoding
cat_labels = ohenc.categories_

#Convert array of columns into list
cat_labels = np.concatenate(cat_labels).ravel().tolist()

#Use list comprehension to generate new list with labels needed    
cat_labels_new = [(col + "_" + label) for label in cat_labels for col in cat_cols if 
label in df_pro[col].values.tolist()]

#Create new DataFrame of transformed columns using new list labels
cat_ohc = pd.DataFrame(cat_arr, columns = cat_labels)

#Concat with original DataFrame and drop original columns (only columns with "object" dtype)

【讨论】:

【参考方案2】:

正如@Vivek Kumar 所说,您可以使用pandas 函数get_dummies() 而不是OneHotEncoder。我想保留我的初始 DataFrame 的一个版本,所以我做了以下操作;

import pandas as pd
DataFrame2 = pd.get_dummies(DataFrame)

【讨论】:

他知道,这不是他要问的。当您使用复杂的 Pipelines 和 ColumnTransformers 时,您不能使用 get dummies。 我一定错过了什么。哪里需要复杂的管道,我建议使用它而不是 ColumnTransformer 好吧,尽管您可以使用 get dummy,但在单个管道中应用所有转换大大提高了模型的可移植性和可重复性。假设我要在不同的环境中重新创建模型。我可以重做假人并确保它以相同的方式转换数据,或者只是应用相同的确切管道......

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

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

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

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

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

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

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