【问题标题】:Preserve order when label encoding标签编码时保留顺序
【发布时间】:2019-11-25 17:49:50
【问题描述】:

当标签编码数字时

[1, 1, 2, 6]

LabelEncoder 返回 [0,0,1,2] 因为它对类进行排序

通过保留原始顺序获得[1,1,0,2] 的最佳方法是什么

尝试过 - CategoricalIndex,效果相同

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit([2, 1, 2, 6])

# le.classes_ [1,2,6]

le.transform([1, 1, 2, 6]) 

【问题讨论】:

标签: pandas scikit-learn data-science


【解决方案1】:

这是一种方法。想知道 pandas 中是否有任何现有的函数可以做到这一点。

refdict=dict()
for i,j in data.Hash.items():
    if j in refdict:
        refdict[j].append(i)
    else:
        refdict[j]=[i]
for i in refdict:
    refdict[i]=min(refdict[i])
data.Hash.apply(lambda x:refdict[x])

【讨论】:

    【解决方案2】:

    我们可以使用factorize

    pd.factorize([2, 1, 2, 6])[0]
    array([0, 1, 0, 2])
    

    【讨论】:

    • 这是进行 fit_transform 的好方法。这可以用来转换另一个列表吗?
    【解决方案3】:

    我已自定义 LabelEncoder 以使用唯一值而不进行排序。试试my wrapper on LabelEncoder

    >>> le = CustLabelEncoder(preserve_order=True)
    
    >>> le.fit([2, 1, 2, 6])
    >>> le.classes_
    # array([2, 1, 6])
    
    >>> le.transform([2, 1, 2, 6]) 
    # array([0, 1, 0, 2])
    
    >>> le.inverse_transform([0, 1, 0, 2])
    # array([2, 1, 2, 6])
    
    >>> le = CustLabelEncoder(preserve_order=False)
    
    >>> le.fit([2, 1, 2, 6])
    >>> le.classes_
    # array([1, 2, 6])
    
    >>> le.transform([2, 1, 2, 6]) 
    # array([1, 0, 1, 2])
    
    >>> le.inverse_transform([0, 1, 0, 2])
    # array([1, 2, 1, 6])
    

    【讨论】:

      猜你喜欢
      • 2016-02-12
      • 2018-12-24
      • 2011-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-22
      • 2020-08-31
      • 1970-01-01
      相关资源
      最近更新 更多