如何编码大量唯一的分类值?

发布于 2025-02-08 02:23:34 字数 1176 浏览 1 评论 0 原文

我有一个数据集,其中有几列,每个列的 18000 唯一值。

不可能使用 One_hot ,因为它在维度上炸开并且还用尽了内存。

简单的 label_encoder 仍将从 {0,18000} 中具有值,因此它并不理想。也许,这可以在两个值之间进行归一化,即: { - 1,1}

一个人将如何处理这个问题?

编辑 提出这个 - 不知道它是否正确

class OrdinalEncoderAndStandardScalerTransformer(BaseEstimator, TransformerMixin):
    def __init__(self, mean=None, var=None, encoding_dict=None):
        self.mean = mean
        self.var = var
        self.encoding_dict = encoding_dict

    def fit(self, x, y=None):
        self.ordinal_encoder = OrdinalEncoder()
        self.scaler = StandardScaler()
        return self

    def transform(self, x, y=None):
        series_name = x.name
        _x = x.to_numpy().reshape(-1, 1)
        _x = self.ordinal_encoder.fit_transform(_x)
        categories = self.ordinal_encoder.categories_
        self.encoding_dict = dict(zip((categories[0]), range(len(categories[0]))))
        _x = np.squeeze(self.scaler.fit_transform(_x))
        self.mean = self.scaler.mean_[0]
        self.var = self.scaler.var_[0]
        return pd.Series(_x, name=series_name)

I have a dataset with a few columns that have around 18000 unique values each.

It is impossible to use one_hot because it blows up in dimensionality and also runs out of memory.

A simple label_encoder will still have values from {0, 18000} so it not ideal. Perhaps, this can be normalized between two values i.e.: {-1, 1}.

How would one handle this issue?

Edit
Came up with this - don't know if its correct

class OrdinalEncoderAndStandardScalerTransformer(BaseEstimator, TransformerMixin):
    def __init__(self, mean=None, var=None, encoding_dict=None):
        self.mean = mean
        self.var = var
        self.encoding_dict = encoding_dict

    def fit(self, x, y=None):
        self.ordinal_encoder = OrdinalEncoder()
        self.scaler = StandardScaler()
        return self

    def transform(self, x, y=None):
        series_name = x.name
        _x = x.to_numpy().reshape(-1, 1)
        _x = self.ordinal_encoder.fit_transform(_x)
        categories = self.ordinal_encoder.categories_
        self.encoding_dict = dict(zip((categories[0]), range(len(categories[0]))))
        _x = np.squeeze(self.scaler.fit_transform(_x))
        self.mean = self.scaler.mean_[0]
        self.var = self.scaler.var_[0]
        return pd.Series(_x, name=series_name)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

你另情深 2025-02-15 02:23:35

假设该订单不是有意义的,那么想到了两种可能的方法:

  • 抛弃一种平均目标编码(基于基数高,目标泄漏是一个严重的问题,因此其他品种可能不合适);
  • 哈希(允许记忆保护与一些信息损失权衡)。

Assuming the order is not meaningful, two possible ways come to mind:

  • leave one out variety of mean target encoding (with cardinality this high, target leakage is a serious concern, so other varieties might be unsuitable);
  • hashing (allows for memory conservation vs some information loss tradeoff).

There's a nice flowchart for encoding method selection at https://innovation.alteryx.com/encode-smarter/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文