类别型特征处理是指对机器学习模型中的类别型特征进行预处理和转换的过程。类别型特征通常不能直接作为输入传递给模型,需要将其转换为数值型特征或进行编码处理。以下是一些常见的类别型特征处理方法:
-
无序型特征的独热编码(One-Hot Encoding):对于无序型的类别型特征,可以使用独热编码将其转换为多个二元特征。每个类别对应一个二元特征,如果样本属于该类别,则对应的二元特征为1,否则为0。独热编码可以保留类别之间的无序性,并且不引入顺序关系。
-
有序型特征的标签编码(Label Encoding):对于有序型的类别型特征,可以使用标签编码将其转换为连续的整数值。每个类别被赋予一个整数标签,标签的大小表示类别的顺序关系。标签编码可以保留类别之间的有序性,但可能会引入顺序关系。
-
频率编码(Frequency Encoding):频率编码是一种将类别型特征转换为数值型特征的方法,将每个类别出现的频率作为特征值。频率编码可以捕捉到类别的分布情况,但可能会受到极端频率值的影响。
-
目标编码(Target Encoding):目标编码是一种将类别型特征转换为数值型特征的方法,将每个类别对应的目标变量的平均值或其他统计量作为特征值。目标编码可以捕捉到类别与目标变量之间的关系,但可能会引入过拟合的风险。
-
特征嵌入(Feature Embedding):特征嵌入是一种将类别型特征转换为低维连续向量的方法,通过学习将类别映射到向量空间中的表示。特征嵌入可以保留类别之间的关系和相似性,并且可以降低维度。
这里展示Label Encoding处理,其他方案还待验证,下面是处理代码。
类型数据训练:
import joblib
import pandas as pd
from sklearn.preprocessing import LabelEncoder
filepath = 'common'
var_key = 'bankcode'
file_path = f"G:\\data\\{filepath}\\category_features\\"
file_training = f"{file_path}{var_key}.xlsx"
df_training = pd.read_excel(file_training, sheet_name='Sheet1')
df_training.columns = df_training.columns.str.lower()
df_training[var_key] = df_training[var_key].fillna('U')
df_training[var_key] = df_training[var_key].astype('str')
df_training[var_key] = df_training[var_key].str.strip()
df_training[var_key] = df_training[var_key].str.lower()
label_encoder = LabelEncoder()
df_training[var_key] = label_encoder.fit_transform(df_training[var_key])
print(f'{file_path}label_encoder_{var_key}.pkl')
joblib.dump(label_encoder, f'{file_path}label_encoder_{var_key}.pkl')
类型数据使用:
def _train_transform_string(self, file_path, var_key, row):
self.cat_features.append(var_key)
self.data[var_key] = self.data[var_key].apply(unidecode)
self.data[var_key] = self.data[var_key].fillna(row['param_default_value'])
self.data[var_key] = self.data[var_key].astype(row['param_type'])
self.data[var_key] = self.data[var_key].str.strip()
self.data[var_key] = self.data[var_key].str.lower()
print(f'{file_path}label_encoder_{var_key}.pkl')
label_encoder = joblib.load(f'{file_path}label_encoder_{var_key}.pkl')
self.data[var_key] = label_encoder.transform(self.data[var_key])
- 使用训练中得到的模型文件。
- 碰到不可识别值需要兼容。例如银行编码、城市编码、手机类型等特征。处理成默认值,当然这样做会影响模型的准确性。