Склеарн: категорический импьютер?

Есть ли способ присвоить категориальные значения с помощью объекта sklearn.preprocessing? Я хотел бы в конечном итоге создать объект предварительной обработки, который я могу применить к новым данным и преобразовать его так же, как и старые данные.

Я ищу способ сделать это, чтобы использовать его этим способом.


person user1367204    schedule 16.03.2017    source источник
comment
Вам следует добавить дополнительные объяснения, а также данные и то, что вы хотите с ними делать?   -  person Vivek Kumar    schedule 17.03.2017


Ответы (4)


Да, это возможно. Например, вы можете использовать sklearn.preprocessing.Imputer с параметром strategy = 'most_frequent'.

Используйте метод fit_transform, чтобы применить его к старым данным (набор поездов), а затем transform к новым данным (набор тестов).

person slonopotam    schedule 17.03.2017
comment
Ну, я предположил, что это уже числовой (целочисленный) категориальный. Если категориальные данные представлены в строковом формате, их сначала необходимо преобразовать в числовые, например, с помощью sklearn.LabelEncoder. - person slonopotam; 17.03.2017
comment
Когда я использую LabelEncoder, я теряю поля numpy.NaN, они превращаются в числа, а затем я не могу использовать Imputer на следующем шаге. - person user1367204; 17.03.2017
comment
@ user1367204, вы все равно можете использовать этот номер с Imputer, просто передайте его как параметр missing_values. Возможно, есть более чистое решение, но это тоже работает ... - person slonopotam; 17.03.2017

Импьютеры из sklearn.preprocessing хорошо работают с числовыми переменными. Но для категориальных переменных в основном категории - это строки, а не числа. Чтобы иметь возможность использовать импьютеры sklearn, вам необходимо преобразовать строки в числа, затем вменять и, наконец, преобразовывать обратно в строки.

Лучшим вариантом является использование CategoriesImputer () из пакета sklearn_pandas.

Он заменяет нулевые значения режимом и работает со строковыми столбцами. Пакет sklearn-pandas может быть установлен с помощью pip install sklearn-pandas и может быть импортирован как import sklearn_pandas

person Dr Nisha Arora    schedule 14.09.2020

Копируя и изменяя этот ответ, я сделал импутер для объекта pandas.Series

import numpy
import pandas 

from sklearn.base import TransformerMixin


class SeriesImputer(TransformerMixin):

    def __init__(self):
        """Impute missing values.

        If the Series is of dtype Object, then impute with the most frequent object.
        If the Series is not of dtype Object, then impute with the mean.  

        """
    def fit(self, X, y=None):
        if   X.dtype == numpy.dtype('O'): self.fill = X.value_counts().index[0]
        else                            : self.fill = X.mean()
        return self

    def transform(self, X, y=None):
        return X.fillna(self.fill)

Чтобы использовать это, вы должны:

# Make a series
s1 = pandas.Series(['k', 'i', 't', 't', 'e', numpy.NaN])


a  = SeriesImputer()   # Initialize the imputer
a.fit(s1)              # Fit the imputer
s2 = a.transform(s1)   # Get a new series 
person user1367204    schedule 17.03.2017

Вы также можете использовать OrdinalEncoder.

Вы можете обучить его на обучающем наборе, используя функцию fit(), чтобы получить модель, а затем применить модель как к обучающему, так и к испытательному набору с помощью transform():

oe = OrdinalEncoder()
# train the model on a training set of type pandas.DataFrame, for example
oe.fit(df_train)
# transform the training set using the model:
ar_train_encoded = oe.transform(df_train)
# transform the test set using the SAME model:
ar_test_encoded = oe.transform(df_test)

Результатом является большой массив.

person Catalina Chircu    schedule 31.01.2020