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:
Eu li o arquivo de trem:
num_rows_to_read = 10000 train_small = pd.read_csv("../../dataset/train.csv", nrows=num_rows_to_read)
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')
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?
drop_first=True
comget_dummies
elimina a necessidade de deixar cair a coluna original separadamenteMuito 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 :
... e eu quero codificar a coluna Rated de maneira quente, basta fazer o seguinte:
Isso retorna um novo
dataframe
com 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 :
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:
Uso :
Resultado :
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:
Você pode codificar vários recursos ao mesmo tempo:
fonte
Você pode fazer isso com
numpy.eye
e usando o mecanismo de seleção de elemento da matriz:O valor de retorno de
indices_to_one_hot(nb_classes, data)
agora é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]]
).fonte
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.
EDIT: Comparação para ser mais claro:
Codificação one-hot: converte n níveis em n-1 colunas.
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:
Converta em representações numéricas. Economiza bastante espaço de recursos, ao custo de um pouco de precisão.
fonte
mouse > cat > dog
mas 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)Uma codificação quente com pandas é muito fácil:
EDITAR:
Outra maneira de one_hot usando sklearn's
LabelBinarizer
:fonte
Você pode usar a função numpy.eye.
Resultado
fonte
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:
fonte
Aqui está uma solução usando
DictVectorizer
e oDataFrame.to_dict('records')
método Pandas .fonte
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
DictVectorizer
ouLabelEncoder
(seguido porget_dummies
. Aqui está uma função que você pode usar: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:
Em seguida, nos dados de teste, a chamada é feita passando o dicionário retornado do treinamento:
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).fonte
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.
fonte
Você pode fazer o seguinte também. Observe o abaixo que você não precisa usar
pd.concat
.Você também pode alterar as colunas explícitas para categóricas. Por exemplo, aqui estou alterando o
Color
eGroup
fonte
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:
fonte
Eu usei isso no meu modelo acústico: provavelmente isso ajuda no seu modelo.
fonte
Para adicionar a outras perguntas, deixe-me fornecer como eu fiz isso com uma função Python 2.0 usando o Numpy:
A linha
n_values = np.max(y_) + 1
pode 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
fonte
Isso funciona para mim:
Resultado:
fonte
Pode e deve ser fácil como:
Uso:
fonte
Expandindo a resposta de @Martin Thoma
fonte
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).
Exemplo:
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:
Testei muitas das respostas a esta pergunta e a maioria delas falha em um dos requisitos acima.
fonte
Tente o seguinte:
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 .fonte
Aqui eu tentei com esta abordagem:
fonte