【问题标题】:How to keep track of columns after encoding categorical variables?编码分类变量后如何跟踪列?
【发布时间】:2020-02-13 13:29:57
【问题描述】:

我想知道在对数据集执行数据预处理后如何跟踪数据集的原始列?

在下面的代码中df_columns 会告诉我df_array 中的0 列是A1 列是B 等等...

但是,当我对分类列 B 进行编码时,df_columns 对于跟踪 df_dummies 不再有效

import pandas as pd
import numpy as np

animal = ['dog','cat','horse']

df = pd.DataFrame({'A': np.random.rand(9),
                   'B': [animal[np.random.randint(3)] for i in range(9)],
                   'C': np.random.rand(9),
                   'D': np.random.rand(9)})

df_array = df.values
df_columns = df.columns

from sklearn.preprocessing import OneHotEncoder
from sklearn.compose import ColumnTransformer
ct = ColumnTransformer([('encoder', OneHotEncoder(), [1])], remainder='passthrough')
df_dummies = np.array(ct.fit_transform(df_array), dtype=np.float)

解决方案应该与分类列的位置无关......无论是ABC 还是D。我可以完成繁重的工作并不断更新df_columns 字典...但它不会优雅或“pythonic”

此外...解决方案将如何跟踪分类的含义? {0,0,1} 是猫,{0,1,0} 是狗等等?

PS - 我知道虚拟变量陷阱,当我实际使用它来训练我的模型时,我会使用 df_dummies[:,1:]

【问题讨论】:

    标签: python machine-learning scikit-learn categorical-data one-hot-encoding


    【解决方案1】:

    您能否确认未来的数据集是否会继续使用相同的列名?如果我没有正确回答您的问题,您需要做的就是从原始数据框中保存 df_columns 并使用它来重新索引您的新数据框。

    new_df_reindexed = new_df[df_columns]
    

    要回答您的其他问题,您可以使用 pandas 的 get_dummies() 对您的数据进行一次热编码。使用drop_first 参数删除生成的列值之一并避免虚拟变量陷阱。另外,保存 one-hot-encoded 数据框的列列表。

    为确保您的新/测试/保留数据集与模型训练中使用的列定义相同,

    • 首先使用get_dummies() 对新数据集进行一次热编码。
    • 使用 pandas reindex 将新的数据框引入与模型训练中使用的相同的结构 - df.reindex(columns=train_one_hot_encode_col_list, axis="columns")
    • 以上内容将为训练数据集中的分类列值创建虚拟变量列,这些值不存在于新数据集的分类列中。
    • 最后,使用上述方法删除新数据集中所有旧数据集中不存在的列-test_df_reindexed = test_df_onehotencode[train_one_hot_encode_col_list]

    如果您遵循这些步骤,您可以完全依赖原始列名列表,而无需跟踪列位置或分类值定义。

    我还建议您阅读以下内容以供进一步参考: Pandas 中的 One-hot 编码 - https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.get_dummies.html 列重新索引 - https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.reindex.html

    【讨论】:

    • 嘿@RealRageDontQuit - 我已经编辑了我的回复以包括编码示例,以及有用的熊猫功能的更多资源。这回答了你的问题了吗?我假设您想保存模型训练中的列定义,然后将它们应用于测试数据集以及未来看不见的数据。但是,如果我遗漏了什么,请告诉我。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 2015-05-24
    • 1970-01-01
    • 1970-01-01
    • 2019-02-25
    • 2013-06-04
    相关资源
    最近更新 更多