You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用json.dumps序列化LabelEncoder对象报错,寻求解决方案

解决LabelEncoder无法JSON序列化的问题

JSON仅支持序列化字符串、数字、列表、字典这类基础数据类型,LabelEncoder是sklearn的自定义对象,无法直接被JSON序列化。要解决这个问题,核心是提取LabelEncoder拟合后的关键状态数据(即classes_属性),将其转换为可序列化格式保存,加载时再用这些数据重建可用的LabelEncoder对象。

保存LabelEncoder到JSON文件

先把每个LabelEncoder转换成包含classes_的字典(注意classes_是numpy数组,需要转成普通列表才能被JSON序列化):

import json
import numpy as np
from sklearn.preprocessing import LabelEncoder

# 模拟你的LabelEncoder已完成拟合的场景
my_dict = {'a': LabelEncoder(), 'b': LabelEncoder(), 'c': LabelEncoder(), 'd': LabelEncoder()}
for le in my_dict.values():
    le.fit(['cat', 'dog', 'bird'])

# 转换为可JSON序列化的结构
serializable_data = {
    key: {'classes': le.classes_.tolist()} 
    for key, le in my_dict.items()
}

# 写入JSON文件
with open('label_encoders.json', 'w', encoding='utf-8') as f:
    json.dump(serializable_data, f, indent=2, sort_keys=True)

从JSON加载并重建LabelEncoder

读取JSON文件后,用保存的classes_数据重新初始化LabelEncoder:

import json
import numpy as np
from sklearn.preprocessing import LabelEncoder

# 读取JSON文件
with open('label_encoders.json', 'r', encoding='utf-8') as f:
    loaded_data = json.load(f)

# 重建LabelEncoder对象
reconstructed_dict = {}
for key, info in loaded_data.items():
    le = LabelEncoder()
    # 将列表转回numpy数组并赋值给classes_属性
    le.classes_ = np.array(info['classes'])
    reconstructed_dict[key] = le

# 验证功能正常
print(reconstructed_dict['a'].transform(['dog']))  # 输出: [1]

为什么这个方法有效?

LabelEncoder拟合后的核心状态完全由classes_属性决定——它记录了所有类别标签的映射关系。只要保存并恢复这个属性,就能得到和原编码器功能完全一致的对象。同时JSON是跨Python版本兼容的文本格式,完美解决了pickle的版本依赖问题。

很多网上的方法仅将对象转成字符串(比如用default=str),保存的内容无法重建可用的LabelEncoder,自然没有效果。我们的方法直接提取关键数据,确保序列化后还能恢复完整功能。

内容的提问来源于stack exchange,提问作者anaktha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 13:01:08