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