我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

苏南大叔基于sklearn的各种预测方法做过很多预测了,大家可能也已经意识到了:这些预测都是对数字进行预测的。而实际的问题里面,必然不会直接给出的是代码所需要的各种数字,而是各种人类能够理解的各种单词文字。那么,从单词到数字的过程,就是个编码的过程。本文描述sklearn中的一个编码器:LabelEncoder

苏南大叔:机器学习,如何理解sklearn编码器LabelEncoder? - 编码器labelencoder
机器学习,如何理解sklearn编码器LabelEncoder?(图2-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:win10python@3.12.0scikit-learn@1.3.2

基本描述

Scikit-learnLabelEncoder编码器,是用来对分类型特征值进行编码,即对不连续的数值或文本进行编码。LabelEncoder将每个类别标签与不断增加的整数相关联,即生成一个名为class_的实例数组的索引。可以将不规则的n个特征,转化为从0到n-1的整数值。

测试代码

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(['s','u','n','a','n'])
print(le.classes_)                  # ['a' 'n' 's' 'u'] => [0, 1, 2, 3]
a = le.transform(["a","s"]) 
print(a,type(a))                    # [0 2] <class 'numpy.ndarray'>

苏南大叔:机器学习,如何理解sklearn编码器LabelEncoder? - labelencoder代码
机器学习,如何理解sklearn编码器LabelEncoder?(图2-2)

根据CountVectorizer的经验,这种.fit()+.transform()的表述,也可以合并表述:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
a = le.fit_transform(['s','u','n','a','n'])
print(le.classes_)                  # ['a' 'n' 's' 'u'] => [0, 1, 2, 3]
print(a,type(a))                    # [2 3 1 0 1] <class 'numpy.ndarray'>

le.fit()的动作,就是建立词汇表的过程,le.classes_就是建立好的词汇表(除了汉字外的顺序很好理解),le.transform()就是在词汇表里面找对应词汇的索引值的过程。

参考文章:

逆编码

把以数字为主体的list类型变量,还可以通过.inverse_transform()还原成原本的文字。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
a = le.fit_transform(['s','u','n','a','n'])
print(le.classes_,type(le.classes_))        # ['a' 'n' 's' 'u'] <class 'numpy.ndarray'>
b = le.inverse_transform([0,2])             # ['a' 's']                          
c = le.inverse_transform([0,1,0])           # ['a' 'n' 'a']

语料维度

这里喂给.fit()的语料,是一维数组。如果是竖直的多行一列list,也是可以执行。但是会发出warning。这就是sklearn.utils.column_or_1d()的函数效果。

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
a = le.fit([['s'],['u'],['n'],['a'],['n']])
# DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel(). y = column_or_1d(y, warn=True)

如果是多列的情况,则会直接报错。参考代码:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
a = le.fit([['s','u','n','a','n']])
# ValueError: y should be a 1d array, got an array of shape (1, 5) instead.

参考文章:

.classes_ 顺序

如果语料都是数字或者字母的话,这个.classes_里面的顺序,是比较好理解的,就是自然排序。但是,如果是中文的话,则顺序比较难以理解。【苏南大叔推测:是按unicode编码排序的】

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
a = le.fit(['苏','南','大','叔'])
print(le.classes_,type(le.classes_))  # ['南' '叔' '大' '苏'] <class 'numpy.ndarray'>

这种中文语料的情况,如果大家能接受或者无所谓,就好说了。如果对于语料顺序有要求,则有待后文解决了。毕竟这个.classes_里面的顺序,决定了最终的.transform()的结果。

相关文章

结语

更多苏南大叔的sklearn的相关文章,请点击下面的链接:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   python    sklearn