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

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

苏南大叔:机器学习,分析认识sklearn的OrdinalEncoder编码器 - sklearn-ordinal-encoder
机器学习,分析认识sklearn的OrdinalEncoder编码器(图2-1)

苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程所见所闻。本文测试环境:win10python@3.12.0scikit-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编码。

这里的输入项目是二维数组,一列代表着一个相同的特性描述。所以,它的字典编码也是以一列为单位的。

苏南大叔:机器学习,分析认识sklearn的OrdinalEncoder编码器 - 序数编码器
机器学习,分析认识sklearn的OrdinalEncoder编码器(图2-2)

获取.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相关经验文章,请点击:

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

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

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

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