Codificação para classificadores
Tenho algumas dúvidas em relação à codificação (não estou familiarizado com tarefas como essas) variáveis categóricas para usá-las como parâmetros em um modelo como regressão logística ou SVM. Meu conjunto de dados se parece com o seguinte
Text Symbol Note Account Age Label
There is a red car ! red John 24 1
My bag was very expensive ? orange Luke 36 0
Where are my keys? @ red Red 58 1
I promise: I will never let you go! ... green Aoife 28 0
No texto, são armazenados comentários de usuários em uma comunidade; símbolo inclui o símbolo mais usado por um usuário; A nota representa seu nível: o verde é mais experiente, o vermelho é um novo marcante; Conta é o nome do usuário. O rótulo fornece informações sobre a confiabilidade do usuário: se 0, o usuário não é falso; se um, o usuário pode ser um possível bot.
Gostaria de classificar os novos usuários com base nas informações atuais (consulte as colunas acima). Meu conjunto de dados inclui mais de 1000 linhas e 400 usuários. Como para usar classificadores, preciso codificar campos categóricos, tentei fazer o seguinte, usando MultiColumnLabelEncoderem sklearn:
MultiColumnLabelEncoder(columns = ['Text', 'Symbol', 'Note', 'Account']).fit_transform(df)
onde df é meu dataframe. No entanto, entendi que também um fotencoder deve ser preferível. Também incluí Conta, pois pode haver mais comentários da mesma conta, então se eu classificasse uma conta como falsa e recebesse um novo comentário da mesma conta, então essa conta poderia ser facilmente detectada como falsa. O objetivo, como já mencionei, seria classificar, com certa precisão, novos elementos de um conjunto de teste, com base nas informações fornecidas (símbolo, nota, idade, textos), ou seja, procurando uma possível correlação entre essas variáveis que pode me permitir dizer que uma nova conta é falsa (1) ou não (0).
O problema, como você pode ver, está relacionado aos classificadores em que os parâmetros não são apenas numéricos, mas também categóricos.
Para pré-processamento de dados (remoção de palavras irrelevantes e limpeza de dados), usei pacotes Python de nltk; em relação à extração de recursos (este deve ser um ponto-chave, pois está vinculado à próxima etapa, ou seja, usando um classificador para prever a classe - 1 ou 0), encontrei dificuldades em entender qual saída devo esperar da codificação para ser capaz de usar as informações acima como entradas no meu modelo (onde o destino é chamado de rótulo e é um valor binário). Estou usando como classificador a regressão logística, mas também o SVM.
Minha saída esperada, no caso do usuário X com 16 anos, símbolo #, nota Wonderful e note red (new joiner), seria uma classificação como falsa com uma certa porcentagem.
Eu agradeceria se alguém pudesse me explicar, passo a passo, a maneira de transformar meu dataset em um dataset cujas variáveis posso usar dentro de uma regressão logística para determinar o rótulo (falso ou não falso) de novos usuários.
Respostas
Você terá que usar uma combinação de processamento de texto e uma codificação dinâmica. A coluna de texto não deve ser tratada como uma codificação one-hot, pois tentará criar uma nova variável para cada frase única no conjunto de dados, o que será muito (e não muito útil para o aprendizado). O vetorizador de texto resumirá a coluna de texto com base no tipo de palavras / tokens que aparecem nela.
Portanto, você deve usar um vetorizador de texto para processar apenas a coluna de texto primeiro. Isso lhe dará um quadro de dados (digamos A). Este quadro de dados terá colunas correspondentes a tokens / palavras no conjunto de dados. Portanto, se o vetorizador de texto pegar 100 palavras únicas, você terá um quadro de dados de tamanho 1000x100. Observe que essas 100 colunas foram geradas apenas pelo vetorizador de texto.
Para símbolos e notas, você pode usar a codificação one-hot, que fornecerá outro quadro de dados (digamos B). Então você deve unir A & B na chave comum para obter seu quadro de dados final se for inserido. A chave comum aqui será o ID da linha (embora leia o seguinte comentário sobre a agregação de dados no nível do usuário).
Não está claro se a coluna do nome do usuário (Conta) é exclusiva nos dados? Se houver 1000 linhas, mas apenas 400 usuários, isso significa que pode haver mais de 1 linha por usuário. Nesse caso, você pode considerar agregar os dados no nível do usuário (para coluna de texto, você pode simplesmente concatá-los para o mesmo usuário).