python中不可见数据的分类数据编码器



有一个包含许多分类数据的大型数据集,希望使用sklearn进行一次热编码。有一个问题是sklearn只处理当前数据中的类别。如果我将来有新的数据,但现在有一些看不见的值,该如何处理?

下面的feature_engine包似乎可以选择出现次数最多的值并折叠其他值。对于这一点,如果未来有看不见的价值观,它们就会崩溃。

from feature_engine import categorical_encoders as ce
import pandas as pd

# set up the encoder
encoder = ce.OneHotCategoricalEncoder(
top_categories=10,
drop_last=False)

# fit the encoder
encoder.fit(df)
encoder.transform(df)

我最感兴趣的类别值不是经常出现的值,所以我不能直接使用它。

例如,一列包含计算机类型名称,如:"MacBook Air"、"MacBook Pro"、"Chromebook Flex 3"、"Samsung Chromebook"、,。。。。。。未来可能会有更多新的笔记本电脑名称。

如何处理?

您必须使它具有动态性。例如:您的数据帧(我们称之为df(有一个名为"mob_names"的属性,然后以下命令将生成列的唯一值及其长度的数组:

unique_names = df.mob_names.unique()
num_of_unique_names = len(unique_names)

然后使用为编码器创建的变量:

encoder = ce.OneHotCategoricalEncoder(
top_categories= num_of_unique_names ,
variables= unique_names.tolist() )
# fit the encoder
encoder.fit(df)
encoder.transform(df)

此外,drop_last是无用的,因为它只在top_categories = None的情况下使用。扔掉它。

检查文件

如果该类别不存在,并且它可能在未来出现,就像一种新型号的计算机一样,那么,需要有一个关于如何处理这些计算机的商业决策。该模型没有针对它们进行训练,因此可能会做出糟糕的预测。请参阅我的评论以获得更多见解。

现在,如果你想对不是最频繁的特定类别进行编码,你可以使用sklearn OneHotEncoder如下所示进行编码((

import numpy as np
from sklearn.preprocessing import OneHotEncoder
X = [['Male', "Cat"], ['Female', "Dog"], ['Female', "Dog"]]
enc = OneHotEncoder(
categories=[["Male", "Female"], ["Cat"]], 
handle_unknown="ignore", 
sparse_output=False,
)
X_t = enc.fit_transform(X)
X_t
Out[15]: 
array([[1., 0., 1.],
[0., 1., 0.],
[0., 1., 0.]])

在前面的例子中,我们编码的是Cat,而不是Dog,后者是最频繁的。简而言之,您需要将要编码的类别传递给转换器。

最新更新