机器学习,分析认识sklearn的OrdinalEncoder编码器
发布于 作者:苏南大叔 来源:程序如此灵动~
sklearn里面内置了很多编码器,用于把人类认识的单词转化为程序认识的数字。本文描述第二个编码器OrdinalEncoder(序数编码器),它和上一个LabelEncoder在编码的原理上是很相似的。但是,它接受的输入变量有些不同。LabelEncoder接受的是一维向量作为输入,OrdinalEncoder接受的是二维数组或者是dataframe作为输入项目。这就是两者最大的区别。

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程所见所闻。本文测试环境:win10,python@3.12.0,scikit-learn@1.3.2。
基本使用
下面演示OrdinalEncoder的基本使用方法,和以前的类似编码器对比,使用方法基本一致。可以参考文章:
基本定义:
from sklearn import preprocessing
oe = preprocessing.OrdinalEncoder()
X = [
["虎子", 5, "dog"],
["老许", 3, "bird"],
["二赖子", 6, "fish"],
["老白", 8, "catty"],
["小黑", 10, "puppy"],
]可以.fit()和.transform()分开调用
oe.fit(X)
a = oe.transform(X)
print(a,type(a))也可以两者同时调用:
a = oe.fit_transform(X)
print(a,type(a))输出:
[[4. 1. 2.]
[3. 0. 0.]
[0. 2. 3.]
[2. 3. 1.]
[1. 4. 4.]] <class 'numpy.ndarray'>这个为什么某个单词转化为0,而不是1。这个编码顺序可以参考unicode编码。
这里的输入项目是二维数组,一列代表着一个相同的特性描述。所以,它的字典编码也是以一列为单位的。

获取.classes_
然而,和LabelEncoder不同的是,OrdinalEncoder没有.classes_属性。这个就暂不做探讨了。
AttributeError: 'OrdinalEncoder' object has no attribute 'classes_'逆转编码
b = oe.inverse_transform([[1,1,0]]) # [['小黑' 5 'bird']]注意的是:被逆转的数据列数必须和输入项相等。否则报错,例如:
a = oe.inverse_transform([[1,1]])
# ValueError: Shape of the passed X data is not correct. Expected 3 columns, got 2.
c = oe.inverse_transform([[1,1,0,0]])
# ValueError: Shape of the passed X data is not correct. Expected 3 columns, got 4.输入项对比
正如文章开头所描述的一样,LabelEncoder接受的是一维向量作为输入,OrdinalEncoder接受的是二维数组或者是dataframe作为输入项目。这就是两者最大的区别。
from sklearn import preprocessing
oe = preprocessing.OrdinalEncoder()
X = [
["虎子", 5, "dog"],
["老许", 3, "bird"],
["二赖子", 6, "fish"],
["老白", 8, "catty"],
["小黑", 10, "puppy"],
]
# 注意看这里
import pandas as pd
X= pd.DataFrame(X)
# 注意看这里
oe.fit(X)
b = oe.inverse_transform([[1,1,0]])
print(b)横着的一维向量是不能作为输入的,例如:
X = ["虎子", 5, "dog"]报错信息是:
# Reshape your data either using array.reshape(-1, 1) if your data has a single feature or array.reshape(1, -1) if it contains a single sample.改成竖直的二维数组,就可以作为输入了:
from sklearn import preprocessing
oe = preprocessing.OrdinalEncoder()
import numpy as np
X = ["虎子", 5, "dog"]
X = np.array(X)
X = X.reshape(-1,1)
oe.fit(X)
b = oe.inverse_transform([[1]]) # [['dog']]
print(b)结语
更多苏南大叔的sklearn相关经验文章,请点击: