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

苏南大叔在本文中,将继续回顾一下sklearn中的LabelEncoder编码器,这里有一个小小的问题,就是可能对其中的分类字典.classes_里的“单词”顺序不满意。那么,本文里面就是研究这种sklearn自定义编码器的可能性。

苏南大叔:如何修改sklearn的Label编码器?自定义classes_属性? - sklearn-labelencoder-classes_
如何修改sklearn的Label编码器?自定义classes_属性?(图2-1)

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

前文回顾

首先本文对标的是sklearnLabelEncoder,参考文章:

本文的技术手段是自定义类继承LabelEncoder,然后改写其.fit()方法。关于继承,参考文章:

关于le.classes这个元素词典里面,单词的排序问题会引起.transform()的排序结果。关于这个推测,参考文章:

使用了sklearn.utils.column_or_1d()函数,参考文章:

按出现的先后排序

LabelEncoder的源码,可以在下面的文件里面找到:

<pathon>\Lib\site-packages\sklearn\preprocessing\_label.py

根据上面的代码,改写LabelEncoderfit方法:

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.utils import column_or_1d

class SnLabelEncoder(LabelEncoder):             #  继承 LabelEncoder
    def fit(self, y):
        y = column_or_1d(y, warn=True)
        self.original_ = "sunandashu"           #  自定义属性
        # self.classes_ = y.unique()            #  原版
        self.classes_ = pd.Series(y).unique()   #  这里就是按出现顺序组装字典的
        return self

效果对比

参考代码:

from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
le.fit(list("苏南大叔"))
print(le.classes_)                              # ['南' '叔' '大' '苏']
print(le.transform(["大","大","苏","叔"]))       # [2 2 3 1]
le2_ = SnLabelEncoder()
le2_.fit(list("苏南大叔"))
print(le2_.classes_)                            #  ['苏' '南' '大' '叔']
print (le2_.transform(["大","大","苏","叔"]))    #  [2 2 0 3]

苏南大叔:如何修改sklearn的Label编码器?自定义classes_属性? - 定义自己的编码器
如何修改sklearn的Label编码器?自定义classes_属性?(图2-2)

可见,两者的结果是有很大差别的:

编码器
LabelEncoder3021
SnLabelEncoder0123

结语

更多苏南大叔的sklearn经验文字,请点击:

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

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

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

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