【问题标题】:How can I "label encode" this multi-label dataset?如何“标签编码”这个多标签数据集?
【发布时间】:2020-11-25 21:05:43
【问题描述】:

这是一个小数据帧,其中包含我需要编码的非常小的数据片段。 DataFrame to Encode

我目前的工作是使用 SciKit-Learns LabelEncoder(),

le = preprocessing.LabelEncoder()
le.fit(["local", "animals", "local", "diet", "food", "health", "local", "police brutality", "police", "kids", "dogs"])
list(le.classes_)

(output) 
['animals',
 'diet',
 'dogs',
 'food',
 'health',
 'kids',
 'local',
 'police',
 'police brutality']

我现在已将所有我想要的目标添加到编码器,所以现在我需要开始编码。问题是 LabelEncoder 接受这样的参数。

le.transform(["local"]) #For the first row in the data frame
(output) array([6])

现在这是第一行的正确编码,但我将如何对其他每一行执行此操作?我不认为手动编写它是非常可行的,因为我的实际数据集大约有 6000 个样本。

我也不确定目标是否应该用逗号分隔,我总是可以改变它,但我的最终目标是获得一个带有编码标签而不是分类标签的新数据框。

另外,由于编码器返回一个数组,如果我要对每一行做同样的事情,每行都有不同数量的标签(即(狗,动物)而不是(本地)),我需要附加每个数组以创建一个矩阵,但这也是我不知道该怎么做的事情。非常感谢您的帮助!

【问题讨论】:

    标签: python machine-learning scikit-learn multilabel-classification label-encoding


    【解决方案1】:

    我最近也遇到了这个问题,这里有一个可以解决问题的函数:

    from sklearn.preprocessing import LabelEncoder
    from sklearn.pipeline import Pipeline
    
    class MultiColumnLabelEncoder:
        def __init__(self,columns = None):
            self.columns = columns # array of column names to encode
    
        def fit(self,X,y=None):
            return self # not relevant here
    
        def transform(self,X):
            '''
            Transforms columns of X specified in self.columns using
            LabelEncoder(). If no columns specified, transforms all
            columns in X.
            '''
            output = X.copy()
            if self.columns is not None:
                for col in self.columns:
                    output[col] = LabelEncoder().fit_transform(output[col])
            else:
                for colname,col in output.iteritems():
                    output[colname] = LabelEncoder().fit_transform(col)
            return output
    
        def fit_transform(self,X,y=None):
            return self.fit(X,y).transform(X)
    

    这就是你如何在你的例子中使用它

        dataset = MultiColumnLabelEncoder(columns = ["local", "animals", "local", "diet", "food", "health", "local", "police brutality", "police", "kids", "dogs"]).fit_transform(dataset)
    

    【讨论】:

    • 这与使用OrdinalEncoder有显着不同吗?
    • 感谢您的帮助!不幸的是,我试过了,它给了我一个 KeyError:'local'。我的数据框只有一列称为“标签”,本地是这些标签之一。这可能是问题吗?即使我定义了columns = ['tags'],它也会返回一个每行一个数字的新数据框,而不是我想要的。
    【解决方案2】:

    我想你会想要MultiLabelBinarizer。无论如何,对于 sklearn 多标签模型,预期格式是布尔数组,而不是整数列表数组。

    【讨论】:

      【解决方案3】:

      试试这个

      from sklearn.preprocessing import MultiLabelBinarizer
      
      
      mlb = MultiLabelBinarizer()
      
      mlb.fit([["local", "animals", "local", "diet", "food", "health", "local", "police brutality", "police", "kids", "dogs"]])
      

      【讨论】:

        猜你喜欢
        • 2020-02-01
        • 1970-01-01
        • 2015-01-24
        • 1970-01-01
        • 2019-03-14
        • 2020-10-30
        • 2022-10-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多