ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【scikit-learn基础】--『预处理』之 分类编码 [打印本页]

作者: 愛在花開的季節    时间: 2024-2-27 04:15
标题: 【scikit-learn基础】--『预处理』之 分类编码
数据的预处理是数据分析,或者机器学习训练前的重要步骤。
通过数据预处理,可以
本篇介绍的分类编码处理,主要用于将类别型数据转换为可以用于分析或机器学习的形式。
类别型数据是指具有离散、不连续取值的数据,例如性别(男/女)、等级(优/良/中/差)之类数据。
对这些数据进行适当的编码,可以提高数据处理效率和准确度。
1. 原理

分类编码的原理比较简单,常用的两种是顺序编码独热编码
1.1. 顺序编码

顺序编码很好理解,就是按照顺序给离散的数据编码,比如下面成绩和班级信息的数据:
  1. data = np.array(
  2.     [
  3.         ["优", "三班"],
  4.         ["及格", "二班"],
  5.         ["良", "一班"],
  6.         ["优", "五班"],
  7.         ["中", "八班"],
  8.         ["良", "六班"],
  9.         ["不及格", "三班"],
  10.         ["优", "十班"],
  11.     ]
  12. )
复制代码
原始数据是用中文描述的,无法直接用于机器学习算法之中,所以要编码。
scikit-learn库的OrdinalEncoder就是用来顺序编码的。
  1. from sklearn import preprocessing as ppdata = np.array(
  2.     [
  3.         ["优", "三班"],
  4.         ["及格", "二班"],
  5.         ["良", "一班"],
  6.         ["优", "五班"],
  7.         ["中", "八班"],
  8.         ["良", "六班"],
  9.         ["不及格", "三班"],
  10.         ["优", "十班"],
  11.     ]
  12. )oenc = pp.OrdinalEncoder()# 顺序编码oenc.fit_transform(data)# 运行结果array([[2., 1.],       [3., 2.],       [4., 0.],       [2., 3.],       [1., 4.],       [4., 5.],       [0., 1.],       [2., 6.]])
复制代码
从运行结果可以看出,虽然"优", "良", "中"等成绩等级,"一班", "二班", "三班"等班级信息都被编码成顺序的数字。
但是,并不是按照中文含义的顺序来编码的,比如优对应2及格对应3三班对应1二班却对应2等等。
为了让编码后的数字和原来的中文含义的顺序有对应,我们可以定义编码的顺序。
  1. # 定义中文的顺序
  2. catagories = [
  3.     ["优", "良", "中", "及格", "不及格"],
  4.     ["一班", "二班", "三班", "五班", "六班", "八班", "十班"],
  5. ]
  6. oenc = pp.OrdinalEncoder(categories=catagories)
  7. oenc.fit_transform(data)
  8. # 运行结果
  9. array([[0., 2.],
  10.        [3., 1.],
  11.        [1., 0.],
  12.        [0., 3.],
  13.        [2., 5.],
  14.        [1., 4.],
  15.        [4., 2.],
  16.        [0., 6.]])
复制代码
这样,编码后的数字的顺序就能和中文所代表的含义对应起来了。
1.2. 独热编码

上面示例中的成绩等级班级信息都有顺序,如果对没有顺序含义的信息进行顺序编码的话,
就会赋予给信息添加了顺序的含义,对于后续算法的应用可能会产生影响。
这时,就可以用独热编码的方式来处理,比如对于下面的科目信息:
  1. data = np.array([["语文"], ["数学"], ["英语"], ["物理"], ["化学"]])
复制代码
这些科目信息之间是没有顺序概念的,语文不一定排在数学前面,化学也不一定要排在英语后面。
这时,用独热编码就比较合适了。
  1. data = np.array([["语文"], ["数学"], ["英语"], ["物理"], ["化学"]])
  2. enc = pp.OneHotEncoder()
  3. enc.fit_transform(data).toarray()
  4. # 运行结果
  5. array([[0., 0., 0., 0., 1.],
  6.        [0., 1., 0., 0., 0.],
  7.        [0., 0., 0., 1., 0.],
  8.        [0., 0., 1., 0., 0.],
  9.        [1., 0., 0., 0., 0.]])
复制代码
从中可以看出,语文编码成了数组[0., 0., 0., 0., 1.],数学编码成了[0., 1., 0., 0., 0.]数组等等。
科目信息之间不存在顺序。
2. 作用

分类编码是数据挖掘和机器学习领域中非常重要的一个环节,主要的作用有:
3. 总结

本篇介绍了两种编码方式,顺序编码(OrdinalEncoder)和独热编码(OneHotEncoder),但scikit-learn库提供的编码方式并不只有这两种。
还有目标编码(TargetEncoder),标签编码(LabelEncoder)等等,可以参考官方文档中的使用方法,在合适的场景中使用。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4