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

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

原始数据

我们要做的, 是对这两列同时做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()
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)  

总结成一个类

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()

使用 SKLearn 同时对多列进行 One-Hot Encoding - 简书 (jianshu.com)

好的,我来为您介绍一下如何使用Python对'性别'特征进行独热编码(one-hot encoding),并提供相应的代码实现。 独热编码是一种常用的将分类变量转换为数值形式的方法。它通过创建新的二进制列来表示每个类别,从而避免机器学习算法误解类别之间的顺序关系。 以下是使用Python进行独热编码的步骤: 1. 首先,我们导入必要的库: ```python import pandas as pd from sklearn.preprocessing import OneHotEncoder ``` 2. 创建一个示例DataFrame: ```python data = {'sex': ['male', 'female', 'male', 'female', 'male']} df = pd.DataFrame(data) ``` 3. 使用pandas的get_dummies函数进行独热编码: ```python df_encoded = pd.get_dummies(df, columns=['sex']) print(df_encoded) ``` 4. 或者,使用sklearnOneHotEncoder: ```python encoder = OneHotEncoder(sparse=False) encoded_sex = encoder.fit_transform(df[['sex']]) encoded_sex_df = pd.DataFrame(encoded_sex, columns=encoder.get_feature_names_out()) df_final = pd.concat([df, encoded_sex_df], axis=1) df_final = df_final.drop('sex', axis=1) print(df_final) ``` 两种方法都会得到如下结果: ``` sex_female sex_male 0 0 1 1 1 0 2 0 1 3 1 0 4 0 1 ``` 在这个结果中,原来的'sex'列被替换为两个新的列:'sex_female'和'sex_male'。每个样本在这些列中都有一个1和一个0,表示其原始的性别值。 独热编码的优点包括: 1. 避免了类别之间的人为顺序关系 2. 可以处理非数值型数据 3. 适用于大多数机器学习算法 然而,独热编码也有一些潜在的缺点,特别是当类别数量很多时,可能会导致维度灾难。因此,在实际应用中,需要根据具体情况权衡使用
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SmartBeeL

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值