Как я могу «закодировать метку» для этого набора данных с несколькими метками? - PullRequest
0 голосов
/ 05 августа 2020

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

Мои текущие попытки сделать это - использовать 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 образцов.

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

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

Ответы [ 2 ]

0 голосов
/ 05 августа 2020

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

0 голосов
/ 05 августа 2020

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

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)
...