小秦哥 发表于 2025-4-14 00:11:13

【scikit-learn底子】--『预处理』之 分类编码

数据的预处理是数据分析,或者机器学习练习前的紧张步骤。
通过数据预处理,可以


[*]进步数据质量,处理数据的缺失值、异常值和重复值等问题,增长数据的精确性和可靠性
[*]整合不同数据,数据的来源和结构大概多种多样,分析和练习前要整合成一个数据集
[*]进步数据性能,对数据的值进行变更,规约等(比如无量纲化),让算法更加高效
本篇介绍的分类编码处理,主要用于将种别型数据转换为可以用于分析或机器学习的形式。
种别型数据是指具有离散、不连续取值的数据,例如性别(男/女)、品级(优/良/中/差)之类数据。
对这些数据进行适当的编码,可以进步数据处理效率和精确度。
1. 原理

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

顺序编码很好理解,就是按照顺序给离散的数据编码,比如下面成绩和班级信息的数据:
data = np.array(
    [
      ["优", "三班"],
      ["及格", "二班"],
      ["良", "一班"],
      ["优", "五班"],
      ["中", "八班"],
      ["良", "六班"],
      ["不及格", "三班"],
      ["优", "十班"],
    ]
)
原始数据是用中文形貌的,无法直接用于机器学习算法之中,以是要编码。
scikit-learn库的OrdinalEncoder就是用来顺序编码的。
from sklearn import preprocessing as ppdata = np.array(
    [
      ["优", "三班"],
      ["及格", "二班"],
      ["良", "一班"],
      ["优", "五班"],
      ["中", "八班"],
      ["良", "六班"],
      ["不及格", "三班"],
      ["优", "十班"],
    ]
)
oenc = pp.OrdinalEncoder()# 顺序编码oenc.fit_transform(data)# 运行结果array([,       ,       ,       ,       ,       ,       ,       ]) 从运行结果可以看出,固然"优", "良", "中"等成绩品级,"一班", "二班", "三班"等班级信息都被编码成顺序的数字。
但是,并不是按照中文含义的顺序来编码的,比如优对应2,及格对应3,三班对应1,二班却对应2等等。
为了让编码后的数字和原来的中文含义的顺序有对应,我们可以定义编码的顺序。
# 定义中文的顺序
catagories = [
    ["优", "良", "中", "及格", "不及格"],
    ["一班", "二班", "三班", "五班", "六班", "八班", "十班"],
]

oenc = pp.OrdinalEncoder(categories=catagories)
oenc.fit_transform(data)

# 运行结果
array([,
       ,
       ,
       ,
       ,
       ,
       ,
       ])
这样,编码后的数字的顺序就能和中文所代表的含义对应起来了。
1.2. 独热编码

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

分类编码是数据挖掘和机器学习范畴中非常紧张的一个环节,主要的作用有:

[*]转换数据格式:将种别型数据转换为数值型数据,从而使其可以或许被计算机处理和建模。
[*]进步处理效率:分类编码可以将多个种别型变量转换为多个数值型变量,从而简化了数据处理过程,进步了数据处理效率。
[*]进步性能:分类编码可以通过独热编码等方式,将种别型变量转换为多个二元特性,从而增长了模子的非线性能力和表达能力,从而进步了模子的性能。
[*]降低复杂度:分类编码可以将多个种别型变量转换为多个数值型变量,从而降低了模子的复杂度。这有利于减少模子的过拟合,进步模子的泛化能力。
[*]处理不平衡种别:分类编码可以通过天生额外的特性或者利用其他技术来处理不平衡种别的数据。
[*]去除噪声和冗余特性:分类编码可以通过删除不相关或冗余的特性来减少数据的噪声和冗余,从而进步数据的质量和模子的性能。
3. 总结

本篇介绍了两种编码方式,顺序编码(OrdinalEncoder)和独热编码(OneHotEncoder),但scikit-learn库提供的编码方式并不但有这两种。
另有目标编码(TargetEncoder),标签编码(LabelEncoder)等等,可以参考官方文档中的利用方法,在符合的场景中利用。
https://i-blog.csdnimg.cn/direct/3b6a5600294944cbafab1abcedd3c285.png
关注灵活就业新业态,了解更多程序员兼职项目,关注公账号:贤才宝(贤才宝https://www.51xcbw.com) 

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【scikit-learn底子】--『预处理』之 分类编码