使用 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)

好的,我可以帮你编写这段代码。假设我们有一个名为"weather.csv"的数据集,其中包含了日期、最高气温、最低气温、风速等信息。 ``` python import pandas as pd from sklearn.model_selection import train_test_split from sklearn.tree import DecisionTreeRegressor from sklearn.ensemble import RandomForestRegressor from sklearn.preprocessing import OneHotEncoder # 读取数据 data = pd.read_csv("weather.csv") # 数据预处理:将week列进行One-Hot编码 encoder = OneHotEncoder(sparse=False) week_encoded = encoder.fit_transform(data[['week']]) week_encoded = pd.DataFrame(week_encoded, columns=['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday']) data = pd.concat([data, week_encoded], axis=1) # 特征选择 features = ['year', 'month', 'day', 'temp_2', 'temp_1', 'average', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] X = data[features] y = data['actual'] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 决策树模型 dt_model = DecisionTreeRegressor(random_state=42) dt_model.fit(X_train, y_train) dt_score = dt_model.score(X_test, y_test) # 随机森林模型 rf_model = RandomForestRegressor(n_estimators=100, random_state=42) rf_model.fit(X_train, y_train) rf_score = rf_model.score(X_test, y_test) # 预测某一天的最高气温 prediction = rf_model.predict([[2022, 9, 14, 23, 25, 28, 0, 0, 0, 0, 1, 0, 0]]) print("预测的最高气温为:", prediction) ``` 这段代码中,我们首先导入了需要的库和数据集,然后使用One-Hot编码将week列进行了处理,将其转换为了七个二进制列。接着选择了多个特征作为输入X,真实的最高气温作为输出y。使用train_test_split函数将数据集划分为训练集和测试集,然后分别使用决策树和随机森林进行训练和测试,并计算了模型的得分。最后,使用随机森林模型预测了某一天的最高气温。 需要注意的是,这里预测时输入的特征必须与训练时使用的特征保持一致,否则会导致预测结果不准确。实际应用中还需要进行更多的数据预处理、特征工程和模型调参等步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SmartBeeL

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

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

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

打赏作者

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

抵扣说明:

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

余额充值