Как я могу пометить этот набор данных с несколькими метками?

Вот небольшой фрейм данных, который содержит очень небольшой фрагмент данных, которые мне нужно закодировать. Кадр данных для кодирования

В настоящее время я пытаюсь сделать это с помощью 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 образцов.

Я также не уверен, должны ли цели быть разделены запятыми или нет, я всегда могу это изменить, но моя конечная цель - получить новый фрейм данных с закодированными метками вместо меток категорий.

Кроме того, поскольку кодировщик возвращает один массив, если бы я делал одно и то же для каждой строки, каждая с разным количеством меток (т.е. (собаки, животные) вместо (локальные)), мне нужно было бы добавить каждый массив сделать матрицу, но я понятия не имею, как это сделать. Большое спасибо за помощь!


person Alborz Gharabaghi    schedule 05.08.2020    source источник


Ответы (2)


Недавно у меня тоже была эта проблема, вот функция, которая выполняет эту работу:

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)
person Ivan Petrovic Markovic    schedule 05.08.2020
comment
Это существенно отличается от использования OrdinalEncoder? - person Ben Reiniger; 06.08.2020
comment
Спасибо за помощь! К сожалению, я попробовал это, и это дало мне KeyError: 'local'. В моем фрейме данных есть только один столбец с именем «теги», и одним из этих тегов является локальный. Может ли это быть проблема? Даже если я определяю столбцы = ['теги'], он возвращает новый фрейм данных с одним числом в строке, а не то, что я хочу. - person Alborz Gharabaghi; 06.08.2020

Я думаю, вам понадобится MultiLabelBinarizer. В любом случае, для моделей с несколькими метками sklearn ожидаемым форматом является логический массив, а не массив списков целых чисел.

person Ben Reiniger    schedule 05.08.2020