我想知道一旦对数据集执行数据预处理,如何跟踪数据集的原始列?
在下面的代码中,df_columns
会告诉我0
中的df_array
列为A
,1
列为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)
该解决方案应该与分类列的位置无关……可以是A
,B
,C
或D
。我可以做艰苦的工作,并不断更新df_columns
词典...但是它不是优雅的或“ pythonic”的]
此外,该解决方案将如何跟踪类别的含义? {0,0,1}是猫,{0,1,0}是狗,依此类推?
PS-我知道虚拟变量陷阱,当我实际使用它训练模型时会取df_dummies[:,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