Este documento é uma cópia desta página do Notion
Link para o site com o modelo funcional
- Entendimento do negócio
- Uma música é composta por vários elementos, dentre eles, melodia, instrumentação, letra, ritmo, etc.
- Os seres humanos conseguem processar os estímulos de uma música, e diferenciá-los, de maneira muito rápida e eficiente, e, com treino, é possível descobrir um gênero musical em questão de segundos
- Uma música sempre tem um gênero, e um gênero tem várias músicas, porem, para se classificar uma música, são utilizados diferentes fatores dependendo do contexto, podendo ser classificada por motivos: históricos, culturais, dependendo do contexto da região, da instrumentação, ritmo, melodia, e finalmente, a letra
- Com a contextualização acima, é difícil definir um modelo que consiga processar todas essas informações e devolver o gênero correto, seria necessário utilizar diferentes métodos de processamento de dados, e procurar mais afundo como classificar músicas em diferentes gêneros.
- Para a primeira fase desde projeto, irei desenvolver um sistema simples, que classifica as músicas utilizando somente a letra (dado primariamente fornecido no dataset).
- Em futuras fases do projeto, posso adicionar ao conjunto de dados e possíveis features, dados que são minerados a partir do processamento de áudio, como taxa de cruzamento de zeros (Zero Crossing Rate), centróide espectral (Spectral Centroid), Rolloff Espectral(Spectral Rolloff) e outros.
- Entendimento dos dados
- O dataset é bem simples, contendo apenas uma coluna (letra), e separado por gêneros musicais. Sendo assim, podemos unir tudo em um dataset que contenha uma coluna letra, e uma coluna gênero, que serão respectivamente features e alvo.
- A primeira coluna, (lyric), contem um conjunto de palavras, sendo então, um conjunto de dados não estruturados. Tendo que se utilizar nela NLP para transforma-lá em um conjunto de dados utilizáveis no modelo. Este processo é complexo, pois existem diferentes maneiras de se limpar textos, e, cada caso necessita de limpezas especificas
- já a coluna de gêneros, é somente uma coluna de classificação com 4 possíveis valores, que atualmente são palavras, podendo ser transformada futuramente em 4 colunas binárias, ou, transformar as palavras em valores únicos, e normaliza-las
- Todos os gêneros tem o mesmo numero de colunas (800) (sem a remoção dos dados duplicados, depois deste processo, o dataset ainda continua bem uniforme, tendo variância máxima de 10 rows), facilitando processamento e separação de dados para treino e teste
- Preparação dos dados
-
A limpeza da primeira coluna, para a utilização do método de extração do texto se resume em retirar caracteres que podem atrapalhar a conversão para vetorização, como pontuações, duplos espaços e caracteres como '\n'
-
Para o processamento da primeira coluna (texto), utilizarei o método de TF-IDF para a extração, os documentos foram limpos utilizando a pipeline padrão de NLP, mais a remoção de acentos, e caracteres especiais
A pipeline padrão de NLP consiste em:
- Tokenizacão: Nesta etapa transformei meu documento em um array de palavras (ou um array de frases, mas, neste caso, utilizei o de palavras), para isso utilizei o método word_tokenize da biblioteca nltk
- Remoção de Stop words: Nesta etapa utilizei o conjunto de palavras fornecidas pela biblioteca nltk para remover as stop words dos documentos
- Stemming: Nesta etapa utilizei o método RSLPStemmer para fazer a stemmização das palavras em português, este método tambem pertence à biblioteca nltk
- Normalização do texto: Acabei por não utilizar este método no processamento dos dados, tanto por dificuldade de implementação, quanto por ter atingido uma acurácia significativa sem o mesmo
-
Também foi testado o processamento através de Doc2Vec, porem a acurácia foi bem menos significativa (0.36)
-
- modelo
- Foram testados dois modelos diferentes, regressão linear e Random Forest
- O modelo de regressão logística se saiu bem nos primeiros testes, a escolha desse modelo foi devida a necessidade de predizer um de 4 valores diferentes. Também este modelo foi escolhido por lidar melhor com os dados transformados pelo TF-IDF, ele atingiu uma acurácia de 85% e um score F1 de 0.85
- O modelo de random forest, sem nenhum parâmetro, atingiu uma acurácia de 82%
- Com as declarações acima, para esta primeira versão, o modelo escolhido para a fase de tunning de hyperparametros e possivelmente para o deploy da ferramenta foi a regressão linear
- avaliação
- Para a avaliação do modelo, foi utilizados acurácia, pois o dataset era uniforme, e os resultados não tinham pesos diferentes
- também foi utilizado um k-fold com k = 5, pois 5 variações já dão uma precisão maior, e não tem um tempo tão grande de processamento
- Implantação
- Para a implantação do modelo, foi utilizado o framework Flask, em REST. O modelo é bem simples, tendo apenas uma rota, em método post, os dados são trafegados em formato JSON para atender as demandas do React e por ser de fácil acesso
- Já o Front-End, foi feito em React, pela possibilidade de se criar um SPA.
análise exploratória do conjunto de dados de forma descritiva
Por mais que tenha sido um projeto complicado, e tenha passado muito tempo pesquisando e resolvendo erros, o projeto parece promissor.
A falta de Insights, e de conhecimento sobre NLP, levou o projeto à ser um MVP. Com futuras correções e mais pesquisa, talvez seja possível atingir mais de 90% de acurácia
https://www.kdnuggets.com/2018/11/multi-class-text-classification-doc2vec-logistic-regression.html
https://github.com/dipayandutta93/Music-Genre-Classification-using-lyrics
https://www.scielo.br/scielo.php?script=sci_arttext&pid=S0104-65002008000300002
https://www.mariofilho.com/as-metricas-mais-populares-para-avaliar-modelos-de-machine-learning/
http://cursos.leg.ufpr.br/ML4all/apoio/reamostragem.html#validação_cruzada_k-fold
https://medium.com/ensina-ai/usando-machine-learning-para-limpeza-de-dados-d995e565ea1e