机器学习,如何理解sklearn编码器LabelEncoder?
发布于 作者:苏南大叔 来源:程序如此灵动~苏南大叔基于sklearn
的各种预测方法做过很多预测了,大家可能也已经意识到了:这些预测都是对数字进行预测的。而实际的问题里面,必然不会直接给出的是代码所需要的各种数字,而是各种人类能够理解的各种单词文字。那么,从单词到数字的过程,就是个编码的过程。本文描述sklearn
中的一个编码器:LabelEncoder
。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的代码编程经验总结。本文测试环境:win10
,python@3.12.0
,scikit-learn@1.3.2
。
基本描述
Scikit-learn
的LabelEncoder
编码器,是用来对分类型特征值进行编码,即对不连续的数值或文本进行编码。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'>
根据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()
的结果。
相关文章
- https://newsn.net/say/sklearn-train_test_split.html
- https://newsn.net/say/sklearn-load_iris.html
- https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html
结语
更多苏南大叔的sklearn
的相关文章,请点击下面的链接:
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。