Usando um EEG comercial para testar o dataset em algoritmos de classificação

Anapaulasandes
6 min readOct 10, 2021

Um bom desafio para quem já está na trilha de machine learning é encontrar datasets que te deixem curioso e se relacione com seus interesses. É relativamente fácil encontrar datasets prontos para consumo de modelos. Se por um lado isso poupa um grande tempo e te ajuda a focar no “que importa”, por outro, acabamos não sujando muito a mão com os dados, não entendendo bem como eles chegaram a ser como são, e, por fim, podendo chegar a conclusões que poderiam estar completamente erradas — dependendo de como o dataset foi ou não foi coletado.

Photo by Markus Spiske on Unsplash

Depois do discurso advogando a favor de sujar as mãos com o processo de coleta de dados de vez em quando, vou contar o que fiz para coletar dados e criar um dataset que fosse próximo aos meus interesses (no caso, neurociência e computação), usando um equipamento comercial de coleta de ondas cerebrais, com o objetivo inicial de observar se conseguiria uma boa acurácia em algum modelo de classificação.

Equipamento de Coleta

O equipamento em questão é feito pela Neurosky, adquirido na Amazon.com.br e se chama Mindwave Mobile 2. Custou cerca de 3 mil reais (comprado no início desse ano), o que é relativamente barato quando comparado com o preço de um EEG com 16+ elétrodos (Obs: agradecimento especial para os fundos de apoio a pesquisa da Universidade de Brasília).

Funciona em Windows, Macos e Linux. A coleta, no meu caso, funcionou melhor em Windows e Linux. No Macos não consegui passar do ponto de identificação da porta de conexão com o bluetooth — então não consegui realizar a coleta de dados (apesar de copiar a porta sugerida em alguns fóruns).

Mindwave Mobile 2 — Neurosky

No site da Neurosky você consegue encontrar diferentes aplicativos que podem ser conectados com o aparelho, mas a própria conexão com o computador pode ser um caminho tortuoso. Para contornar a dificuldade que tive em encontrar um aplicativo que salvasse os dados em uma tabela, tive que procurar por bibliotecas especializadas que pudessem ajudar na missão.

Existem muitos repositórios no github com ótimos códigos para a missão (alguns exemplos: https://github.com/robintibor/python-mindwave-mobile, https://github.com/SinanGncgl/Brain-Computer-Interface-with-Neurosky/blob/master/NeuroPy2.py) — o último, utilizado no projeto.

Código

O aparelho coleta as informações sobre:

  • attention
  • meditation
  • rawValue
  • delta
  • theta
  • lowAlpha
  • highAlpha
  • lowBeta
  • highBeta
  • lowGamma
  • midGamma
  • poorSignal
  • blinkStrength

O que transformei em colunas a serem salvas em um .csv com o nome do participante e atividade realizada, deixando-o com uma cara mais ou menos assim:

Vista do Dataset no Command do Matlab

Bom, o processo foi o seguinte:

  • Conectar computador com o Mindwave Mobile (bluetooth, somente)
  • Identificar a porta COM de saída da conexão com o Mindwave Mobile
  • Importar biblioteca para coletar dados do Mindwave
  • Criar objeto Neurosky com a porta COM de saída
  • Iniciar objeto
  • Definir uma frequência de coleta e janela (1 coleta por segundo por 600 segundos)
  • salvar informações em um dicionário
  • passar o dicionário para dataframe
  • salvar dataframe como .csv

Algo mais ou menos assim:

import timedef build_dataframe(nome, neurobj, atividade, path):my_dict = {}atividade_list = []nome_list = []index_list = []attention_list = []meditation_list = []rawValue_list = []delta_list = []theta_list = []lowAlpha_list = []hightAlpha_list = []lowBeta_list = []highBeta_list = []lowGamma_list = []midGamma_list = []poorSignal_list = []blinkStrength_list = []atividade_list= []for i in range(10):nome = nome_list.append(nome)atividade = atividade_list.append(atividade)now = datetime.datetime.now()index_list.append(now.strftime(“%d-%m-%Y %H:%M:%S”))attention_list.append(neurobj.attention)meditation_list.append(neurobj.meditation)rawValue_list.append(neurobj.rawValue)delta_list.append(neurobj.delta)theta_list.append(neurobj.theta)lowAlpha_list.append(neurobj.lowAlpha)hightAlpha_list.append(neurobj.highAlpha)lowBeta_list.append(neurobj.lowBeta)highBeta_list.append(neurobj.highBeta)lowGamma_list.append(neurobj.lowGamma)midGamma_list.append(neurobj.midGamma)poorSignal_list.append(neurobj.poorSignal)blinkStrength_list.append(neurobj.blinkStrength)time.sleep(1)my_dict[‘index’] = index_listmy_dict[‘participante’] = nome_listmy_dict[‘atividade’] = atividade_listmy_dict[‘attention’] = attention_listmy_dict[‘meditation’] = meditation_listmy_dict[‘rawValue’] = rawValue_listmy_dict[‘delta’] = delta_listmy_dict[‘theta’] = theta_listmy_dict[‘lowAlpha’] = lowAlpha_listmy_dict[‘highAlpha’] = hightAlpha_listmy_dict[‘lowBeta’] = lowBeta_listmy_dict[‘highBeta’] = highBeta_listmy_dict[‘lowBeta’] = lowGamma_listmy_dict[‘midGamma’] = midGamma_listmy_dict[‘poorSignal’] = poorSignal_listmy_dict[‘blinkStrength’] = blinkStrength_listtoday = date.today()my_date = today.strftime(“%d_%m_%Y”)data = pd.DataFrame(my_dict)data.to_csv(path + “\\” + str(nome_list[0]) + “_” + str(atividade_list[0]) + “_” + my_date + “.csv”)return data 

Target

A coleta foi feita com duas pessoas (não indicado, melhor que seja a mesma pessoa para limitar variáveis fora as do estudo) praticando duas atividades diferentes. Como nesse primeiro momento a ideia era puramente analisar a possibilidade dos dados passarem bem por modelos de classificação, aproveitei o namorado que jogava lolzinho ao lado pra colocar o equipamento na cabeça dele (pesquisador que não botou os amigos pra jogo que atire a primeira pedra). Fiz o código com a ideia de coletar 600 segundos de dados, e fiz a mesma coisa comigo — só que eu estava simplesmente navegando na internet por 600 segundos.

Mini Análise Exploratória

Algumas perguntas importantes foram inicialmente deixadas para um segundo momento, tais como:

  • como o fabricante definiu as frequências de banda?
  • qual a frequência mínima de captura de dados? (descobri que se não usar um time.sleep(1), eu teria dados repetidos para cada uma das informações.
  • O que caracteriza a meditação? e a atenção?

Entre outras. Conforme for explorando mais o problema, planejo escrever mais sobre os desafios encontrados. Para não deixar uma mini análise exploratória de lado, fiz alguns gráficos de curiosidade e um pairplot também (enorme, então omitido aqui).

Histograma de Atenção

Enquanto minha atenção parecia não concentrar em um pico só, a do meu namorado ficou com pico em aproximadamente 50. Considerei “fair enough” que eu tivesse menos atenção do que o namorado, dado as atividades. Lógico que, assim como mencionado no início deste artigo, a interpretação fica danificada por falta de informação sobre como exatamente os dados são coletados e definidos (mas as mãos já estão sujas de dados!)

A meditação teve muitos valores sobrepostos (o que me deixou meio perplexa, considerando a violência com a qual meu namorado aperta o mouse dele no lol e o que eu entendo por meditação). Já em termos de correlação, podemos observar uma forte correlação entre midGamma e theta — de 73%).

Finalmente, modelagem

Os modelos aqui foram feitos da forma mais rápida possível: automaticamente em Orange e MATLAB. Esta parte é a principal do projeto e levará uma boa dose de tempo e dedicação para navegar, mas nesse momento só quis jogar tudo no orange e observar os resultados.

Com um dataset inicial de 1200 linhas, 2 possíveis classificações a serem preditas (lol e navegando na internet), pouca parametrização, chegamos aos seguintes resultados:

Acho que vai dar!

Conclusão

Ainda existe muito a ser explorado a respeito de como o fabricante coleta os dados, existem questões sobre a localização do eletrodo, limpeza de ruído, entre outras. Mas uma modelagem rápida pareceu indicar a possibilidade de uso do dataset para algoritmos de classificação, cabendo ainda analisar se realmente foram as diferentes atividades que levaram às diferentes informações capturadas (exemplo: se fosse eu jogando lol). Mas os resultados me pareceram promissores no sentido que foram mais acertivos que uma jogada de moeda, e também que pude trabalhar com dados de eletroencefalograma (quão acertivos são, fica para um outro momento).

Além disso, consegui imaginar mais formas de integrar o aparelho a outras atividades, e devo estar também adicionando um novo equipamento na mistura nos próximos datasets: captura de movimentação ocular.

Para finalizar:

O trabalho que fazemos com prazer cura a canseira que dele mesmo advém. — William Shakespeare

Obrigada por ler e se sinta a vontade para comentar ❤ com certeza tenho muito a melhorar e sugestões são bem-vindas :D

--

--

Anapaulasandes

Bióloga, Neurocientista, Cientista de Dados, Mestranda em Engenharia Biomédica com Interesse em Neurociencia Computacional