一般机器学习数据预处理过程中,对于非数值型特征编码可以采用如下几种方式:
1、one-hot编码(独热编码)
2、映射有序特征
one-hot编码(独热编码):
如果该特征下可以分为多个类别,且各类别是并列关系,则适合使用one-hot编码方式进行处理。例如,衣服的颜色red、green、yellow就是属于这种并列关系
一般机器学习数据预处理过程中,对于非数值型特征编码可以采用如下几种方式:
1、one-hot编码(独热编码)
2、映射有序特征
one-hot编码(独热编码):
如果该特征下可以分为多个类别,且各类别是并列关系,则适合使用one-hot编码方式进行处理。例如,衣服的颜色red、green、yellow就是属于这种并列关系
映射有序特征:
如果该特征下多个类别有一定的顺序关系,则可以采用映射有序特征的方式。例如,衣服的尺码大小size可以分为S、M、L、XL,它们是可以按照顺序排列的
如果该特征下多个类别有一定的顺序关系,则可以采用映射有序特征的方式。例如,衣服的尺码大小size可以分为S、M、L、XL,它们是可以按照顺序排列的
python 案例(以下代码在jupyter中运行):
import pandas as pd
import numpy as np
#原始数据
df = pd.DataFrame([['green', 'M', 10.1, 'male'],
['red', 'L', 13.5, 'female'],
['yellow', 'XL', '12.1', 'male']])
df.columns = ['colors', 'size', 'price', 'sex']
df
#对有序特征数据进行编码
col_mappings = {
'size':{
'XL': 3,
'L': 2,
'M': 1
},
'sex':{
'male': 0,
'female': 1
}
}
1、使用OneHotEncoding进行编码,但是该方式有一个缺点:即编码后变成了array形式,无法得知编码后的列的代表了什么
#使用OneHotEncoding进行编码
#对并列关系特征数据编码
colors_mapping = {label:idx for idx, label in enumerate(np.unique(df['colors']))}
col_mappings['colors'] = colors_mapping
#将映射结果映射到原始数据中
for col_mapping in col_mappings:
df[col_mapping] = df[col_mapping].map(col_mappings[col_mapping])
from sklearn.preprocessing import OneHotEncoder
#categorical_features[0] 表示对第0列进行one-hot运算
#n_values=[3] 指用3位表示第0列的数据,
#即0使用[1,0,0]表示,1用[0,1,0]表示,2用[0,0,1]表示
ohe = OneHotEncoder(categorical_features=[0], n_values=[3])
data = np.array(df)
ohe.fit(data)
ans = ohe.transform(data).toarray()
ans
2、使用get_dummies进行编码
df = pd.get_dummies(df,columns=['colors'],prefix_sep='_',dummy_na=False,drop_first=False)
此时传入的df是已经映射过有序特征之后的:
最后使用get_dummes编码后的df为:
reference:
1、scikit-learn 中 OneHotEncoder 解析
2、https://blog.csdn.net/luguanyou/article/details/80598122
3、https://blog.csdn.net/qq_43404784/article/details/89486442