Como converter dados categóricos em dados numéricos no Pyspark


11

Estou usando o notebook Ipython para trabalhar com aplicativos pyspark. Eu tenho um arquivo CSV com muitas colunas categóricas para determinar se a renda cai abaixo ou acima do intervalo de 50k. Eu gostaria de executar um algoritmo de classificação, utilizando todas as entradas para determinar a faixa de renda. Preciso criar um dicionário de variáveis ​​para variáveis ​​mapeadas e usar uma função de mapa para mapear as variáveis ​​para números para processamento. Essencialmente, eu gostaria que meu conjunto de dados estivesse em um formato numérico para poder trabalhar na implementação dos modelos.

No conjunto de dados, existem colunas categóricas como educação, estado civil, classe trabalhadora etc. Alguém pode me dizer como convertê-las em colunas numéricas no pyspark?

workclass = {'?':0,'Federal-gov':1,'Local-gov':2,'Never-  worked':3,'Private':4,'Self-emp-inc':5,'Self-emp-not-inc':6,'State-gov':7,'Without-pay':8}

Criei um exemplo de dicionário com pares de valores-chave para a classe de trabalho. Mas não sei como usar isso em uma função de mapa e substituir os dados categóricos no arquivo CSV pelo valor correspondente.

wc = pd.read_csv('PATH', usecols = ['Workclass'])

df = pd.DataFrame(wc)
wcdict = {' ?':0,' Federal-gov':1,' Local-gov':2,' Never-worked':3,' Private':4,' Self-emp-inc':5,' Self-emp-n-inc':6,' State-gov':7,' Without-pay':8}
df_new = df.applymap(lambda s: wcdict.get(s) if s in wcdict else s)
print(df_new)

Este é o código que escrevi em python normal para converter os dados categóricos em dados numéricos. Funciona bem. Eu quero fazer a conversão no contexto de faísca. E há 9 colunas categóricas na fonte de dados. Existe uma maneira de automatizar o processo de atualização do dicionário para ter um par KV para todas as 9 colunas?

Respostas:


14

Isso pode ser feito usando StringIndexerno PySpark e usando o inverso IndexToStringpara referência, verifique isto:

from pyspark.ml.feature import StringIndexer

df = sqlContext.createDataFrame(
    [(0, "a"), (1, "b"), (2, "c"), (3, "a"), (4, "a"), (5, "c")],
    ["id", "category"])
indexer = StringIndexer(inputCol="category", outputCol="categoryIndex")
indexed = indexer.fit(df).transform(df)
indexed.show()

Para mais detalhes, consulte a documentação do spark


2
workclass = {'?':0,'Federal-gov':1,'Local-gov':2,'Never-  worked':3,'Private':4,'Self-emp-inc':5,'Self-emp-not-inc':6,'State-gov':7,'Without-pay':8}

tente definir uma função de mapeador que retorne a chave:

def mapr(dict_key):
    return workclass[dict_key]

print list(map(mapr,workclass))

Ei, você poderia me explicar o que esse bloco faz? Eu executei meu script com esse código adicionado e obtive [6, 1, 4, 3, 5, 7, 8, 0, 2] como saída. Desejo substituir valores numéricos pelo conteúdo da classe de trabalho usando os valores do dicionário.
SRS

Olá, A função mapr retornará um valor numérico associado ao valor da categoria. por exemplo: 6 para 'Self-emp-not-inc', dicionários python não são ordenados. Se você deseja um dicionário ordenado, tente collections.OrderedDict.
precisa

Ok, agora eu entendo a função. O problema é que eu tenho um CSV com vários milhares de linhas e existe uma coluna chamada Workclass que contém qualquer um dos valores mencionados no dicionário. Portanto, para cada linha, preciso alterar o texto dessa coluna para um número comparando o texto com o dicionário e substituindo o número correspondente. Como uso uma função para analisar a coluna por linhas e comparar os valores com o dicionário?
SRS

Você pode criar uma coluna adicional, digamos 'workclass_num', que armazena valores numéricos correspondentes ao valor categórico. Verifique a biblioteca do Python Pandas.
precisa
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.