Como posso uma codificação quente em Python?

132

Eu tenho um problema de classificação de aprendizado de máquina com 80% de variáveis ​​categóricas. Devo usar uma codificação quente para usar um classificador para a classificação? Posso passar os dados para um classificador sem a codificação?

Estou tentando fazer o seguinte para a seleção de recursos:

  1. Eu li o arquivo de trem:

    num_rows_to_read = 10000
    train_small = pd.read_csv("../../dataset/train.csv",   nrows=num_rows_to_read)
  2. Altero o tipo dos recursos categóricos para 'categoria':

    non_categorial_features = ['orig_destination_distance',
                              'srch_adults_cnt',
                              'srch_children_cnt',
                              'srch_rm_cnt',
                              'cnt']
    
    for categorical_feature in list(train_small.columns):
        if categorical_feature not in non_categorial_features:
            train_small[categorical_feature] = train_small[categorical_feature].astype('category')
  3. Eu uso uma codificação quente:

    train_small_with_dummies = pd.get_dummies(train_small, sparse=True)

O problema é que a 3ª parte geralmente fica presa, embora eu esteja usando uma máquina forte.

Assim, sem a única codificação quente, não posso fazer nenhuma seleção de recurso, para determinar a importância dos recursos.

O que você recomenda?

avicohen
fonte

Respostas:

159

Abordagem 1: Você pode usar get_dummies no dataframe do pandas.

Exemplo 1:

import pandas as pd
s = pd.Series(list('abca'))
pd.get_dummies(s)
Out[]: 
     a    b    c
0  1.0  0.0  0.0
1  0.0  1.0  0.0
2  0.0  0.0  1.0
3  1.0  0.0  0.0

Exemplo 2:

O seguinte transformará uma determinada coluna em uma quente. Use o prefixo para ter vários manequins.

import pandas as pd

df = pd.DataFrame({
          'A':['a','b','a'],
          'B':['b','a','c']
        })
df
Out[]: 
   A  B
0  a  b
1  b  a
2  a  c

# Get one hot encoding of columns B
one_hot = pd.get_dummies(df['B'])
# Drop column B as it is now encoded
df = df.drop('B',axis = 1)
# Join the encoded df
df = df.join(one_hot)
df  
Out[]: 
       A  a  b  c
    0  a  0  1  0
    1  b  1  0  0
    2  a  0  0  1

Abordagem 2: use o Scikit-learn

Dado um conjunto de dados com três recursos e quatro amostras, deixamos o codificador encontrar o valor máximo por recurso e transformar os dados em uma codificação binária one-hot.

>>> from sklearn.preprocessing import OneHotEncoder
>>> enc = OneHotEncoder()
>>> enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])   
OneHotEncoder(categorical_features='all', dtype=<class 'numpy.float64'>,
   handle_unknown='error', n_values='auto', sparse=True)
>>> enc.n_values_
array([2, 3, 4])
>>> enc.feature_indices_
array([0, 2, 5, 9], dtype=int32)
>>> enc.transform([[0, 1, 1]]).toarray()
array([[ 1.,  0.,  0.,  1.,  0.,  0.,  1.,  0.,  0.]])

Aqui está o link para este exemplo: http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

Sayali Sonawane
fonte
20
definindo drop_first=Truecom get_dummieselimina a necessidade de deixar cair a coluna original separadamente
OverflowingTheGlass
1
No exemplo 2, existe uma maneira de associar as novas colunas ao quadro de dados sem usar a associação? Estou lidando com um conjunto de dados realmente grande e recebo o MemoryError quando tento fazer isso.
J.Dahlgren
Você pode adicionar uma nova coluna ao quadro de dados sem usar junção se tiver o df2 com o mesmo número de linhas. você pode copiar usando: df [ “newColname”] = df2 [ “col”]
Sayali Sonawane
1
Usando uma imagem, por exemplo 2 era mau
villasv
9
@ OverflowingTheGlass- drop-first = True não remove a coluna original. Ele descarta o primeiro nível do recurso categórico para que você termine com k-1 colunas em vez de k, sendo k a cardinalidade do recurso categórico.
Garima Jain 28/02/19
42

Muito mais fácil de usar o Pandas para a codificação one-hot básica. Se você estiver procurando por mais opções, poderá usar scikit-learn.

Para codificação básica com o Pandas, basta passar seu quadro de dados para a função get_dummies .

Por exemplo, se eu tiver um quadro de dados chamado imdb_movies :

insira a descrição da imagem aqui

... e eu quero codificar a coluna Rated de maneira quente, basta fazer o seguinte:

pd.get_dummies(imdb_movies.Rated)

insira a descrição da imagem aqui

Isso retorna um novo dataframecom uma coluna para cada " nível " de classificação existente, juntamente com 1 ou 0, especificando a presença dessa classificação para uma determinada observação.

Normalmente, queremos que isso faça parte do original dataframe. Nesse caso, simplesmente anexamos nosso novo quadro codificado fictício ao quadro original usando " encadernação em coluna .

Podemos vincular colunas usando a função concat do Pandas :

rated_dummies = pd.get_dummies(imdb_movies.Rated)
pd.concat([imdb_movies, rated_dummies], axis=1)

insira a descrição da imagem aqui

Agora podemos executar uma análise completa dataframe.

FUNÇÃO SIMPLES DE UTILIDADE

Eu recomendaria criar uma função de utilitário para fazer isso rapidamente:

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    return(res)

Uso :

encode_and_bind(imdb_movies, 'Rated')

Resultado :

insira a descrição da imagem aqui

Além disso, conforme o comentário @pmalbu, se você deseja que a função remova o feature_to_encode original , use esta versão:

def encode_and_bind(original_dataframe, feature_to_encode):
    dummies = pd.get_dummies(original_dataframe[[feature_to_encode]])
    res = pd.concat([original_dataframe, dummies], axis=1)
    res = res.drop([feature_to_encode], axis=1)
    return(res) 

Você pode codificar vários recursos ao mesmo tempo:

features_to_encode = ['feature_1', 'feature_2', 'feature_3',
                      'feature_4']
for feature in features_to_encode:
    res = encode_and_bind(train_set, feature)
Cybernetic
fonte
1
Eu sugeriria que você soltasse o feature_to_encode original depois de concatenar as colunas com um hot end com o dataframe original.
pmalbu
Adicionada esta opção para responder. Obrigado.
Cybernetic
28

Você pode fazer isso com numpy.eyee usando o mecanismo de seleção de elemento da matriz:

import numpy as np
nb_classes = 6
data = [[2, 3, 4, 0]]

def indices_to_one_hot(data, nb_classes):
    """Convert an iterable of indices to one-hot encoded labels."""
    targets = np.array(data).reshape(-1)
    return np.eye(nb_classes)[targets]

O valor de retorno de indices_to_one_hot(nb_classes, data)agora é

array([[[ 0.,  0.,  1.,  0.,  0.,  0.],
        [ 0.,  0.,  0.,  1.,  0.,  0.],
        [ 0.,  0.,  0.,  0.,  1.,  0.],
        [ 1.,  0.,  0.,  0.,  0.,  0.]]])

O .reshape(-1)que há para se certificar de que você tem o formato de etiquetas direita (você também pode ter [[2], [3], [4], [0]]).

Martin Thoma
fonte
1
Isso não funcionará para OHE das colunas com valor de sequência.
Abhilash Awasthi
2
@AbhilashAwasthi Claro ... mas por que você esperaria que funcionasse então?
Martin Thoma
22

Primeiro, a maneira mais fácil de obter uma codificação quente: use o Sklearn.

http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html

Em segundo lugar, não acho que usar pandas para uma codificação quente seja tão simples (embora não confirmado)

Criando variáveis ​​dummy em pandas para python

Por fim, é necessário que você faça uma codificação quente? Uma codificação quente aumenta exponencialmente o número de recursos, aumentando drasticamente o tempo de execução de qualquer classificador ou qualquer outra coisa que você deseja executar. Especialmente quando cada recurso categórico tem muitos níveis. Em vez disso, você pode fazer codificação fictícia.

O uso de codificação fictícia geralmente funciona bem, por muito menos tempo de execução e complexidade. Um professor sábio me disse uma vez: 'Menos é mais'.

Aqui está o código da minha função de codificação personalizada, se você quiser.

from sklearn.preprocessing import LabelEncoder

#Auto encodes any dataframe column of type category or object.
def dummyEncode(df):
        columnsToEncode = list(df.select_dtypes(include=['category','object']))
        le = LabelEncoder()
        for feature in columnsToEncode:
            try:
                df[feature] = le.fit_transform(df[feature])
            except:
                print('Error encoding '+feature)
        return df

EDIT: Comparação para ser mais claro:

Codificação one-hot: converte n níveis em n-1 colunas.

Index  Animal         Index  cat  mouse
  1     dog             1     0     0
  2     cat       -->   2     1     0
  3    mouse            3     0     1

Você pode ver como isso explodirá sua memória se você tiver muitos tipos (ou níveis) diferentes em seu recurso categórico. Lembre-se de que essa é apenas uma coluna.

Codificação fictícia:

Index  Animal         Index  Animal
  1     dog             1      0   
  2     cat       -->   2      1 
  3    mouse            3      2

Converta em representações numéricas. Economiza bastante espaço de recursos, ao custo de um pouco de precisão.

Wboy
fonte
1
1. Eu tenho um conjunto de dados que possui 80% de variáveis ​​categóricas. Para meu entendimento, devo usar uma codificação quente se quiser usar um classificador para esses dados; caso contrário, no caso de não fazer a codificação quente, o classificador não tratará as variáveis ​​categóricas da maneira correta? Existe uma opção para não codificar? 2. Se eu usar pd.get_dummies (train_small, sparse = True) com o saprse = True - isso não resolve o problema de memória? 3. Como devo abordar esse problema?
Avicohen
Como eu disse, existem duas opções. 1) Uma codificação quente -> converte todos os níveis em recursos categóricos para uma nova coluna. 2) Codificação fictícia -> converte todas as colunas em representações numéricas. Vou editar minha resposta acima para ficar mais clara. Mas você pode simplesmente executar a função que eu forneci e ela deve funcionar #
755 Wboy
17
"ao custo de um pouco de precisão." Como você pode dizer "um pouco"? Talvez em alguns casos, mas em outros, a precisão possa ser muito prejudicada. Essa solução resulta no tratamento contínuo dos recursos qualitativos, o que significa que seu modelo não aprenderá com os dados adequadamente.
Josh Morel
2
Como Josh disse acima, em seu segundo exemplo, você acaba dizendo ao modelo isso, mouse > cat > dogmas esse não é o caso. get_dummiesé a maneira mais simples de transferir as variáveis categóricas em dados amigável modelo da minha experiência (ainda que muito limitado)
Martin O Leary
5
Essa solução é muito perigosa, como apontado por alguns outros comentários. Atribui arbitrariamente ordens e distâncias a variáveis ​​categóricas. Isso reduz a flexibilidade do modelo de maneira aleatória. Para modelos baseados em árvore, essa codificação reduz possíveis possibilidades de subconjunto. Por exemplo, você pode obter apenas duas divisões possíveis agora [(0), (1,2)] e [(0,1), (2)], e a divisão [(0,2), (1)] é impossível. A perda é muito mais significativa quando o número de categorias é alto.
Random Certainty
19

Uma codificação quente com pandas é muito fácil:

def one_hot(df, cols):
    """
    @param df pandas DataFrame
    @param cols a list of columns to encode 
    @return a DataFrame with one-hot encoding
    """
    for each in cols:
        dummies = pd.get_dummies(df[each], prefix=each, drop_first=False)
        df = pd.concat([df, dummies], axis=1)
    return df

EDITAR:

Outra maneira de one_hot usando sklearn's LabelBinarizer:

from sklearn.preprocessing import LabelBinarizer 
label_binarizer = LabelBinarizer()
label_binarizer.fit(all_your_labels_list) # need to be global or remembered to use it later

def one_hot_encode(x):
    """
    One hot encode a list of sample labels. Return a one-hot encoded vector for each label.
    : x: List of sample Labels
    : return: Numpy array of one-hot encoded labels
    """
    return label_binarizer.transform(x)
Qy Zuo
fonte
14

Você pode usar a função numpy.eye.

import numpy as np

def one_hot_encode(x, n_classes):
    """
    One hot encode a list of sample labels. Return a one-hot encoded vector for each label.
    : x: List of sample Labels
    : return: Numpy array of one-hot encoded labels
     """
    return np.eye(n_classes)[x]

def main():
    list = [0,1,2,3,4,3,2,1,0]
    n_classes = 5
    one_hot_list = one_hot_encode(list, n_classes)
    print(one_hot_list)

if __name__ == "__main__":
    main()

Resultado

D:\Desktop>python test.py
[[ 1.  0.  0.  0.  0.]
 [ 0.  1.  0.  0.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  0.  0.  1.  0.]
 [ 0.  0.  0.  0.  1.]
 [ 0.  0.  0.  1.  0.]
 [ 0.  0.  1.  0.  0.]
 [ 0.  1.  0.  0.  0.]
 [ 1.  0.  0.  0.  0.]]
Dieter
fonte
2
Você acabou de copiar minha resposta?
Martin Thoma
@Martin Thoma - Acho que não
Dieter
5

pandas como tem a função embutida "get_dummies" para obter uma codificação quente dessas colunas específicas.

um código de linha para codificação one-hot:

df=pd.concat([df,pd.get_dummies(df['column name'],prefix='column name')],axis=1).drop(['column name'],axis=1)
Arshdeep Singh
fonte
4

Aqui está uma solução usando DictVectorizere o DataFrame.to_dict('records')método Pandas .

>>> import pandas as pd
>>> X = pd.DataFrame({'income': [100000,110000,90000,30000,14000,50000],
                      'country':['US', 'CAN', 'US', 'CAN', 'MEX', 'US'],
                      'race':['White', 'Black', 'Latino', 'White', 'White', 'Black']
                     })

>>> from sklearn.feature_extraction import DictVectorizer
>>> v = DictVectorizer()
>>> qualitative_features = ['country','race']
>>> X_qual = v.fit_transform(X[qualitative_features].to_dict('records'))
>>> v.vocabulary_
{'country=CAN': 0,
 'country=MEX': 1,
 'country=US': 2,
 'race=Black': 3,
 'race=Latino': 4,
 'race=White': 5}

>>> X_qual.toarray()
array([[ 0.,  0.,  1.,  0.,  0.,  1.],
       [ 1.,  0.,  0.,  1.,  0.,  0.],
       [ 0.,  0.,  1.,  0.,  1.,  0.],
       [ 1.,  0.,  0.,  0.,  0.,  1.],
       [ 0.,  1.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  1.,  1.,  0.,  0.]])
Josh Morel
fonte
3

A codificação one-hot requer um pouco mais do que converter os valores em variáveis ​​indicadoras. Normalmente, o processo de ML exige que você aplique essa codificação várias vezes aos conjuntos de dados de validação ou teste e aplique o modelo que você constrói aos dados observados em tempo real. Você deve armazenar o mapeamento (transformação) usado para construir o modelo. Uma boa solução usaria o DictVectorizerou LabelEncoder(seguido por get_dummies. Aqui está uma função que você pode usar:

def oneHotEncode2(df, le_dict = {}):
    if not le_dict:
        columnsToEncode = list(df.select_dtypes(include=['category','object']))
        train = True;
    else:
        columnsToEncode = le_dict.keys()   
        train = False;

    for feature in columnsToEncode:
        if train:
            le_dict[feature] = LabelEncoder()
        try:
            if train:
                df[feature] = le_dict[feature].fit_transform(df[feature])
            else:
                df[feature] = le_dict[feature].transform(df[feature])

            df = pd.concat([df, 
                              pd.get_dummies(df[feature]).rename(columns=lambda x: feature + '_' + str(x))], axis=1)
            df = df.drop(feature, axis=1)
        except:
            print('Error encoding '+feature)
            #df[feature]  = df[feature].convert_objects(convert_numeric='force')
            df[feature]  = df[feature].apply(pd.to_numeric, errors='coerce')
    return (df, le_dict)

Isso funciona em um dataframe do pandas e para cada coluna do dataframe criada e retorna um mapeamento de volta. Então você poderia chamar assim:

train_data, le_dict = oneHotEncode2(train_data)

Em seguida, nos dados de teste, a chamada é feita passando o dicionário retornado do treinamento:

test_data, _ = oneHotEncode2(test_data, le_dict)

Um método equivalente é usar DictVectorizer. Um post relacionado sobre o mesmo está no meu blog. Eu o mencionei aqui, pois fornece alguns argumentos por trás dessa abordagem, usando simplesmente o post get_dummies (divulgação: este é o meu próprio blog).

Tukeys
fonte
3

Você pode passar os dados para o classificador catboost sem codificação. O Catboost lida com variáveis ​​categóricas, realizando a codificação média de expansão de um ponto quente e de destino.

Garima Jain
fonte
3

Você pode fazer o seguinte também. Observe o abaixo que você não precisa usar pd.concat.

import pandas as pd 
# intialise data of lists. 
data = {'Color':['Red', 'Yellow', 'Red', 'Yellow'], 'Length':[20.1, 21.1, 19.1, 18.1],
       'Group':[1,2,1,2]} 

# Create DataFrame 
df = pd.DataFrame(data) 

for _c in df.select_dtypes(include=['object']).columns:
    print(_c)
    df[_c]  = pd.Categorical(df[_c])
df_transformed = pd.get_dummies(df)
df_transformed

Você também pode alterar as colunas explícitas para categóricas. Por exemplo, aqui estou alterando o ColoreGroup

import pandas as pd 
# intialise data of lists. 
data = {'Color':['Red', 'Yellow', 'Red', 'Yellow'], 'Length':[20.1, 21.1, 19.1, 18.1],
       'Group':[1,2,1,2]} 

# Create DataFrame 
df = pd.DataFrame(data) 
columns_to_change = list(df.select_dtypes(include=['object']).columns)
columns_to_change.append('Group')
for _c in columns_to_change:
    print(_c)
    df[_c]  = pd.Categorical(df[_c])
df_transformed = pd.get_dummies(df)
df_transformed
sushmit
fonte
2

Eu sei que estou atrasado para esta festa, mas a maneira mais simples de codificar a quente de um dataframe de maneira automatizada é usar esta função:

def hot_encode(df):
    obj_df = df.select_dtypes(include=['object'])
    return pd.get_dummies(df, columns=obj_df.columns).values
Rambatino
fonte
1

Eu usei isso no meu modelo acústico: provavelmente isso ajuda no seu modelo.

def one_hot_encoding(x, n_out):
    x = x.astype(int)  
    shape = x.shape
    x = x.flatten()
    N = len(x)
    x_categ = np.zeros((N,n_out))
    x_categ[np.arange(N), x] = 1
    return x_categ.reshape((shape)+(n_out,))
yunus
fonte
0

Para adicionar a outras perguntas, deixe-me fornecer como eu fiz isso com uma função Python 2.0 usando o Numpy:

def one_hot(y_):
    # Function to encode output labels from number indexes 
    # e.g.: [[5], [0], [3]] --> [[0, 0, 0, 0, 0, 1], [1, 0, 0, 0, 0, 0], [0, 0, 0, 1, 0, 0]]

    y_ = y_.reshape(len(y_))
    n_values = np.max(y_) + 1
    return np.eye(n_values)[np.array(y_, dtype=np.int32)]  # Returns FLOATS

A linha n_values = np.max(y_) + 1pode ser codificada para você usar o bom número de neurônios, caso você use mini lotes, por exemplo.

Projeto / tutorial de demonstração em que esta função foi usada: https://github.com/guillaume-chevalier/LSTM-Human-Activity-Recognition

Guillaume Chevalier
fonte
0

Isso funciona para mim:

pandas.factorize( ['B', 'C', 'D', 'B'] )[0]

Resultado:

[0, 1, 2, 0]
scottlittle
fonte
0

Pode e deve ser fácil como:

class OneHotEncoder:
    def __init__(self,optionKeys):
        length=len(optionKeys)
        self.__dict__={optionKeys[j]:[0 if i!=j else 1 for i in range(length)] for j in range(length)}

Uso:

ohe=OneHotEncoder(["A","B","C","D"])
print(ohe.A)
print(ohe.D)
Ofek Ron
fonte
0

Expandindo a resposta de @Martin Thoma

def one_hot_encode(y):
    """Convert an iterable of indices to one-hot encoded labels."""
    y = y.flatten() # Sometimes not flattened vector is passed e.g (118,1) in these cases
    # the function ends up creating a tensor e.g. (118, 2, 1). flatten removes this issue
    nb_classes = len(np.unique(y)) # get the number of unique classes
    standardised_labels = dict(zip(np.unique(y), np.arange(nb_classes))) # get the class labels as a dictionary
    # which then is standardised. E.g imagine class labels are (4,7,9) if a vector of y containing 4,7 and 9 is
    # directly passed then np.eye(nb_classes)[4] or 7,9 throws an out of index error.
    # standardised labels fixes this issue by returning a dictionary;
    # standardised_labels = {4:0, 7:1, 9:2}. The values of the dictionary are mapped to keys in y array.
    # standardised_labels also removes the error that is raised if the labels are floats. E.g. 1.0; element
    # cannot be called by an integer index e.g y[1.0] - throws an index error.
    targets = np.vectorize(standardised_labels.get)(y) # map the dictionary values to array.
    return np.eye(nb_classes)[targets]
mcagriardic
fonte
0

Resposta curta

Aqui está uma função para fazer a codificação one-hot sem usar numpy, pandas ou outros pacotes. É preciso uma lista de números inteiros, booleanos ou strings (e talvez outros tipos também).

import typing


def one_hot_encode(items: list) -> typing.List[list]:
    results = []
    # find the unique items (we want to unique items b/c duplicate items will have the same encoding)
    unique_items = list(set(items))
    # sort the unique items
    sorted_items = sorted(unique_items)
    # find how long the list of each item should be
    max_index = len(unique_items)

    for item in items:
        # create a list of zeros the appropriate length
        one_hot_encoded_result = [0 for i in range(0, max_index)]
        # find the index of the item
        one_hot_index = sorted_items.index(item)
        # change the zero at the index from the previous line to a one
        one_hot_encoded_result[one_hot_index] = 1
        # add the result
        results.append(one_hot_encoded_result)

    return results

Exemplo:

one_hot_encode([2, 1, 1, 2, 5, 3])

# [[0, 1, 0, 0],
#  [1, 0, 0, 0],
#  [1, 0, 0, 0],
#  [0, 1, 0, 0],
#  [0, 0, 0, 1],
#  [0, 0, 1, 0]]
one_hot_encode([True, False, True])

# [[0, 1], [1, 0], [0, 1]]
one_hot_encode(['a', 'b', 'c', 'a', 'e'])

# [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [1, 0, 0, 0], [0, 0, 0, 1]]

Resposta longa (er)

Eu sei que já existem muitas respostas para essa pergunta, mas notei duas coisas. Primeiro, a maioria das respostas usa pacotes como numpy e / ou pandas. E isso é uma coisa boa. Se você estiver escrevendo código de produção, provavelmente deverá usar algoritmos robustos e rápidos, como os fornecidos nos pacotes numpy / pandas. Mas, em prol da educação, acho que alguém deve fornecer uma resposta que tenha um algoritmo transparente e não apenas uma implementação do algoritmo de outra pessoa. Segundo, notei que muitas das respostas não fornecem uma implementação robusta da codificação one-hot porque não atendem a um dos requisitos abaixo. Abaixo estão alguns dos requisitos (como eu os vejo) para uma função de codificação one-hot útil, precisa e robusta:

Uma função de codificação one-hot deve:

  • manipular lista de vários tipos (por exemplo, números inteiros, strings, flutuadores, etc.) como entrada
  • manipular uma lista de entrada com duplicatas
  • retorne uma lista de listas correspondentes (na mesma ordem que) às entradas
  • retorna uma lista de listas em que cada lista é o mais curta possível

Testei muitas das respostas a esta pergunta e a maioria delas falha em um dos requisitos acima.

Floyd
fonte
0

Tente o seguinte:

!pip install category_encoders
import category_encoders as ce

categorical_columns = [...the list of names of the columns you want to one-hot-encode ...]
encoder = ce.OneHotEncoder(cols=categorical_columns, use_cat_names=True)
df_train_encoded = encoder.fit_transform(df_train_small)

df_encoded.head ()

O quadro de dados resultante df_train_encodedé o mesmo que o original, mas os recursos categóricos agora são substituídos por suas versões codificadas um a quente.

Mais informações category_encoders aqui .

Andrea Araldo
fonte
-1

Aqui eu tentei com esta abordagem:

import numpy as np
#converting to one_hot





def one_hot_encoder(value, datal):

    datal[value] = 1

    return datal


def _one_hot_values(labels_data):
    encoded = [0] * len(labels_data)

    for j, i in enumerate(labels_data):
        max_value = [0] * (np.max(labels_data) + 1)

        encoded[j] = one_hot_encoder(i, max_value)

    return np.array(encoded)
Aaditya Ura
fonte