特征编码
1、特征编码概述
在机器学习中,处理离散属性(分类特征/类别特征)是一个重要的任务,需要将离散属性转换为可供模型使用的数值表示
机器学习算法本质上都是在基于矩阵做线性代数计算,因此参加计算的特征必须是数值型的,对于非数值型的特征需要进行编码处理
分类特征是用来表示分类的,分类特征是离散的,非连续的。例如性别(男/女)、等级(优/良/合格)等
有些分类特征也是数值,例如,账号ID、IP地址等,但是这些数值并不是连续的。连续的数字是数值特征,离散的数字是分类特征
对于离散型数据的编码,针对小型分类和大型分类,我们通常有以下几种常用的实现方式,它们各有优缺点
2、小型分类特征的编码方式
2.1、序列编码(Ordinal Encoding)
将离散特征的各个类别映射为自然数序号,适用于类别间本来就有一定的排序关系,并且不同样本之间的距离计算有一定的意义。例如,学历中的学士(0)、硕士(1)、博士(2),学士与硕士的距离和硕士与博士的距离相等
以下是序列编码的实现方式:
1)使用Pandas
import pandas as pd
degree_list = ["硕士", "博士", "学士", "硕士"]
data = pd.DataFrame(degree_list, columns=["学历"])
# 手动编码
ordinal_map = {
"学士": 0, "硕士": 1, "博士": 2}
data["Code"] = data["学历"].map(ordinal_map)
print(data)
'''
学历 Code
0 硕士 1
1 博士 2
2 学士 0
3 硕士 1
'''
2)使用Scikit-Learn库
Scikit-Learn库提供了序列编码API:OrdinalEncoder
官方文档:https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OrdinalEncoder.html
中文官方文档:https://scikit-learn.org.cn/view/744.html
import numpy as np
from sklearn.preprocessing import OrdinalEncoder
# 序列编码器
enc = OrdinalEncoder()
# fit_transform():拟合数据,自动编码,需要一个2D数组
data["Code"] = enc.fit_transform(np.array(data["学历"]).reshape(-1, 1))
print(data)
'''
学历 Code
0 硕士 2.0
1 博士 0.0
2 学士 1.0
3 硕士 2.0
'''
# 解码
print(enc.inverse_transform(np.array(data["Code"]).reshape(-