美文网首页
使用 SKLearn 同时对多列进行 One-Hot Encod

使用 SKLearn 同时对多列进行 One-Hot Encod

作者: 数科每日 | 来源:发表于2021-02-14 21:51 被阅读0次

One-Hot Encoding 在机器学习的预处理中, 是一个非常常见的操作。 SKLearn 提供 OneHotEncoder 来快速完成这项操作。 但是, 当我们处理大数据集时, 一个 DataSet 中往往包含多个 Category 类型的列。 如果一列一列的处理,那将是非常麻烦的事情。 其实 OneHotEncoder 类提供了一次性处理多列的功能, 但是即使官方文档, 没有相应的演示代码。 这里,就给出利用OneHotEncoder 一次性 One-Hot Encoding 多列的例子。

原始数据

image.png

我们要做的, 是对这两列同时做OneHotEncoder

from sklearn.preprocessing import OneHotEncoder

enc = OneHotEncoder(handle_unknown='ignore')
enc.fit(train_data[["LotConfig", "Utilities"]].values)

matrix = enc.transform(train_data[["LotConfig", "Utilities"]].values).toarray()
feature_labels = np.array(enc.categories_).ravel()

其实,关键点就是将多列数据, 一次性传入 fit()和 transform() 中。 处理完成以后,

  • matrix 保存了数据
  • feature_labels 保存了每一列的标识

紧接着, 我们要把转换好的 Encoding 变成 DataFrame

#Assemble column names with column name and value name
col_names = []
for col in ["LotConfig", "Utilities"]:
  for val in train_data[col].unique():
    col_names.append("{}_{}".format(col, val))

pd.DataFrame(data = matrix, columns=col_names, dtype=int)  
image.png

总结成一个类

from sklearn.preprocessing import OneHotEncoder

class LocalOneHotEncoder(object):

  def __init__(self, target_columns):
    '''
    @param: target_columns --- To perform one-hot encoding column name list. 
    '''
    self.enc = OneHotEncoder(handle_unknown='ignore')
    self.col_names = target_columns

  def fit(self, df):
    '''
    @param: df --- pandas DataFrame
    '''
    self.enc.fit(df[self.col_names].values)
    self.labels = np.array(enc.categories_).ravel()
    self.new_col_names = self.gen_col_names(df)

  def gen_col_names(self, df):
    '''
    @param:  df --- pandas DataFrame
    '''
    new_col_names = []
    for col in self.col_names:
      for val in df[col].unique():
        new_col_names.append("{}_{}".format(col, val))
    return new_col_names

  def transform(self, df):
     '''
     @param:  df --- pandas DataFrame
     '''
     return pd.DataFrame(data = self.enc.transform(df[self.col_names]).toarray(), 
                         columns = self.new_col_names, 
                         dtype=int) 

#==========================================
# main 
#==========================================
ONEHOT_COLUMNS = ["LotConfig", "Utilities"]

local_ohe = LocalOneHotEncoder(ONEHOT_COLUMNS)
local_ohe.fit(train_data)
oht_df = local_ohe.transform(train_data)

oht_df.head()
image.png

相关文章

网友评论

      本文标题:使用 SKLearn 同时对多列进行 One-Hot Encod

      本文链接:https://www.haomeiwen.com/subject/fohuxltx.html