Script in the Stars: Preveja seu futuro com Tensorflow e MongoDB Charts
Avalie esse Tutorial
As meninas estão passando por isso. De situações de fim de navios, a dramas de grupos de amigos, a pequenos incômodos (como meus pacotes sendo roubados e depois devolvidos), parece que o mês de julho foi agitado, para dizer o mínimo, para mim e praticamente todos com quem conversei.
Todas as sessões de hangout nas últimas semanas terminaram com: "I don’t know what’s going on, but something is in the air!" Bem, e se algo não estiver no ar, mas sim nas estrelas?
Vamos usar TensorFlow e MongoDB Charts para analisar seis meses de dados do horóscopo e descobrir se esses contratempos são apenas uma questão de sorte ou se estão realmente inscritos em nosso destino.
Neste tutorial, usaremos o aprendizado de máquina para realizar a análise de sentimentos em um conjunto de dados de horóscopos, o TensorFlow para criar e treinar um modelo usando esse conjunto de dados para ver se as coisas melhorarão em um futuro próximo e o MongoDB Charts para ajudar a visualizar nossos dados ao longo do caminho.
Antes de começarmos a descobrir nosso futuro, Go primeiro examinar algumas das plataformas importantes usadas neste tutorial.
O TensorFlow é uma biblioteca de código aberto que os desenvolvedores podem usar para realizar todo o tipo de tarefas de machine learning. Ele foi desenvolvido pelo Google Brain e é usado por desenvolvedores e cientistas de dados para uma infinidade de projetos, como processamento de linguagem natural, reconhecimento de imagem, reconhecimento de voz e muito mais. O TensorFlow nos permitirá criar e treinar nosso modelo de aprendizado de máquina para nos informar se os horóscopos são positivos ou negativos, o que significa que podemos ter mais informações sobre horóscopos passados e futuros.
O MongoDB Charts é uma ferramenta dentro do MongoDB Atlas que permite aos desenvolvedores visualizar facilmente os dados armazenados em suas collection. A melhor parte do Charts é que ele permite que os usuários vejam visualizações em tempo real à medida que seus bancos de dados mudam e evoluem. Isso é ideal para o nosso projeto, pois nos ajudará a entender e visualizar melhor nossos dados à medida que avançamos no tutorial.
Para ter sucesso neste tutorial, você precisará de:
- Um entendimento básico do TensorFlow (e uma disponibilidade para aprender mais!).
- MongoDB Compass baixado localmente.
Depois que seu cluster MongoDB Atlas for criado, estamos prontos para começar. Nossos objetivos para este tutorial são usar um modelo pré-treinado para gerar rótulos para nosso conjunto de dados e, em seguida, treinar um modelo do zero usando nosso conjunto de dados rotulado. Tenha isso em mente enquanto lê!
Para economizar nosso tempo, raspei todos os legoshoróscopos diários de 28 de janeiro de 2024 a (e incluindo) 28 2024 para todos os zodativos 12 e os salvei em um arquivo com a data, o nome do zodativo e o próprio hexadecimal. Essas datas foram escolhidas porque são de cerca de seis meses antes da criação deste tutorial.
Certifique-se de ter baixado o arquivo
anaiya-six-months-horoscopes.csv
da Kaggle em seu ambiente.Após o download do arquivo, quando aberto, ele ficará assim:
Quando você tiver seu conjunto de dados em mãos, poderemos descobrir o sentimento de cada horóscopo usando a análise de sentimento!
A análise de sentimento é uma forma de descobrir o tom emocional de um texto. Estamos apenas classificando nossos horóscopos como positivos ou negativos. Não vamos nos preocupar com nenhum que seja neutro.
Felizmente para nós, neste momento do tutorial, não precisamos criar um modelo (ainda!). Podemos usar um modelo pré-treinado para descobrir se nossos horóscopos dos últimos seis meses são positivos ou negativos.
Primeiro, especifique suas importações. A mais importante em questão é a biblioteca
transformers
da Hugging Face. Essa biblioteca inclui vários modelos pré-treinados que podem ajudar a descobrir a classificação de texto:Depois que tudo for importado, vamos escolher qual modelo pré-treinado queremos usar. Como este é um tutorial do TensorFlow, podemos ir em frente e usar o modelo "distilbert-base-uncased-finetuned-sst-2-english", pois ele é compatível com o TensorFlow, mas há muitas opções disponíveis para escolher se você quiser substituí-lo.
No código abaixo, estamos carregando nosso modelo pré-treinado e os pré-treinados
tokenizer
, config
e model
de nossa biblioteca transformers
. Otokenizer
converte nosso texto em IDs, config
contém todas as nossas informações de configuração e model
é nosso modelo pré-treinado carregado com TensorFlow. Em seguida, escrevemos uma função para encontrar o sentimento do nosso texto, pegando o texto e tokenizando-o e, em seguida, encontrando a probabilidade do sentimento usando a funçãosoftmax
. Então, a maior probabilidade é categorizada e salva.Aqui, apenas para testar e garantir que o modelo estava funcionando corretamente, copiei um horóscopo que está no espectro negativo.
Isso é ótimo! Como podemos ver, esse horóscopo de Capricórnio é de fato negativo, e pudemos usar nosso modelo pré-treinado para classificá-lo.
Mas, agora precisamos fazer algumas mudanças porque não queremos colocar todos os horóscopos manualmente como strings individuais. Queremos:
- Use esse modelo pré-treinado, coloque em nosso arquivo
.csv
todos os nossos horóscopos e descubra a análise de sentimento de cada horóscopo em nosso arquivo. - Incorpore uma nova coluna de "sentimento" que incluirá 1 se o horóscopo for positivo e 0 se o horóscopo for negativo.
Estamos fazendo isso para que, quando chegarmos à parte em que construímos nosso modelo real, possamos usar um novo arquivo com dados de horóscopo e análise de sentimento para treinar nosso modelo em um conjunto completamente novo de horóscopos em que nosso modelo não foi treinado.
Primeiro, vamos escrever uma função para aplicar cada sentimento aos nossos horóscopos:
Agora, precisamos carregar nosso arquivo
anaiya-six-months-horoscopes.csv
. Para fazer alterações em nosso dataframe, vamos primeiro instalar a bibliotecapandas
.Leia em nosso arquivo:
Quando aplicamos cada sentimento, temos que nos certificar de que temos uma coluna para mantê-los:
Nossa última etapa para esta parte é salvar nosso novo dataframe em um novo arquivo csv. Sinta-se livre para nomeá-lo o que quiser. Estou apenas nomeando
anaiya-six-months-horoscopes-sentiment.csv
:Se você estiver usando o Colab, verá o novo arquivo salvo no lado esquerdo da tela:
Se abrirmos, veremos que uma nova linha de sentimentos foi incorporada com 1s para horóscopos positivos e 0s para horóscopos negativos.
Go ao MongoDB Compass, carregar nosso arquivo
.csv
e, em seguida, visualizar nossos dados no MongoDB Charts, antes de usarmos esses dados para treinar e testar um modelo usando o TensorFlow.Não é necessário usar o MongoDB Compass nesta etapa para escrever em seus dados, mas ele nos salva algumas linhas de código, então se você o tiver baixado localmente, fique à vontade para usá-lo.
Certifique-se de que ele foi baixado localmente e que você importou com sucesso seus dados para um novo banco de dados e collection. Vamos usar a mesma collection para o MongoDB Charts, então isso é muito importante.
Depois de importados, clique na aba "Charts " na parte superior do painel do MongoDB Atlas e selecione sua fonte de dados.
Podemos personalizar exatamente como queremos ver nossos dados. Optei por colocar nosso sentimento no eixo Y e nossos zodíacos no eixo X. Em seguida, cliquei em "Subset " para ver a distribuição.
Vamos dar uma olhada mais de perto no nosso gráfico recém-desenvolvido:
Então, nesse gráfico, podemos ver que há muito mais horóscopos positivos em nosso conjunto de dados do que negativos, e se criarmos outro gráfico para mostrar esse valor, isso é o que vemos:
Podemos ver que existem 1,614 herócopos positivos e 582 heróscopos negativos. Esta é realmente uma ótima notícias - significa que as estrelas não estão contra todos nós! Também podemos ver que Peixes e Leão estão prosperando nos últimos seis meses, enquanto Escorpião está sendo prejudicado (desculpe, Escorpião!).
Isso nos dá uma ótima visão de como nosso conjunto de dados está distorcido, pois é crucial visualizá-lo antes de treinar um modelo para garantir que ele esteja equilibrado e que nosso modelo esteja aprendendo corretamente.
Pela nossa visualização, fica claro que nosso conjunto de dados está desequilibrado, o que significa que teremos de Go por algumas etapas para garantir que estamos alimentando nosso modelo com um conjunto de treinamento adequado. Mais informações sobre isso abaixo na seção "Balance dataset ".
Agora que temos uma ideia dos dados em questão, vamos começar a treinar e testar nosso modelo no TensorFlow.
Estamos usando esse conjunto de dados para treinar e testar nosso modelo para ver se incorporamos novos horóscopos (por exemplo, um horóscopo semanal que não está em nosso conjunto de dados treinado) e podemos ver se eles são positivos ou negativos.
Primeiro, vamos importar nosso hub TensorFlow:
Podemos então carregar nosso novo arquivo
.csv
, mas só precisamos nos concentrar nas colunas que queremos usar, que são "horoscope " e "sentiment ":Nossa próxima etapa é dividir nosso conjunto de dados de sentimentos em três conjuntos separados. Precisamos de um conjunto de treinamento, um conjunto de validação e um conjunto de teste. Antes de podermos fazer isso, porém, precisamos garantir que nosso conjunto de dados esteja equilibrado!
Equilibrar nosso conjunto de dados é necessário, pois precisamos ter certeza de que nosso modelo é treinado na mesma quantidade de horóscopos negativos e positivos. Caso contrário, nosso modelo pode ser treinado apenas em horóscopos positivos e não aprenderá a reconhecer horóscopos negativos.
Primeiro, vamos misturar nosso conjunto de dados usando essa linha simples:
Agora, dividamos nossas colunas em variáveis X e Y:
Teremos que importar algumas bibliotecas úteis para que possamos conseguir isso, especialmente porque estamos conduzindo o Random Under Sampling, já que há mais horóscopos positivos do que negativos. O Random Under Sampling nos permite remover horóscopos aleatórios da classe majoritária (ou da classe do horóscopo positivo) para garantir que tenhamos uma distribuição mais igualitária de horóscopos positivos e negativos com os quais o modelo possa aprender.
Depois de concluído, vamos verificar se temos o mesmo número de horóscopos negativos e positivos em nosso conjunto de treinamento:
Ambos têm 495! Isso é fantástico.
Como nosso conjunto de dados agora está balanceado, podemos dividir nosso conjunto de dados em nossos três conjuntos separados para nosso modelo TensorFlow. Mais uma vez, eles são nosso conjunto de treinamento, nosso conjunto de validação e nosso conjunto de teste. Você pode dividi-lo em qualquer porcentagem que desejar, mas é recomendável fazer uma divisão de treinamento 80% e uma divisão de conjunto de validação 20%.
Vamos ver rapidamente os tamanhos de cada conjunto apenas para ter certeza de que estamos satisfeitos com a distribuição:
Agora, e essa parte é muito crucial para a próxima seção, precisamos combinar nossos
X_test
e y_test
de volta a um dataframe para que os rótulos de nossas colunas estejam de volta no lugar para quando convertermos para um conjunto de dados do TensorFlow, como eram removido ao equilibrar:Depois de executar isso, podemos seguir em frente.
Agora, vamos converter nossos dataframes em conjuntos de dados do TensorFlow para que possamos carregá-los corretamente em nosso modelo.
Ele converte cada conjunto de dados de treinamento, validação e teste em um conjunto de dados do TensorFlow e, em seguida, embaralha tudo novamente e agrupa os dados para você!
Fiz algumas alterações, mas, se estiver usando um conjunto de dados diferente, sinta-se à vontade para incorporar suas próprias alterações.
Apenas para verificar e garantir que tudo tenha sido ativado pelo TensorFlow, vamos escrever uma linha para ver como é o nosso
train_data
:Pareço ótimo! Agora, queremos incorporar e construir nosso modelo.
A camada de incorporação que usaremos é do TensorFlow Hub. Você mesmo pode fazer essa etapa manualmente, mas não precisa reinventar a roda! Podemos fazer isso com duas linhas simples:
Lembre-se de que o
trainable=True
garante que essas camadas também sejam habilitadas junto com o restante do modelo que estamos construindo abaixo.Essa camada de incorporação converte nosso texto em incorporações para que o modelo entenda melhor, já que as máquinas não entendem texto — apenas números. Como estamos usando a camada "nnlm-en-dim50/2", estamos apenas produzindo incorporações 50 dimensionais para palavras em inglês.
Agora, podemos começar a construir nosso modelo TensorFlow de rede neural. Queremos que várias camadas aqui sejam construídas usando o modelo Sequential, pois é uma forma de empilhar as camadas uma a uma, além de ser o modelo mais fácil de entender e visualizar. Também usaremos camadas Dropout, pois é uma boa maneira de evitar o ajuste excessivo, que pode desviar o modelo e fornecer resultados imprecisos.
Vamos usar três camadas de dropout com 40%, 30% e 20%, o que significa que essa porcentagem de neurônios de nossas redes neurais será descartada aleatoriamente, ou definida como zero, para que o modelo possa se tornar mais ajustado nos dados.
Decidi colocar três camadasDensediferentes, pois elas extraem e aprendem padrões e recursos complexos dos vetores de incorporação e os passam para a próxima camada.
Em nossa camada de saída, usamos
sigmoid
como nossa função de ativação, pois ela sempre retorna um valor entre 0 e 1, o que a torna perfeita para a análise de sentimentos.Vamos compilar e depois executar nosso modelo:
Estou usando uma taxa de aprendizado de 0.0001, porque alterar sua taxa de aprendizado altera a frequência com que os pesos do seu modelo mudam para realmente otimizar o desempenho do seu modelo, mas você pode usar a taxa de aprendizado que fizer mais sentido para seu caso de uso. Normalmente, é um número baixo entre 0 e 1 e influencia a rapidez com que o modelo aprende. Sem dúvidas, jogue com a taxa de aprendizado e veja os resultados.
Depois que nosso modelo for compilado, podemos treiná-lo com base em nossos dados de treinamento enquanto usamos os dados de validação para verificar e ver o desempenho do modelo em dados inéditos após cada época (uma única passagem por todo o ciclo de treinamento):
Podemos aprender muito sobre nosso modelo com os resultados. Aqui, podemos ver que nossa perda diminuiu de 66% para 47%, enquanto nossa perda de validação diminuiu de 68% para 59%. Também podemos ver que nossa precisão passou de 60% para 89%, enquanto nossa precisão de validação aumentou de 60% para 69%.
Portanto, é ótimo que tenhamos diminuído nossa perda de treinamento e nossa perda de validação. Uma diminuição na perda de treinamento significa que o modelo está melhorando com base nos dados de treinamento, enquanto uma diminuição na perda de validação significa que o modelo está generalizando bem com base nos dados não vistos.
A precisão da validação em 69% é boa, mas para melhorar esse número, provavelmente precisaríamos de mais épocas, um conjunto de treinamento maior, mais camadas, etc. Divirta-se ajustando e vendo seus resultados com essas mudanças!
Vamos avaliar rapidamente nosso modelo em nosso conjunto de dados de teste e verificar a perda e a precisão gerais:
Aqui, podemos ver que nossa perda é bastante alta em 59%, enquanto nossa precisão é 69%. Como nosso conjunto de dados é relativamente pequeno e usamos apenas cinco épocas, isso é honestamente esperado, e devemos nos concentrar no fato de que nossa precisão de validação tem aumentado a cada época e sua perda tem diminuído.
Go em frente e ver se agora podemos usar nosso modelo para prever o sentimento de horóscopos invisíveis!
Para que nossa função preveja um novo horóscopo, precisamos fazer algumas coisas: converter nossa string do horóscopo em um tensor que o TensorFlow possa entender. Precisamos que nosso modelo faça uma predição em que ele retornará uma probabilidade.
Com base nessa probabilidade, ele nos dirá se o novo horóscopo é positivo ou negativo.
Obter a predição a partir da probabilidade acabou sendo a parte mais difícil, mas isso pode ser feito facilmente com
tf.squeeze
.Podemos fazer isso dessa forma:
Parece que nosso modelo está devidamente ajustado para entender o sentimento positivo e negativo. É importante observar aqui que os horóscopos devem ser vagos. É raro encontrar um horóscopo totalmente negativo ou totalmente positivo. Portanto, espera-se que um conjunto de dados treinado em horóscopos provavelmente gire em torno do 0. Limite 5, já que muitos horóscopos são criados para serem interpretados.
Agora podemos Go em frente e verificar se as coisas vão melhorar para nós daqui para frente! Para esta parte, salvei o próximo horóscopo semanal em www.horoscope.com para todos os 12 signos do zodíaco. Você pode encontrá-los no arquivo
new-week-horoscope2.csv
, também no meu Kaggle.Vamos executá-los através do nosso modelo e ver a saída:
Agora, vamos salvá-lo no MongoDB no mesmo banco de dados que criamos no início do nosso tutorial, mas em uma nova collection, para que possamos usar o MongoDB Charts para visualizar nossos novos horóscopos:
Primeiro, instale
pymongo
:Agora, podemos nos conectar ao nosso cluster MongoDB Atlas e escrever em nossos dados:
Nossos horóscopos estão salvos! Go visualizá-los.
Depois de fazer um gráfico de nossos horóscopos da nova semana, parece que todos terão uma ótima semana, exceto Câncer e Peixes. Não podemos todos ser vencedores.
Neste tutorial, realizamos uma análise de sentimento em nosso arquivo
.csv
para descobrir se nossos horóscopos eram positivos ou negativos. Em seguida, criamos um novo arquivo.csv
que incluía nossa análise de sentimento para alimentar um modelo doTensorFlow para que ele pudesse prever com precisão o sentimento de horóscopos que não tinha visto antes e, em seguida, usamos esse modelo treinado para prever nossos horóscopos daqui para frente. Ao longo do caminho, utilizamos o MongoDB Charts para visualizar nossos dados de uma maneira divertida!Este tutorial foi superdivertido de criar e espero que todos tenham aproveitado para lê-lo. Meu maior conselho ao trabalhar com modelos do TensorFlow e, especialmente, ao treinar e criar seus próprios, é garantir que seu conjunto de dados esteja equilibrado e mudar as coisas durante o ajuste fino. Eu também recomendo se você estiver usando seus próprios dados para garantir que seu conjunto de dados seja grande o suficiente. Isso foi originalmente feito em apenas três semanas de horóscopos e os resultados não foram ótimos. Para o modelo em si, você pode brincar com as camadas, a taxa de desistência, a taxa de aprendizado e até mesmo o número de épocas. Lembre-se também de que, se você estiver reorganizando e reequilibrando seus dados de treinamento, seus resultados variarão cada vez que você executar seu modelo. Boa sorte!
Construindo e testando seu modelo: Para entender como construir e treinar meu modelo, assisti a este vídeo de freeCodeCamp.org e usei algum código de esqueleto desses Docsdo TensorFlow.
Balanceamento do conjunto de dados: Para obter ajuda sobre como equilibrar seu conjunto de dados, dê uma olhada neste recurso do Medium e neste recurso do Semaphoreci.
Principais comentários nos fóruns
Ainda não há comentários sobre este artigo.