任务一:对列进行OneHot编码
方法1:pd.get_dummies
这是pandas自带的将数据转成独热编码的方式,简单,并且好用,可以当做首选,尤其是表格数据的时候。详情可以参考官方文档,也可以简单的参考一下这篇笔记pandas.get_dummies 的用法。
注意: get_dummies转独热编码,是针对离散的字符串的数据,整数的话我发现仍然保留原来的样子。
方法2:OneHotEncoder()
看了好几个博客,说这种方式只能对整数进行编码,字符串不行,但是我今天试了一下,字符串是可以的,官方文档也是说输入是字符串或者整数。
但是要注意,OneHotEncoder的fit_transform()函数接收是二维数组的形式,所以如果是pandas表格的某一列,也需要到时候reshape(-1,1)一下。
方法3:DictVectorizer
实现了 “one-of-K” 或 “one-hot” 编码,用于分类(也称为标称,离散)特征。分类功能是 “属性值” 对,其中该值被限制为不排序的可能性的离散列表(例如主题标识符,对象类型,标签,名称…)。也就是说,其他的整数的这种情况会保留原来的值。
这个fit_transform里面接收的要是一个字典的形式,输出是二维数组。
方法4: 这个是附加一个keras.utils.to_categorical
这个也是实现的one-hot编码,不过一般是用于类别,也就是标签的时候,是把类别标签转换为onehot编码(categorical就是类别标签的意思,表示现实世界中你分类的各类别),如果特征想要编码成one-hot,还是不要用这个了吧。
方法5:
# for Sex / Gender
data['sex'] = np.where(data['sex'] == 'male', 1, 0)
任务二:对列进行数字映射编码
方法一:map()函数映射
这是一种很方便,很快的方式。使用map()函数。(下面是两个例子)
# for Embarked
ordinal_label = {k: i for i, k in enumerate(data['embarked'].unique(), 0)}
data['embarked'] = data['embarked'].map(ordinal_label)
pclass_map = {label:idx for idx, label in enumerate(set(data['Pclass']))}
# 也可以pclass_map = {"low":0, "medium":1, "high":2}
d1 = data['Pclass'].map(pclass_map)
d1
上面可以发现,如果是用for循环的这种map函数, 编码形式虽然是0,1,2这种数字形式,但是含义已经掩盖掉了。 也就是说0,1,2已经不能说明什么意义了,只是分别代表high,medium,low这三个字符串。所以如果类别少的话,我们最好是自己自定义进行映射,比如上面我注释掉的那个,那个的0, 1, 2还分别代表低,中,高,顺序意义还在。
方法二:LabelEncoder()
这个看官方文档,一般是用于类别标签的,如果用于特征的话,默认并不是按照低、中、高这样的顺序进行编码的,也就是说,这个和上面那种for循环定义映射的那个一样,虽然成功的改成了数字,但是意义不在了。
le = LabelEncoder()
d2 = le.fit_transform(data['Pclass'])
d2
所以人家官方文档才把这个函数的作用说成:
使用0到n_classes-1之间的值对目标标签进行编码。该转换器应用于编码目标值,即 y,而不是输入X。
所以这个函数,别乱用到特征的编码。
方法三:OrdinalEncoder()
将分类特征编码为整数数组。
该转换器的输入应为整数或字符串之类的数组,表示分类(离散)特征所采用的值。要素将转换为序数整数。这将导致每个要素的一列整数(0到n_categories-1)。
所以,这个才是真正的用到分类特征上的映射数字编码,并且还会保留原来的顺序。
————————————————
版权声明:以上转载自CSDN博主「Miracle8070」的原创文章,原文链接:https://blog.csdn.net/wuzhongqiang/article/details/104169480
————————————————