【问题标题】:Multi label encoding for classes with duplicates具有重复项的类的多标签编码
【发布时间】:2019-12-13 17:36:34
【问题描述】:

如何对具有重复项的列表列进行 n-hot 编码?

类似于来自 sklearn 的 MultiLabelBinarizer 之类的东西,它计算重复类的实例数而不是二值化。

示例输入:

x = pd.Series([['a', 'b', 'a'], ['b', 'c'], ['c','c']])

预期输出:

    a   b   c
0   2   1   0
1   0   1   1
2   0   0   2

【问题讨论】:

  • 对于 pyspark,您可能可以使用 pyspark.ml.feature.CountVectorizer,请参阅我的示例之一(您需要使用默认值:binary=False):stackoverflow.com/questions/58010126/…跨度>

标签: python python-3.x scikit-learn pyspark apache-spark-mllib


【解决方案1】:

我基于MultiLabelBinarizer 代码编写了一个新类MultiLabelCounter

import itertools
import numpy as np

class MultiLabelCounter():
    def __init__(self, classes=None):
        self.classes_ = classes

    def fit(self,y):
        self.classes_ = sorted(set(itertools.chain.from_iterable(y)))
        self.mapping = dict(zip(self.classes_,
                                         range(len(self.classes_))))
        return self

    def transform(self,y):
        yt = []
        for labels in y:
            data = [0]*len(self.classes_)
            for label in labels:
                data[self.mapping[label]] +=1
            yt.append(data)
        return yt

    def fit_transform(self,y):
        return self.fit(y).transform(y)
import pandas as pd
x = pd.Series([['a', 'b', 'a'], ['b', 'c'], ['c','c']])

mlc = MultiLabelCounter()
mlc.fit_transform(x)

# [[2, 1, 0], [0, 1, 1], [0, 0, 2]]

【讨论】:

  • 谢谢,这很好用。我一直在尝试通过使用字典字典和 if 语句进行映射,将其扩展到数据帧的多个指定列而不是单个系列。你能找到更有效的方法吗?
  • 可能是我没有正确理解您的问题。您可以使用columnTransformer 将其扩展到多列。也许您可以在问题中添加更多详细信息。
  • 基本上我想再添加两个功能:1. 对多个功能执行.fit(df[['columnA','columnB']] 的能力,如this 2. 将列映射回原始表示的逆操作,如@ 987654323@。因此,数据集只需要一个转换器,而不是每列一个。
  • 这看起来工作量很大,所以你不必这样做哈哈。我也很乐意得到指点
  • 我建议将此作为一个单独的问题提出,并提供很好的示例。我很乐意提供帮助!
猜你喜欢
  • 2018-07-14
  • 1970-01-01
  • 1970-01-01
  • 2015-07-12
  • 2018-07-07
  • 2020-10-30
  • 2019-09-07
  • 2018-11-04
相关资源
最近更新 更多