编码分类变量后如何跟踪列?

问题描述 投票:1回答:1

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

在下面的代码中,df_columns会告诉我0中的df_array列为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)

该解决方案应该与分类列的位置无关……可以是ABCD。我可以做艰苦的工作,并不断更新df_columns词典...但是它不是优雅的或“ pythonic”的]

此外,该解决方案将如何跟踪类别的含义? {0,0,1}是猫,{0,1,0}是狗,依此类推?

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

python machine-learning scikit-learn categorical-data one-hot-encoding
1个回答
1
投票

您能否确认将来的数据集是否将继续具有相同的列名?如果我的问题正确无误,那么您要做的就是从原始数据框中保存df_columns,并使用它为新数据框重新编制索引。

new_df_reindexed = new_df[df_columns]

要回答您的其他问题,您可以使用熊猫的get_dummies()对数据进行一次热编码。使用drop_first参数删除生成的列值之一,并避免使用哑变量陷阱。另外,保存一键编码数据帧的列列表。

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

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

如果执行这些步骤,则可以完全依靠原始列名称的列表,并且无需跟踪列位置或分类值定义。

[我也建议您阅读以下内容以获取更多参考:熊猫的一键编码-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

© www.soinside.com 2019 - 2024. All rights reserved.