Realizar análises em bases de dados utilizando os recursos de GPU muitas das vezes pode ser considerado um método complementar para aumentarmos a performance na manipulação, tratamento e treinamento dos dados, ainda mais quando nossa base possuir milhares de linhas conforme o problema do case que estarei apresentando.
Para realização desse case de classificação estarei simulando um cenário mais próximo da realidade, que muitas das vezes será manipulando os dados em arquivos contendo uma quantidade muito grande de registros e que talvez para um manuseio convencional não seja o mais indicado.
Neste case estarei analisando uma base de dados contendo informações sobre fraudes bancárias, essa base contém mais de 1 milhão de linhas em um arquivo de 500MB que para manipulação utilizando o recurso padrão que é CPU (processador) apresentou problemas de desempenho em determinados tratamentos que necessitavam de alto processamento.
Para utilização dos recursos de GPU (placa de vídeo) em analises de dados é necessário que nosso computador possua o hardware instalado, dentre algumas outras especificações de uso, no caso de utilizarmos ambientes virtuais, necessitaremos apenas que o serviço utilizado possua a opção de GPU para habilitação. No ambiente do Colab onde geralmente faço minhas analises, existe a possibilidade e opção de usarmos o processamento pela GPU da própria máquina virtual, para isso necessitamos apenas alterar a configuração do notebook para o item (T4 GPU):
Após realizar a alteração, podemos analisar as informações do recurso GPU habilitado utilizando o comando (!nvidia-smi) na própria linha de execução dos códigos:
Ponto de atenção importante: Para o uso dos recursos da GPU que usei nos códigos de Machine Learning desse desafio, é necessário a utilização de bibliotecas específicas que foram desenvolvidas e projetadas especificamente para suportar esse recurso, para um melhor aprofundamento nesse assunto aconselho verificarem as informações no site do próprio desenvolvedor (Rapids): https://rapids.ai/#quick-start
Para conseguirmos prosseguir utilizando os recursos de GPU e das bibliotecas para analise da base de dados em GPU será necessário realizar instalação dos recursos na máquina virtual, o primeiro passo é utilizar o comando abaixo para instalação dos pacotes:
!git clone https://github.com/rapidsai/rapidsai-csp-utils.git
!python rapidsai-csp-utils/colab/pip-install.py
Após instalação dos pacotes utilizaremos as bibliotecas (cudf ) e (cuml) para rodarmos os códigos de Machine Learning em GPU, essas bibliotecas são necessárias para conseguirmos utilizar o processamento da GPU, já que elas foram desenvolvidas especificamente para este contexto:
Os códigos das biblioteca (cuml) se assemelham muito aos da biblioteca do sklearn, porém eles foram projetados para suportar e ativar o processamento das GPU, já que as bibliotecas convencionais não conseguem utilizar e/ou habilitar o processamento das placas GPU, geralmente as bibliotecas convencionais usam apenas o recurso da CPU das máquinas.
Finalizando esse processo seguiremos com os procedimentos de feature engineering na base dados, porém ao invés de carregarmos o arquivo pelo pandas (pd.read_csv) precisamos carrega-lo pelo (cudf.read_csv):
Observação: Conseguimos analisar o tempo de processamento dos dados utilizando o comando (%%time) na primeira linha de cada célula de código, em alguns casos eu estarei utilizando o comando, mas não estarei focando em mostrar o tempo gasto de processamento das linhas por não estar utilizando um modelo em CPU para fazer comparação. Caso desejarem ver essa diferença, aconselho utilizaremos as duas formas GPU x CPU comparando o tempo gasto em cada um dos processos para a mesma linha de código/algoritmos.
Como citado no início, a base de dados em tratamento contém uma quantidade de mais de 1.700.000 milhões de linhas, porém utilizando o modo em GPU meu tempo de processamento estará levando apenas milésimos/segundos em quase todas as etapas de manipulação dos dados, o maior tempo que ocorreu na base foi apenas na instalação das bibliotecas pela (Rapids) que chegou a ser de 04 minutos:
Seguindo o procedimento de feature engineering a parte de analisar os dados nulos é algo essencial em qualquer base de dados, no caso da base que estava analisando obtive o retorno de apenas algumas colunas com registros nulos (algo bem raro):
Neste caso foi até fácil para identificar os valores que estavam em uma única linha e de excluí-los da base em análise:
Outro procedimento que podemos analisar em nossa base após tratamento é se existe linhas duplicadas para exclusão usando o comando (drop_duplicates):
Observação: Como estava utilizando o processamento por GPU o comando levou apenas 26.4 milésimos para execução, se fosse em um caso de uso de processamento por CPU o procedimento poderia levar de segundos a minutos para passar por toda base de dados, devido a quantidade de linhas que temos.
Nesse caso meu retorno não obteve itens duplicados:
Para fazer analise gráfica e obter melhor entendimento, realizei a renomeação da categoria (type) que é a única coluna categórica de interesse na base de dados:
Base de dados após alteração das variáveis:
Análise gráfica dos 05 tipos de transações realizada na base de dados:
Removendo as colunas categóricas que não serão utilizadas, para evitar a necessidade de tratamento:
Após o procedimento de tratamento dos dados, que no caso necessitou de poucas tratativas devido a base de dados está bem completa, seguimos com o procedimento de separação dos dados em treino e teste, excluindo primeiro nosso target (isFraud) da base de dados e atribuindo-o em uma variável de teste (y):
Observação: Existe várias formas de separar os dados de treino e teste, nesse case fiz de uma forma diferente para analisar se também chegaria ao mesmo resultado, nesse exemplo deixei as variáveis explicativas no dataset para fazer os tratamentos de normalização e encoding separadas do target que já estava com saídas binárias, não sendo necessário tratamento.
Transformação da coluna com variáveis categóricas usando o (LabelEncoder):
Realizando o processo de normalização das variáveis explicativas:
Observação: Este processo de normalização é necessário para deixar os valores em escalas numéricas próximas um dos outros, isso evita que valores discrepantes façam as analises ter pesos desbalanceados. Como no caso de uma análise de dados financeiros existe a possibilidade de possuir outliers, será sempre indicado analisarmos qual das opções disponíveis de normalização é a mais apropriada ao problema. Neste case em questão optei por usar a função (Normalizer) da sklearn, porém hoje possuo mais conhecimento e sei que essa não foi a melhor opção realizada na minha análise, por isso devemos continuar sempre pesquisando sobre as ferramentas que temos disponíveis para uso.
Valores após normalização (valores gerados pelas novas colunas):
Após normalização dos valores, vamos prosseguir separando os dados em treino (X), porém pegando apenas os itens que foram normalizados e criados nas novas colunas:
Observação: Este procedimento de treino também foi feito de uma forma diferente, como citado antes, existem várias formas de chegar aos mesmo resultado em uma análise, e neste case optei e fazer dessa forma para testar como seria o resultado.
Para finalizar a análise, utilizei dois modelos de classificação, sendo a Regressão Logística e a Random Forest, ambas sendo utilizadas pela biblioteca (cuml) possuindo sua performance atribuída ao processamento de GPU.
Análise do modelo de Regressão Logística:
Avaliação das métricas de aprendizado utilizando a acurácia e matriz de confusão:
Observação: Neste modelo de regressão podemos observação uma acurácia alta, porém uma matriz de confusão que não conseguiu localizar os registros de (Fraude) devido ao alto desbalanceamento que temos entre os valores de “Fraude” e “Não Fraude”. Esse problema ocorre quando temos uma base de dados que possui muito mais registro de um tipo do que outro, nesses casos podemos optar em usar procedimentos para fazer o balanceamento de dados, ou seja, gerar novos registro (duplicados ou aleatórios) dessa classe menor a modo de reduzir o desbalanceamento e melhorar as analises dos algoritmos. Temos que ter atenção nesse tipo de procedimento, pois em um caso de análise de fraudes conforme o dataset, não seria uma ação muito indicada aumentar registros “Fraude”, pois trata-se de dados com grande peso no negocio e que podem afetar analises precisas, então para este case a melhor ação é testar outros modelos de Machine Learning.
Devido ao problema citado com a Regressão Logística, optei em realizar outra análise usando o Random Forest, que também está disponível no (cuml).
Análise do modelo Random Forest:
Avaliação das métricas de aprendizado utilizando a acurácia e matriz de confusão:
Observação: Neste exemplo também tivemos uma acurácia bem alta devido ao desbalanceamento, porém obtivemos um retorno bem melhor sobre a matriz de confusão, que conseguiu identificar itens como “Fraude” onde o modelo anterior não havia identificado.
Para finalizar, podemos analisar também a probabilidade dos itens serem fraudes ou não pelo procedimento (predict_proba):
Observação: Quanto mais próximo o número da coluna estiver de “1” mais perto da probabilidade de pertencer a essa classe ele está, ou seja, mais próximo da coluna (0) seria “Não Fraude” e da coluna (1) os “Fraude”.
Para continuar buscando melhorar as analises podemos utilizar outros modelos, como o XGboost por exemplo, que é bem indicado para esse tipo de problema devido a grande capacidade que ele possui de classificação e desempenho.
Este artigo foi elaborado de forma a apresentar as possibilidades que temos de usar recursos da GPU para as nossas análises em Machine Learning, para esse tipo de biblioteca possuímos uma quantidade menor de recursos disponíveis, por esse motivo optei em realizar uma análise mais simples e rápida, tentando apresentar apenas o conhecimento que obtive com o uso da ferramenta em uma análise de dados proposta para um desafio acadêmico. Como informado em publicação anterior, utilizo esse espaço apenas para expandir o meu conhecimento de forma prática e de modo a ajudar que tem interesse em crescer e se desenvolver na área de Data Science.
Felipe Amorim
Referência de Estudo: https://somostera.com/