如何修改sklearn的Label编码器?自定义classes_属性?
发布于 作者:苏南大叔 来源:程序如此灵动~ 我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...
苏南大叔在本文中,将继续回顾一下sklearn
中的LabelEncoder
编码器,这里有一个小小的问题,就是可能对其中的分类字典.classes_
里的“单词”顺序不满意。那么,本文里面就是研究这种sklearn
自定义编码器的可能性。
苏南大叔的“程序如此灵动”博客,记录苏南大叔的编程经验文章。本文测试环境:win10
,python@3.12.0
,scikit-learn@1.3.2
。
前文回顾
首先本文对标的是sklearn
的LabelEncoder
,参考文章:
本文的技术手段是自定义类继承LabelEncoder
,然后改写其.fit()
方法。关于继承,参考文章:
关于le.classes
这个元素词典里面,单词的排序问题会引起.transform()
的排序结果。关于这个推测,参考文章:
使用了sklearn.utils.column_or_1d()
函数,参考文章:
按出现的先后排序
LabelEncoder
的源码,可以在下面的文件里面找到:
<pathon>\Lib\site-packages\sklearn\preprocessing\_label.py
根据上面的代码,改写LabelEncoder
的fit
方法:
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]
可见,两者的结果是有很大差别的:
编码器 | 苏 | 南 | 大 | 叔 |
---|---|---|---|---|
LabelEncoder | 3 | 0 | 2 | 1 |
SnLabelEncoder | 0 | 1 | 2 | 3 |
结语
更多苏南大叔的sklearn
经验文字,请点击:
如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。