Python LabelEncoder将不同的值编码为相同的值

Python LabelEncoder将不同的值编码为相同的值,python,pandas,scikit-learn,Python,Pandas,Scikit Learn,摘要: Sklearn的LabelEncoder将不同的值编码为相同的值encoder.fit(data)和data\u encoded=encoder.transform(data)可以正确完成,但当我在转换后立即执行encoder.inverse\u transform(data\u encoded)时,会引发错误: ValueError:y包含以前未看到的标签:[19297] 我想做什么: with open("data/encoders/item_id_encoder.pkl", 'rb

摘要: Sklearn的LabelEncoder将不同的值编码为相同的值
encoder.fit(data)
data\u encoded=encoder.transform(data)
可以正确完成,但当我在转换后立即执行
encoder.inverse\u transform(data\u encoded)
时,会引发错误:

ValueError:y包含以前未看到的标签:[19297]

我想做什么:

with open("data/encoders/item_id_encoder.pkl", 'rb') as file:
    item_encoder = pickle.load(file)
with open("data/encoders/store_id_encoder.pkl", 'rb') as file:
    store_encoder = pickle.load(file)
with open("data/encoders/week_encoder.pkl", 'rb') as file:
    week_encoder = pickle.load(file)

item_classes = set(item_encoder.classes_) 
store_classes = set(store_encoder.classes_)
week_classes = set(week_encoder.classes_)
store_ids = store_encoder.transform(data.store_id)
item_ids = item_encoder.transform(data.item_id)
weeks = week_encoder.transform(data.week)

# this raises error
item_encoder.inverse_transform(item_ids)
我有一点大的数据(接近1.5GB),还有更多。为了完成机器学习任务,我需要对数据进行标记编码,但我不能在本地笔记本电脑上进行,因为编码器必须看到整个数据才能正确编码,但数据要处理的量稍大

我所做的:

with open("data/encoders/item_id_encoder.pkl", 'rb') as file:
    item_encoder = pickle.load(file)
with open("data/encoders/store_id_encoder.pkl", 'rb') as file:
    store_encoder = pickle.load(file)
with open("data/encoders/week_encoder.pkl", 'rb') as file:
    week_encoder = pickle.load(file)

item_classes = set(item_encoder.classes_) 
store_classes = set(store_encoder.classes_)
week_classes = set(week_encoder.classes_)
store_ids = store_encoder.transform(data.store_id)
item_ids = item_encoder.transform(data.item_id)
weeks = week_encoder.transform(data.week)

# this raises error
item_encoder.inverse_transform(item_ids)
因此,我将所有数据加载到Google Colab中,对其进行编码,然后使用
pickle
保存编码器。然后在我的本地PC中,我获取了新来者数据(小得多),重新加载编码器,更新了
编码器.classes\uu
(参见代码第1部分)

然后转换新来者数据。然后尝试在完成后立即对其进行逆变换,以确保其正确完成。但它引起了一个错误。(见第2部分)

然后我检查了值
19297
,以查看其带有
data.loc
的索引。获取索引并检查原始数据,实现编码器将不同的值编码为相同的值(不同的值->19297)。有人能帮忙解决这个问题吗?坦克很多

第1部分:

with open("data/encoders/item_id_encoder.pkl", 'rb') as file:
    item_encoder = pickle.load(file)
with open("data/encoders/store_id_encoder.pkl", 'rb') as file:
    store_encoder = pickle.load(file)
with open("data/encoders/week_encoder.pkl", 'rb') as file:
    week_encoder = pickle.load(file)

item_classes = set(item_encoder.classes_) 
store_classes = set(store_encoder.classes_)
week_classes = set(week_encoder.classes_)
store_ids = store_encoder.transform(data.store_id)
item_ids = item_encoder.transform(data.item_id)
weeks = week_encoder.transform(data.week)

# this raises error
item_encoder.inverse_transform(item_ids)
第二部分:

with open("data/encoders/item_id_encoder.pkl", 'rb') as file:
    item_encoder = pickle.load(file)
with open("data/encoders/store_id_encoder.pkl", 'rb') as file:
    store_encoder = pickle.load(file)
with open("data/encoders/week_encoder.pkl", 'rb') as file:
    week_encoder = pickle.load(file)

item_classes = set(item_encoder.classes_) 
store_classes = set(store_encoder.classes_)
week_classes = set(week_encoder.classes_)
store_ids = store_encoder.transform(data.store_id)
item_ids = item_encoder.transform(data.item_id)
weeks = week_encoder.transform(data.week)

# this raises error
item_encoder.inverse_transform(item_ids)

我已经实现了一个具有更新功能的标签编码器。你可以:

  • 安装数据编码器以启动编码器。编码器将保存为pickle文件
  • 用新加入的数据更新编码器
  • 对数据进行变换和逆变换

请参阅:

我已经实现了一个具有更新功能的标签编码器。你可以:

  • 安装数据编码器以启动编码器。编码器将保存为pickle文件
  • 用新加入的数据更新编码器
  • 对数据进行变换和逆变换

请参阅:

在我的经历中,这种事情经常让我感到沮丧。我倾向于使用熊猫。获得傻瓜或编写我自己的不是特别优化的标签编码器。关于这个话题,这里有一个很好的讨论:@ame似乎除了编写自己的标签编码器之外,别无选择。我只是担心性能问题,因为我不是python向导,所以我确信我会尝试使用嵌套for循环来完成所有事情:)在我的经验中,这类事情经常让我感到沮丧。我倾向于使用熊猫。获得傻瓜或编写我自己的不是特别优化的标签编码器。关于这个话题,这里有一个很好的讨论:@ame似乎除了编写自己的标签编码器之外,别无选择。我只是担心性能问题,因为我不是一个python向导,所以我确信我会尝试使用嵌套for循环来完成所有工作:)