clusterizaÇÃo de anÚncios e modelo de classificaÇÃo...
TRANSCRIPT
CLUSTERIZAÇÃO DE ANÚNCIOS E MODELO DE
CLASSIFICAÇÃO PARA AJUSTES DE LANCE EM
LEILÕES DO GOOGLE ADS
Rodrigo Gonçalves Haddad
Projeto de Graduação apresentado ao Curso de
Engenharia Eletrônica e de Computação da Escola
Politécnica, Universidade Federal do Rio de
Janeiro, como parte dos requisitos necessários à
obtenção do título de Engenheiro.
Orientador: Flávio Luis de Mello
Rio de Janeiro
Agosto de 2020
iii
Declaração de Autoria e de Direitos
Eu, Rodrigo Gonçalves Haddad CPF 118.005.027-45, autor da monografia
“CLUSTERIZAÇÃO DE ANÚNCIOS E MODELO DE CLASSIFICAÇÃO PARA
AJUSTES DE LANCE EM LEILÕES DO GOOGLE ADS”, subscrevo para os devidos
fins, as seguintes informações:
1. O autor declara que o trabalho apresentado na disciplina de Projeto de
Graduação da Escola Politécnica da UFRJ é de sua autoria, sendo original em
forma e conteúdo.
2. Excetuam-se do item 1. eventuais transcrições de texto, figuras, tabelas,
conceitos e ideias, que identifiquem claramente a fonte original, explicitando as
autorizações obtidas dos respectivos proprietários, quando necessárias.
3. O autor permite que a UFRJ, por um prazo indeterminado, efetue em qualquer
mídia de divulgação, a publicação do trabalho acadêmico em sua totalidade, ou
em parte. Essa autorização não envolve ônus de qualquer natureza à UFRJ, ou
aos seus representantes.
4. O autor pode, excepcionalmente, encaminhar à Comissão de Projeto de
Graduação, a não divulgação do material, por um prazo máximo de 01 (um) ano,
improrrogável, a contar da data de defesa, desde que o pedido seja justificado, e
solicitado antecipadamente, por escrito, à Congregação da Escola Politécnica.
5. O autor declara, ainda, ter a capacidade jurídica para a prática do presente ato,
assim como ter conhecimento do teor da presente Declaração, estando ciente das
sanções e punições legais, no que tange a cópia parcial, ou total, de obra
intelectual, o que se configura como violação do direito autoral previsto no
Código Penal Brasileiro no art.184 e art.299, bem como na Lei 9.610.
6. O autor é o único responsável pelo conteúdo apresentado nos trabalhos
acadêmicos publicados, não cabendo à UFRJ, aos seus representantes, ou ao(s)
orientador(es), qualquer responsabilização/ indenização nesse sentido.
7. Por ser verdade, firmo a presente declaração.
_________________________________________
Rodrigo Gonçalves Haddad
iv
UNIVERSIDADE FEDERAL DO RIO DE JANEIRO
Escola Politécnica – Departamento de Eletrônica e de Computação
Centro de Tecnologia, bloco H, sala H-217, Cidade Universitária
Rio de Janeiro – RJ CEP 21949-900
Este exemplar é de propriedade da Universidade Federal do Rio de Janeiro, que
poderá incluí-lo em base de dados, armazenar em computador, microfilmar ou adotar
qualquer forma de arquivamento.
É permitida a menção, reprodução parcial ou integral e a transmissão entre
bibliotecas deste trabalho, sem modificação de seu texto, em qualquer meio que esteja
ou venha a ser fixado, para pesquisa acadêmica, comentários e citações, desde que sem
finalidade comercial e que seja feita a referência bibliográfica completa.
Os conceitos expressos neste trabalho são de responsabilidade do(s) autor(es).
v
AGRADECIMENTO
Agradeço não só às pessoas que fizeram parte diretamente na criação desse
projeto, mas também às pessoas que participaram da minha jornada durante a graduação
e na minha vida, em geral.
Primeiramente aos meus pais e outros familiares por todo o apoio e carinho. Sem
eles, eu nunca teria tido a oportunidade de mudar de cidade para estudar engenharia. Em
especial, a minha mãe Marta que sempre me apoiou e foi um porto seguro para mim em
todos os momentos de dificuldade.
As minhas amizades que me acompanham desde o jardim de infância e também
às que fiz durante a graduação.
A Pareto por ter me agregado tanto conhecimento em tão pouco tempo e por
contribuir com este trabalho das mais diferentes formas.
Por fim, aos professores que impactaram positivamente minha vida durante a
graduação com conhecimento e demonstrando verdadeira vontade de ensinar.
vi
RESUMO
A transição do marketing tradicional para o digital possibilitou um maior
controle dos anunciantes sobre qual segmento seu anúncio seria mostrado de acordo
com seu objetivo, maior aquisição de dados resultantes da exibição dos anúncios e
entrega em massa de anúncios personalizados. Ao mesmo tempo, passaram a ser
necessárias ferramentas que facilitassem e contribuíssem para um melhor controle do
administrador de uma conta de anúncios como o Google Ads. Nesse escopo, devem ser
estudadas formas que identifiquem padrões nas características de anúncios e possíveis
predições que possam ser feitas, tendo acesso a um histórico. Logo, este trabalho
procura analisar grupos de anúncios dividindo-os em clusters de acordo com suas
características e, posteriormente, a criação de um modelo que seja capaz de fazer ajustes
de lances em leilões de anúncios de acordo com os segmentos possíveis dentro de um
cluster. Dessa forma, um lance para veiculação de um anúncio pode ter seu valor
ajustado, de acordo com o aprendizado do algoritmo, para, por exemplo, aumentar em
20% os lances quando os anúncios forem direcionados a uma pessoa de 18 a 24 anos.
Para alcançar esse objetivo, foram escolhidos os métodos K-means, para o aprendizado
não supervisionado, e XGBoost classificador, para o supervisionado. Ao final da
aplicação do XGBoost, busca-se analisar os resultados para finalmente apontar a
confiabilidade da aplicação do modelo.
Palavras-Chave: marketing, marketing digital, Google Ads, cluster, classificação,
predição, leilão, lances, aprendizado de máquina, Python, K-means, XGBoost, métricas,
anúncio, campanha, grupo de anúncios.
vii
ABSTRACT
The transition from traditional marketing to digital made possible a better
control from the advertisers over which segment their ad would be shown according to
their objective, larger acquisition of data and mass delivery of personalized ads. At the
same time, turned out to be necessary the creation of tools to facilitate and contribute to
a better control of an ad account as Google Ads. Therefore, it should be studied ways to
identify ads’ characteristics patterns and potential predictions that could be done when
having access to the account’s history. This project seeks to analyze ad groups splitting
them into clusters according to their characteristics and, posteriorly, the creation of a
model capable of making bid adjustments on ads auctions for each possible segment
inside a cluster. Therefore, a bid to deliver an ad may have its value adjusted according
to the model’s learning conclusion to, for example, rise 20% the bids when the ads are
targeted to people between 18 and 24 years old. To reach this goal, were chosen the
methods K-means, for unsupervised learning, and XGBoost classifier for supervised
learning. After applying the classification model, the results are analyzed in order to
point if the model was reliable or not.
Key-words: marketing, digital marketing, Google Ads, cluster, classification,
prediction, auction, bid, machine learning, Python, K-means, XGBoost, metrics, ad,
campaign, ad group.
viii
SIGLAS
CPC – Custo Por Clique
CPV – Custo Por Visualização
CTR – Click Through Rate
CPM – Custo por Mil Impressões
XGBoost – Extreme Gradient Boost
GBM – Gradient Boosting Machine
GBRT – Gradient Boosted Regression Tree
Impr. (Abs. Top)% - Porcentagem de Impressões Absolutas no Topo
Impr. (Top)% - Porcentagem de Impressões no Topo
OHE – One Hot Encoder
PCA – Principal Component Analysis
RMSE - Root-Mean-Square Error
WCSS – Within Cluster Sum of Squares
ix
Sumário
1 Introdução 1
1.1 - Tema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2 - Delimitação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3 - Justificativa . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4 - Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.5 - Metodologia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.6 - Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2 Fundamentação Teórica 6
2.1 - Conceitos de Marketing Digital aplicados a uma conta de
anúncios . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
6
2.2 - Estrutura de Dados de um Grupo de anúncios do Google Ads 11
2.3 - Algoritmos de Clusterização . . . . . . . . . . . . . . . . . . . . . . . . . 11
2.4 - Algoritmos de Classificação . . . . . . . . . . . . . . . . . . . . . . . . . 12
3 Implementação 15
3.1 - Tratamento de dados para clusterização . . . . . . . . . . . . . . . . 15
3.2 - Busca pelo número de clusters . . . . . . . . . . . . . . . . . . . . . . . . . 16
3.3 - Clusterização . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.4 - Modelo básico para comparação . . . . . . . . . . . . . . . . . . . . . 19
3.5 - Tratamento de dados para classificação . . . . . . . . . . . . . . . . . 20
3.6 - Classificação . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
21
x
3.7 - Análise dos resultados da classificação . . . . . . . . . . . . . . . . . . 22
4 Conclusões
31
xi
Lista de Figuras
1.1 – Diagrama de blocos do método seguido no projeto . . . . . . . . . . . . . . . . . . . . 4
2.1 – Divisão do mercado de anúncios digitais . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.2 – Divisão e subgrupos das campanhas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 – Demografia e dispositivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.4 – Comparação entre algoritmos de classificação . . . . . . . . . . . . . . . . . . . . . . . . 14
3.1 – Resultado do Elbow Method . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
3.2 – Gráfico de cluster com três clusters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.3 – Gráfico de cluster com cinco clusters . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
3.4 – Árvore de decisão de segmentação por renda . . . . . . . . . . . . . . . . . . . . . . . . 23
3.5 – Árvore de decisão de segmentação por aparelho . . . . . . . . . . . . . . . . . . . . . . 24
3.6 – Gráfico de importância de feature de segmentação por idade . . . . . . . . . . . . 25
3.7 – Gráfico de importância de feature de segmentação por gênero . . . . . . . . . . . 25
3.8 – Gráfico de importância de feature de segmentação por renda . . . . . . . . . . . . 26
3.9 – Gráfico de importância de feature de segmentação por aparelho . . . . . . . . . . 27
3.10 – Gráfico de pontos de segmentação por idade . . . . . . . . . . . . . . . . . . . . . . . . 28
3.11 – Gráfico de pontos de segmentação por gênero . . . . . . . . . . . . . . . . . . . . . . . 28
3.12 – Gráfico de pontos de segmentação por renda . . . . . . . . . . . . . . . . . . . . . . . . 29
3.13 – Gráfico de pontos de segmentação por aparelho . . . . . . . . . . . . . . . . . . . . . 30
xii
Lista de Tabelas
3.1 – RMSE obtido de acordo com segmentação e estratégica . . . . . . . . . . . . . . . . 19
3.2 - Segmentações e suas possíveis categorias . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.3 – Menor média RMSE de teste obtida . . . . . . .. . . . . . . . . . . . . . . . . . . . . . . . . 22
3.4 – RMSE em segmentação por idade . . . . . . .. . . . . . . . . . .. . . . . . . . . . . . . . . . 35
3.5 – RMSE em segmentação por gênero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
3.6 – RMSE em segmentação por renda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
3.7 – RMSE em segmentação por aparelho . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
1
Capítulo 1
Introdução
1.1 – Tema
De modo geral, trata-se inicialmente da clusterização para visualização de
grupos de anúncios com características similares. Neste sentido, o problema concreto a
ser resolvido é a melhor visualização de como os anúncios de uma conta se relacionam,
permitindo escolhas de estratégias diferenciadas para lidar com cada grupo.
Num segundo momento, será aplicada uma classificação para predição dos
ajustes de lance. Os lances são quanto um anunciante está disposto a pagar para que
certo grupo de anúncios seja veiculado. Os ajustes de lance, por sua vez, são variações
aplicadas nos lances para que esses sejam maiores, ou menores, para categorias
específicas dentro de um segmento, como, por exemplo, um ajuste de lance para
aumentar em 20% o lances quando esses anúncios forem direcionados para pessoas
acessando através de um tablet. Portanto, dessa vez, os pontos a serem atingidos são:
melhor embasamento e segurança ao serem determinados os ajustes de lance e menor
carga de trabalho direcionada a microgerenciamento de conta por conta de ajustes em
vários anúncios.
1.2 – Delimitação
Atualmente, a demanda vem principalmente de administradores de conta de
Google Ads que precisam fazer vários ajustes de lance em diversas contas com
embasamento.
O projeto não contempla todos as plataformas que distribuem anúncios pela
Internet. Os dados utilizados são provenientes de uma conta de Google Ads, logo, o
projeto se delimitará a fazer análises somente dessa plataforma. Pretende-se que o
modelo resultante seja generalizável, ou seja, seja aplicável para outras contas e outros
2
anúncios com as mesmas características, porém o resultado precisa ser testado a fim de
confirmar essa possibilidade. Por fim, para verificar se o resultado esperado foi
alcançado, o modelo será aplicado na conta em que os dados foram consumidos com
melhor e/ou igual desempenho ao que é feito atualmente.
1.3 – Justificativa
Controlar os lances nos leilões numa conta de anúncios é importante, pois é
imprescindível favorecer o aparecimento dos anúncios para o melhor público
segmentado, em detrimento de aparecem para outros grupos que não fariam o mesmo
aproveitamento. Do ponto de vista da organização proprietária da conta, é importante
que o investimento seja direcionado a onde o retorno seja maior, logo, cabem ajustes de
lances positivos para segmentos que respondem bem aos estímulos, da mesma forma
que ajustes negativos são dados para segmentos que não estão oferecendo resposta
aceitável.
É interessante para o administrador da conta fazer ajustes de acordo com sua
estratégia e de acordo com o desempenho do anúncio. O administrador deve também
estar atento a todas as opções demográficas e dispositivos que suportam um anúncio de
lance diferenciado. Nesses casos, o administrador precisa fazer os ajustes manualmente
e procurar embasamento no histórico da conta e situação atual. Por ser um trabalho
manual, repetitivo e inteligente, está muito suscetível a erros humanos. Nesse contexto,
é interessante o uso de uma inteligência artificial que faça ajustes de lances com maior
embasamento e segurança.
Neste projeto, inicialmente, será discutida uma forma de divisão dos anúncios
em grupos para adoção de estratégias parecidas para gerenciar os que possuem
características semelhantes. Após isso, a atenção será voltada para uma proposta de
ajustes de leilão dados fazendo-se uso de classificação.
1.4 – Objetivos
O objetivo do projeto é entregar uma análise de grupos de anúncios divididos em
grupos e múltiplas inteligências artificiais treinadas em Ad Groups com características
3
diferentes, identificados através da clusterização, e de tipos de campanhas diferentes
(display, search, video). A inteligência artificial deverá ser capaz de fazer ajustes de
lances coerentes de acordo com as métricas providas. Por fim, os modelos serão
comparados com tecnologias utilizadas atualmente no mercado a fim de verificar sua
precisão. Desta forma, os objetivos específicos são:
• Análise da plataforma (Google Ads) a fim de escolher a melhor forma de
visualização de dados para serem exportados para planilha.
• Pesquisa e planejamento para escolha dos algoritmos de clusterização e
classificação que tenham melhor potencial para chegarem próximos a uma
solução para o problema.
• Escrita do código a ser utilizado na clusterização e classificação.
• Escrita do código de modelo base para comparação.
• Tratamento dos datasets.
• Treinamento e aplicação dos algoritmos.
• Análise dos resultados obtidos.
4
1.5 – Metodologia
Figura 1.1 – Diagrama de blocos do método seguido no projeto. Os mesmos
dados são exportados em formatos diferentes para serem usados na clusterização e
classificação, porém, servem a um mesmo propósito.
O trabalho será desenvolvido utilizando-se de uma conta de Google Ads ativa há
dois anos. Na Figura 1.1, foi esquematizado de forma macro, em um diagrama de
blocos, as partes da metodologia: os modelos, suas entradas e saídas.
Após a extração e preparação dos dados de grupos de anúncios da conta, será
feita a clusterização K-means dos grupos de anúncios existentes, a fim de identificar ad
groups com características similares para que posteriormente sejam utilizados nos
mesmos modelos.
A partir da clusterização, os grupos de anúncios escolhidos terão os dados
exportados separadamente por demografia e dispositivo. De posse dos dados, as
planilhas terão os dados tratados a fim de serem utilizados para o aprendizado do
modelo.
O modelo será escrito utilizando uma classificação XGBoost. Após, o modelo
aprenderá com os dados exportados separadamente por demografia e dispositivo. Esse
processo será repetido em grupos de anúncios com características diferentes a fim de
levar em conta as diferenças intrínsecas aos objetivos de cada grupo.
5
Na fase final do projeto, será feito um comparativo dos lances dados pelo
modelo com lances dados manualmente a fim de verificar a sua aplicabilidade no
mercado.
1.6 – Descrição
No capítulo 2 será dado um panorama geral sobre marketing digital direcionado
a Google Ads. Serão apresentados os tipos de campanhas, assim como os grupos de
anúncios e anúncios. Também será falado sobre segmentação de público de acordo com
dispositivos e demografia e métricas. Ao final, os métodos de clusterização e
classificação K-means e XGBoost serão abordados e explicados a fim de serem
utilizados para a resolução do problema.
O capítulo 3 apresenta o tratamento dos dados, aplicação dos algoritmos e
análise dos resultados para os métodos propostos para solução do problema.
Primeiramente, será aplicado o algoritmo K-means e posteriormente o XGBoost, a fim
de empregar a clusterização das instâncias no trabalho de divisão dos datasets para o
aprendizado no XGBoost.
Na conclusão, são abordados problemas encontrados durante o estudo a
aplicação do modelo nos dados disponíveis. São observados os pontos positivos e
negativos da estratégia de clusterização seguida por classificação e também é feita uma
breve proposta para continuação do projeto e sua transformação em produto.
6
Capítulo 2
Fundamentação Teórica
2.1 – Conceitos de Marketing Digital aplicados a uma conta de
anúncios
A principal diferença entre o marketing digital e marketing tradicional é que o
primeiro utiliza mais intensamente tecnologias digitais que são inerentemente
mensuráveis, permitem conversas personalizadas e facilitam o desenvolvimento de
relacionamentos entre clientes e empresas, ao passo que o último é muito mais
orientado à comunicação de massa [1]. O marketing digital permite personalização de
anúncios entregues em larga escala. Permite também que o anunciante receba feedback
em forma de dados sobre seus anúncios.
São várias as plataformas que possuem o “comércio de anúncio” como sua
principal fonte de receita, são exemplos delas: Google, Facebook, Instagram, LinkedIn,
Bing entre outras. Dentre essas, uma das mais utilizadas é a do Google (Google Ads),
vide Figura 2.1, que entrega anúncios não só dentro da busca do Google, mas também
em outros lugares pela Internet, tais como YouTube e sites diversos.
7
Figura 2.1 – Divisão do mercado de anúncios digitais. Divisão de receita proveniente
de anúncios digitais entre empresas nos Estados Unidos
.
Fonte: disponível em gráficos no eMarketer [15].
Através do Google Ads, é possível criar campanhas de search, display,
shopping, vídeo e app. Campanhas são compostas por grupos de anúncios que
compartilham do mesmo orçamento, público-alvo e outras configurações. No Google
Ads, cada conta pode possuir uma ou mais campanhas e cada campanha pode conter um
ou mais grupo de anúncios,
Campanhas de search permitem que o anunciante escolha palavras-chave
(keywords) que, ao serem buscadas no Google por alguma pessoa, mostrem o anúncio
configurado para aquele grupo de anúncios composto por essas keywords. Esse anúncio,
caso bem configurado e com lance alto, aparecerá como um dos primeiros resultados.
Já as campanhas de display, são responsáveis pelos anúncios visuais compostos
por imagens escolhidas pelo anunciante, que geralmente aparecem nos cantos dos sites
em formato de banner.
Nas campanhas de shopping, anúncios são entregues pelo Google e por outros
sites, porém, diferentemente da campanha de display, há uma mistura de texto e
imagens, com destaque para o preço e o nome da loja.
Já as campanhas de app são focadas em entregar anúncios em mobiles nos
aplicativos do Google, como Youtube, Google Search, Google Play, Discover etc.
8
Pode-se dizer que engloba todos os tipos de campanha, porém de forma direcionada ao
formato mobile, uma vez que é possível entregar, por exemplo, anúncios de vídeo e
shopping em mobiles.
Por outro lado, as campanhas de vídeo são veiculadas principalmente no
YouTube em vídeos isolados, ou embutidos. Esses estão divididos em categorias de
acordo com sua duração e se é possível pulá-los, ou não [2].
Na figura 2.1, estão dispostos os tipos de campanhas e os tipos de anúncios que
podem ser criados dentro de seus grupos. Não são todas as campanhas que suportam
qualquer tipo de anúncio, logo, por conta da disponibilidade de dados, será dado foco às
campanhas de search que possuam anúncios do tipo texto, campanhas de vídeo com
anúncios do tipo vídeo e campanhas de display com anúncios do tipo imagem, ou
responsivo.
Figura 2.2 – Divisão e subgrupos das campanhas. Campanhas podem ser divididas em
search, display, shopping, video ou app, enquanto anúncios podem ser text, responsive,
image, video, product, showcase, ou call-only.
Fonte: criação do autor.
Para pagar pelos anúncios, o anunciante participa de um "leilão" com outros
anunciantes que também estão dispostos a pagar pelo clique naquele ad. É usado o
termo CPC (custo por clique) para denominar o quanto se quer pagar pelo anúncio.
Neste leilão, para saber quem ganhará o direito de exibir o anúncio naquela posição, é
levado em conta o lance, a qualidade do ad e o impacto. Além desses, há também
dependência do capital escolhido para a campanha. Por exemplo; se o capital de uma
9
campanha for de R$50,00, uma vez que um determinado número de leilões seja vencido
alcançando os R$50,00, os anúncios contidos nessa campanha não mais serão entregues.
Nas campanhas de search, o anunciante pode escolher o CPC condicionado ao
grupo de anúncio (ad group), ou à keyword. Nas campanhas de display, é possível
escolher CPC apenas segundo o grupo de anúncio, e não separadamente por ad. Nas
campanhas de vídeo, é usado o termo CPV, uma vez que a contagem é feita por
visualização, onde se entende que uma visualização é alcançada após terem
transcorridos trinta segundos desde o início da exibição, ou o usuário ter interagido com
o anúncio.
Para entregar ads para o melhor segmento possível de acordo com a estratégia
do anunciante, o Google Ads dispõe de dados divididos por demografia (faixa de idade,
gênero, renda e combinação entre esses), aparelhos (tablet, celular, computador e
televisão), localidade (cidade, estado e país) e status parental (pai, ou não). Para melhor
entendimento das subdivisões, consultar figura 2.2. Nessas divisões, é possível ainda
fazer ajustes de lance de acordo com o público-alvo. Por exemplo, se o CPC para
determinado grupo de anúncios for de R$1,00, através de um ajuste de 20% direcionado
ao gênero feminino o anunciante passará a estar disposto a pagar R$1,20 pelo clique
nesse ad por pessoas identificadas como sendo do gênero feminino.
10
Figura 2.3 – Demografia e dispositivos. Os dados podem ser visualizados em diferentes
formatos e, em cada visualização (idade, gênero etc), são subdivididos de acordo com
características.
Fonte: criação do autor.
Em cada anúncio, campanha, ou grupo de anúncio, métricas como impressões,
interações, taxa de interação, custo, custo médio, conversão, custo por conversão e taxa
de conversão são transparentes. As principais delas; impressões correspondem à
quantidade de vezes que o anúncio é entregue, interações indicam a quantidade de vezes
que os anúncios são clicados e conversão que corresponde à quantas vezes determinada
ação é realizada dentro do site do anunciante, são comumente usadas para embasar o
investimento de acordo com a estratégia do anunciante.
Em datas especiais, como Natal, Black Friday e Dia das Mães, nota-se um
aumento na quantidade de anúncios e nos lances. Nessas épocas, e em cerca de até um
mês e meio antes, há a veiculação de anúncios mais personalizados, de acordo com o
tema. Porém, em outras épocas longe dos picos de consumo, é comum a veiculação de
anúncios comuns. Como o anunciante tem a sua disposição dados que revelam o
desempenho do anúncio, é frequente que se disponha de maior capital para campanhas
que alcancem o desempenho desejado, de acordo com as métricas disponíveis. Uma
prática muito aplicada é a de Teste A/B, em que dois anúncios parecidos são colocados
à prova para ver qual tem o melhor desempenho de acordo com suas peculiaridades.
11
Após algum tempo anunciando com o Google Ads, uma rica base de dados é
formada, contendo muitas informações sobre o histórico de investimento da conta.
Além de disponibilizar esses dados em dashboards, o Google Ads também permite que
sejam exportados em formato .xlsx, permitindo análises em larga escala.
2.2 – Estrutura de Dados de um Grupo de anúncios do Google Ads
A estrutura dos dados relevantes de grupos de anúncios exportados de uma conta
e seu tipo, a princípio, é composta por: nome (palavra), tipo (palavra), impressões
(número inteiro), interações (número inteiro), taxa de interação (porcentagem), custo
médio (número decimal), custo (número decimal), conversões (número decimal), custo
por conversão (número decimal), taxa de conversão (porcentagem), clicks (número
inteiro), CTR (porcentagem), CPM médio (número decimal), CPC médio (número
decimal), CPV médio (número decimal), impressões mostradas no topo (porcentagem) e
impressões mostradas acima dos resultados que não correspondem a anúncios
(porcentagem).
Enquanto a estrutura de cada grupo de anúncios é composta por: dia, ajuste de
lance (porcentagem), demografia/dispositivo (palavra), impressões (número inteiro),
interações (número inteiro), taxa de interação (porcentagem), custo (número decimal),
conversões (número decimal), custo por conversão (número decimal), taxa de conversão
(porcentagem), clicks (número inteiro), CTR (porcentagem), CPC médio (número
decimal), CPV médio (número decimal), impressões mostradas no topo (porcentagem) e
impressões mostradas acima dos resultados que não correspondem a anúncios
(porcentagem).
2.3 – Algoritmos de Clusterização
Os algoritmos de clusterização são classificados como aprendizado não
supervisionado, já que a máquina é treinada com observações não rotuladas (sem acesso
à resposta correta); almeja a aprender a identificar padrões e estruturas nos dados
dispostos [3].
12
Esse tipo de algoritmo cria uma nova representação dos dados de forma que seja
de mais fácil explorar a propriedade de localidade de referência de um modelo
matemático. A principal aplicação é para a redução de dimensões, transformando
representações de dados com muitas dimensões para uma representação com menos
dimensões (duas dimensões, em muitos casos), levando em conta os dados mais
importantes [4].
Logo, o objetivo do aprendizado não supervisionado é encontrar clusters nas
entradas semelhantes sem ser dito explicitamente que esses pontos pertencem a uma
classe, ou outra, em específico. Ao algoritmo é dado o desafio de descobrir
similaridades por si só [3]. Desta forma, clusterização é a atividade de particionar um
dataset em grupos, denominados clusters. De modo simples, objetivo é dividir os dados
de forma que os pontos de um mesmo cluster sejam muito similares e os pontos num
outro cluster sejam diferentes [4].
Suponha que se necessita dividir os dados de entrada em k categorias, sendo k
um número conhecido. São alocados k clusters no espaço dos dados para que sejam
posicionados no centro de cada cluster. Porém, não é sabido onde os clusters estão, nem
onde se localizam seus centros. O algoritmo K-means é normalmente aplicado neste
tipo de problema.
Mais especificamente, o algoritmo tem funcionamento dependente de escolhas
de entradas k, k posições aleatórias no espaço de dados e atribuição de centro de clusters
a essas posições. Durante o aprendizado, que se repete até que os centros de cluster
parem de se mover, para cada ponto, computa-se a distância para cada centro de cluster
e atribui-se o ponto ao centro de cluster mais próximo, para cada centro, move-se a
posição do centro para o meio dos pontos desse cluster [3].
Finalmente, durante o uso, para cada ponto de teste, computa-se a distância a
cada centro de cluster e atribui-se o ponto ao cluster cujo centro está mais próximo [3].
2.4 – Algoritmos de Classificação
Os algoritmos de classificação são classificados como aprendizado
supervisionado, uma vez que a máquina é treinada com observações rotuladas
(acompanhadas da resposta correta); aprende a inferir a resposta correta para
observações não rotuladas recebidas posteriormente [3].
13
Há um dataset (training data) que consiste em dados de entrado contendo o dado
alvo, que é a resposta que o algoritmo deverá produzir, no final das contas.
Um problema de classificação consiste em, a partir de vetores de entrada, decidir
a qual classe N eles pertencem, baseado em treinos de cada classe. O ponto mais
importante de um problema de classificação é que ele é discreto; cada exemplo pertence
a exatamente uma classe, e o conjunto de classes cobre todas as possíveis saídas das
amostras. Alguns exemplos podem fugir dessa definição, para eles são aplicados os
classificadores fuzzy, que não são abordados neste projeto [3].O XGBoost é uma
biblioteca de classificação e regressão bastante utilizada, porém antes de apresentá-la é
necessário realizar uma introdução acerca do algoritmo Gradient Boosted Tree (GBRT
OU GBM): esse funciona através da criação de múltiplas árvores de decisão
serialmente, em que cada árvore tenta corrigir a anterior. Nesse algoritmo, a pré-poda é
usada para evitar overfitting. As árvores costumam ser muito rasas, com profundidade
de um a cinco, fazendo com que as predições sejam rápidas e consumam pouca
memória.
A ideia principal por trás do GBRT é combinar múltiplos modelos, nesse
contexto conhecidos como weak learners; como as árvores rasas. Cada árvore só
consegue fornecer boas predições sobre parte dos dados, logo, mais e mais árvores são
adicionadas para melhorar a performance [4].
Os principais parâmetros do GBRT são a quantidade de árvores a serem geradas
e a taxa de aprendizado, que controla quantos erros cada árvore pode corrigir da
anterior. Quanto mais árvores forem geradas, mais complexo será o modelo. De modo a
evitar o overfitting, uma pré-poda mais forte pode ser aplicada, assim como uma
limitação da taxa de aprendizado e da quantidade de árvores [4].
O XGBoost é uma biblioteca open source escalável de machine learning que
deve sua popularidade principalmente às muitas resoluções no Kaggle que aplicaram
seus conceitos. Esse sistema executa muito mais rápido que outras técnicas populares, e
é escalável por conta de otimizações feitas em seu algoritmo [6]. Como pode ser visto
na Figura 2.4, o XGB possui o segundo menor tempo de treinamento ficando atrás
apenas da regressão logística e o maior poder de predição dentre os comparados, em um
conjunto de dados de um milhão de registro com 20 features. Apesar da diferença no
poder de predição entre os dois primeiros ser mínima, o tempo de treinamento do
Gradient Boosting é muito maior.
14
Figura 2.4 – Comparação entre outros algoritmos de classificação. Comparação em
relação a poder de predição e tempo de treino entre XGBoost e outros algoritmos
tradicionais.
Fonte: “XGBoost Algorithm: Long May She Reign!” em Towards Data Science [7].
Dentre as otimizações, as mais notáveis são: a paralelização, pois XGBoost
aborda o processo sequencial de criação de árvores usando paralelização. A poda de
árvore em que o primeiro critério a ser levado em conta para a parada na divisão das
árvores no é o “máximo de profundidade”, de modo que os outros critérios são dados
como secundários. Logo, enquanto no GBM a árvore continuaria se aprofundando por
conta de outros critérios, na XGBoost a árvore já seria podada de acordo com o máximo
dado. Finalmente, a otimização de hardware, que é alcançado através do uso do cache
alocando buffers em cada thread para guardar informações estatísticas calculadas. Além
disso, também faz uso da out-of-core computing, criado para processar dados que sejam
muito grandes para caber na memória principal do computador de uma só vez.
15
Capítulo 3
Implementação
3.1 – Tratamento de dados para clusterização
Uma vez que existe uma maior quantidade de dados disponíveis para grupo de
anúncios do tipo busca (509 grupos), os grupos de anúncios do tipo display (11 grupos)
e vídeo (3 grupos) foram descartados, já que possuem muitas características diferentes
do tipo busca e não poderiam ser clusterizados juntos.
De posse dos dados de ad groups (grupo de anúncios) exportados numa planilha
de Excel (.xlsx), foram retirados os grupos que continham zero na coluna de custo,
porque representam grupos de anúncios que nunca foram veiculados. Após isso,
também foram retirados os grupos que não tinham informação sobre porcentagem de
impressões absolutas no topo da busca (Impr. (Abs. Top)%) e porcentagem de
impressões no topo da busca (Impr. (Top)%) [9].
Impr. (Abs. Top)% diz respeito à quantidade de impressões que ficaram no topo
absoluto da busca do Google, acima dos resultados orgânicos e acima de todos os outros
anúncios, dividido pelo total de impressões. Enquanto isso, Impr. (Top)% representa a
quantidade de vezes que o anúncio apareceu acima dos resultados orgânicos, dividido
pelo total de impressões. Resultados orgânicos correspondem aos resultados que não
representam anúncios; são os resultados da busca que apresentam maior relevância para
o que foi buscado, de acordo com o algoritmo de busca do Google.
Também foram retiradas as colunas que continham dados que são relações de
outros dados já presentes em outras colunas, como CPC (custo por clique). Finalmente,
com 509 ad groups disponíveis com todos os dados de interesse preenchidos.
As colunas restantes para clusterização foram: impressões, interações, custo
médio, custo, conversões, cliques, CPM médio, CPC médio, Impr. (Abs. Top)% e Impr.
(Top)%. A permanência das colunas de CPM e CPC médios não é uma falha, pois não
estão disponíveis colunas de impressões médias e cliques médios, enquanto há colunas
de custo e clique para CPC.
16
3.2 – Busca pelo número de clusters
A divisão das amostras, a princípio seria feita com três, quatro, ou cinco clusters,
pois, dependendo da definição de funil de vendas utilizado, representam a quantidade de
etapas que um cliente passa até fazer a compra. A mais geral delas, a de três etapas,
apresenta as seguintes definições:
Topo de funil: o cliente está em momento de aprendizado. Estão pesquisando e
vendo as soluções para suas dores. Meio de funil: já fizeram sua pesquisa e já estão
cientes do que é capaz de solucionar seu problema, agora só estão filtrando as opções;
buscam informações mais específicas, mesmo ainda não estando prontos para gastarem.
Fundo de funil: já se decidiram e estão confortáveis com sua decisão; estão prontos para
gastar com o produto, ou serviço [8].
Ao invés de escolher o número de clusters de forma aleatório, é melhor aplicar
uma técnica para decidir o número ótimo. Para isso, representa-se em um gráfico a
variação da Soma dos Quadrados Dentro do Cluster (WCSS) em relação à quantidade
de clusters. Tal técnica é denominada técnica do cotovelo e o número de clusters
escolhido é o de quando o aumento de clusters não compensa mais o decaimento do
WCSS e começa a ocorrer o overfitting [14].
Ao aplicar a técnica do cotovelo, claramente o número ótimo de clusters é três
ao se analisar o gráfico na Figura 3.1. Logo, a clusterização foi feita com três e cinco
clusters para fins de comparação e numa tentativa de dissolver o cluster que concentrava
a maioria dos pontos.
17
Figura 3.1 – Método utilizado para prever qual o número ótimo de clusters.
3.3 – Clusterização
Através da PCA, plota-se um gráfico compreensível reduzido a duas dimensões
dos principais componentes responsáveis por caracterizar cada grupo de anúncios, uma
vez que não seria viável fazer uma representação de dez dimensões. Ao plotar os
gráficos, percebe-se, obviamente, a mesma disposição dos pontos no gráfico, porém
com certa diferença no pertencimento dos pontos aos clusters.
Percebe-se também que os pontos se encontram muito concentrados na mesma
área do gráfico. Na clusterização com 3 clusters, o cluster 2 têm muitos pontos dentro
de sua área, enquanto o cluster 1 tem apenas um ponto e o cluster 0 tenha 13 pontos.
Na clusterização com 5 clusters, oito pontos no cluster 2, cinco no cluster 4, um no
cluster 1, trinta e um no cluster 3 e o restante no cluster 0.
O resultado da clusterização não é o esperado pois não reflete as diferentes
características de cada ad group, muito devido ao fato dessas características relativas a
posição no funil de vendas não serem representadas nas métricas disponíveis para
análise.
18
Figura 3.2 - Clusterização reduzida a duas dimensões com três clusters.
Figura 3.3 – Clusterização reduzida a duas dimensões com cinco clusters.
19
3.4 – Modelo básico para comparação
A fim de concluir se a classificação proposta forneceria resultados melhores, ou
não que a base, foram utilizados dois modelos básicos para comparação com a
classificação por XGB a saber: (1) média aritmética; (2) média mediana. Foram
aplicadas as estratégias de média mediana e média aritmética, e logo após, medidas suas
eficácias através do erro médio quadrático (Root-Mean-Square Error, RMSE), cujos
valores podem ser observados na Tabela 3.1.
Essa tabela traz o RMSE médio e o desvio padrão associado obtido aplicando-se
a média aritmética e mediana como predições para os ajustes de lance cinco vezes para
cada segmentação, com os dados de treino e teste sendo redivididos aleatoriamente em
cada uma dessas iterações.
Tabela 3.1 - RMSE médio obtido de acordo com segmentação e estratégia. Aplicadas
médias aritmética e mediana para obtenção dos modelos baseline e extraídos RMSE e
desvio padrão.
Segmentação RMSE
Aritmética
Desvio Padrão
A
RMSE
Mediana
Desvio Padrão M
Idade 0,35928
0,017717 0,369663
0,009194
Renda 0,182831
0,017981
0,187393
0,033945
Gênero 0,317471
0,014519 0,339154
0,031289
Aparelho 0,203412
0,036762
0,218609
0,013262
20
3.5 – Tratamento de dados para classificação
Assim como na clusterização, foram usados dados de ad group de campanhas de
buscas por conta da menor disponibilidade de dados de ad groups de outros tipos
(display, vídeo etc).
Devido à baixa disponibilidade de dados de outros segmentos com ajustes de
lances, o algoritmo foi aplicado a segmentação por idade, aparelho, gênero e renda
familiar. Fora usados dados de lances de diversos ad groups divididos pelas
segmentações presentes na Tabela 3.2. Assim, para cada ad group, todas as categorias
dentro de uma segmentação possuem um ajuste de lance específico.
Tabela 3.2 - Segmentações e suas possíveis categorias. Cada segmento (idade,
renda, etc) é dividido em diferentes categorias.
Idade Renda Gênero Aparelho
18 – 24 50% menores Masculino Computadores
25 – 34 41 – 50% Feminino Celulares
35 – 44 31 – 40% Desconhecido Tablets
45 – 54 21 – 30% Televisores
65+ 11 – 20%
Desconhecido 10% maiores
Desconhecido
Ao fazer a análise do melhor método a ser escolhido para descarte de colunas,
foi observado que, caso aplicado o PCA, não seria possível aplicar uma análise
satisfatória de importância de feature, já que se perderia a referência do que cada
feature representava. Por esse motivo, optou-se por exclusão manual de colunas, já que
eram poucas e fáceis de serem discernidas como relações entre outras.
Foram retiradas as colunas que contivessem dados que são relações de outros
dados já presentes em outras colunas, como CPC (custo por clique) e linhas que
possuíam custo igual a zero. Após o descarte de colunas redundantes, restaram as
21
colunas de campanha, ad group, segmentação, impressões, interações (clicks), custo
médio, custo, conversões, CPM médio, CPC médio e ajuste de lance.
Dessa vez, como os dados estão segmentados por categorias, como visto na
Tabela 3.2, existem muito mais registros do que na abordagem da clusterização.
Finalmente, obtiveram-se quatro planilhas (uma para cada categoria) contendo 391
linhas de dados (renda), 2679 linhas de dados (idade), 1459 linhas de dados (gênero) e
1385 linhas de dados (aparelho). Não foi possível aplicar o modelo para a segmentação
de status parental, pois não possuíam um histórico satisfatório de ajustes de lances:
apenas dados sobre três ad groups com lances ajustes ajustados disponíveis.
3.6 – Classificação
Primeiramente, foi feito uso do One Hot Encoder (OHE) para lidar com as
segmentações das categorias. O OHE permite que colunas que representem
segmentações sejam “quebradas” em n colunas, sendo n categorias, e preenchidas com
0, ou 1, de acordo com a categoria. Após, foi feita a divisão dos dados para treino e para
teste sendo, a cada 10 linhas de dados, 2 para teste e 8 para treino.
Optou-se pelo uso do XGBClassifier ao invés do XGBRegressor, pois a faixa de
valores de ajustes de leilões é finita e discreta; são cerca de 30 possíveis ajustes entre -
100% e +150%. Foram utilizados os parâmetros:
• “objective”: especificação do tipo de aprendizado e objetivo.
• “colsample_bytree”: é a taxa de criação de subamostras de colunas na criação de
cada árvore.
• “learning_rate”: usado para prevenir o overfitting. Depois de cada iteração,
reduz o peso das features para deixar o processo mais conservativo.
• “max_depth”: profundidade máxima de uma árvore. Quanto maior esse
parâmetro, mais provável de acontecer o overfitting.
• “n_estimators”: quantidade de árvores a serem construídas. [13]
A fim de fazer o melhor ajuste dos parâmetros, observou-se o RMSE ao fim de
cada análise de resultados, escolhendo a configuração de parâmetros que alcançassem o
menor RMSE.
22
Os valores utilizados nos parâmetros, de acordo com a segmentação, foram os
seguintes:
• Idade: colsample_bytree = 0.5, learning_rate = 0.3, max_depth = 15, alpha = 10,
n_estimators = 60.
• Gênero: colsample_bytree = 0.5, learning_rate = 0.2, max_depth = 15, alpha =
10, n_estimators = 60.
• Renda: colsample_bytree = 0.5, learning_rate = 0.3, max_depth = 15, alpha =
10, n_estimators = 60.
• Aparelho: colsample_bytree = 0.5, learning_rate = 0.3, max_depth = 15, alpha =
10, n_estimators = 60.
3.7 – Análise dos resultados da classificação
O método k-fold implica em dividir aleatoriamente o dataset em k grupos de
tamanhos aproximadamente iguais. Cada grupo é usado como grupo de teste uma vez,
enquanto o restante é usado como grupo de treinamento. Aplica-se o modelo em cada
grupo de treinamento e posteriormente avalia-se no grupo de teste. A pontuação de cada
uma das comparações é armazenada e utilizada para avaliar o modelo [12].
Na Tabela 3.3 é possível observar o menor RMSE alcançado pelo modelo. Os
menores RMSE’s são alcançados em árvores de maior ordem, logo, como pode ser
observado nas tabelas localizadas no apêndice, as primeiras árvores apresentam RMSE
alto bem mais alto.
Com os parâmetros utilizados, foi possível chegar ao menor RMSE médio de
acordo com as interações de criação de árvore. Na Tabela 3.3 pode ser observado em
qual iteração que o RMSE parou de apresentar diminuição significativa.
Tabela 3.3 – Menor média RMSE de teste obtida. Menores médias RMSE obtidas e o
número da iteração em que aconteceu.
Segmentação Menor RMSE Desvio padrão Iteração
Idade 0,272097 0,002249 27
23
Gênero 0,329853 0,020646 41
Renda 0,120664 0,012460 24
Aparelho 0,186851 0,015882 31
Árvores de decisão podem ser impressas para ver o processo que o modelo
seguiu para chegar em sua decisão final. É possível apresentar qualquer uma das árvores
criadas, porém, decidiu-se apresentar somente a primeira de duas segmentações
diferentes, pois uma árvore sozinha, por si só, não fornece pistas que levem ao valor
alcançado na previsão final. De posse de todas as árvores geradas pelo modelo, é
necessário fazer o somatório dos valores das folhas alcançadas através das decisões para
chegar ao valor almejado.
Figura 3.4 – Primeira árvore de decisão de segmentação por renda.
24
Figura 3.5 – Primeira árvore de decisão de segmentação por aparelho.
A importância da feature revela quão útil e valiosa uma feature foi para a
construção das árvores de decisão dentro do modelo. Desta forma, quanto mais um
atributo for usado nas decisões, maior sua importância.
Uma pontuação é atribuída para a feature a cada árvore criada de acordo com a
melhora que a feature garante ao modelo ao ser aplicada como ponto de divisão.
Finalmente, é feita uma média, para cada feature, das pontuações em todas as árvores
criadas. Os resultados destas pontuações são apresentados nas Tabelas 3.4 a 3.7.
25
Figura 3.6 - Gráfico de importância de feature de segmentação por idade.
Sendo, ordenado de mais importante pra menos importante: f12: CPM médio,
f8: custo médio, f7: impressões, f9: custo, f13: CPC médio, f11: clicks, f10: conversões.
Categorias: f6: desconhecido, f1: 25-34, f0: 18-24, f2: 35-44, f3: 45-54, f5: 65+, f4: 55-
64.
Figura 3.7 - Gráfico de importância de feature de segmentação por gênero.
26
Sendo, ordenado de mais importante pra menos importante: f4: custo médio , f8:
CPM médio, f5: custo, f3: impressões, f7: clicks, f9: CPC médio, f6: conversões.
Categorias: f0: feminino, f1: masculino, f2: desconhecido.
Figura 3.8 - Gráfico de importância de feature de segmentação por renda.
Sendo, ordenado de mais importante pra menos importante: f8: custo médio,
f13: CPM médio, f9: custo, f7: impressões, f11: clicks, f12: CPC médio, f10:
conversões. Categorias: f5: 10% maiores, f4: 50% menores, f0: 11-20%, f1: 21-30%, f2:
31-40%, f6: desconhecido, f3: 41-50%.
27
Figura 3.9 - Gráfico de importância de feature de segmentação por aparelho.
Sendo, ordenado de mais importante pra menos importante: f5: custo médio, f6:
custo, f9: clicks, f4: impressões, f10: CPM médio, f8: conversões, f7: custo. Categorias:
f1: celular, f0: computador, f3: tablet.
O gráfico de comparação é uma ferramenta visual para comparar o lance real
com cada previsão de lance. Em vez de dispor todos os dados em uma tabela muito
extensa, optou-se pela apresentação no gráfico cujo eixo x representa cada grupo de
anúncio e o eixo y, seu ajuste de lance, indo de -100% a +150%.
28
Figura 3.10 - Gráfico de pontos de segmentação por idade. Gráfico de pontos de
previsões e testes de ajustes de lance (segmentação por idade).
A Figura 3.10 apresenta a segmentação por idade, nesse gráfico os lances e suas
predições vão de -90% a +73%. Nessa situação, percebe-se que as predições e os lances
concentram-se na faixa de -40% a +20%, mas com algum valores nos extremos dos
lances.
Figura 3.11 - Gráfico de pontos de segmentação por gênero. Gráfico de pontos de
previsões e testes de ajustes de lance (segmentação por gênero).
29
A Figura 3.11 apresenta a segmentação por gênero, nesse gráfico os lances e
suas predições vão de -62% a +175%. Nessa situação, percebe-se que as predições e os
lances concentram-se na faixa de -50% a +40%.
Figura 3.12 - Gráfico de pontos de segmentação por renda. Gráfico de pontos de
previsões e testes de ajustes de lance (segmentação por renda).
A Figura 3.12 apresenta a segmentação por renda, nesse gráfico os lances e suas
predições vão de -50% a +100%. Nessa situação, percebe-se que as predições e os
lances concentram-se em um único valor: -20%.
30
Figura 3.13 - Gráfico de pontos de segmentação por aparelho. Gráfico de pontos de
previsões e testes de ajustes de lance (segmentação por aparelho).
A Figura 3.13 apresenta a segmentação por aparelho, nesse gráfico os lances e
suas predições vão de -100% a +45%. Nessa situação, percebe-se que as predições e os
lances concentram-se na faixa de -20% a +40%.
31
Capítulo 4
Conclusões
Algumas características do XGBoost não foram aproveitadas; o tamanho do
dataset não é tão grande a ponto de as otimizações feitas pelo modelo fazerem
diferença. Porém, algumas análises provenientes da mesma biblioteca que contém o
modelo são muito diretas e fáceis de serem aplicadas, como as de importância de
feature, visualização de árvore e RMSE após cada etapa de boosting. Em um cenário
que incluísse contas de anúncios diversas aliadas à análise temporal, as otimizações de
desempenho seriam mais úteis.
Para uma análise com um volume ainda maior de dados, poderia ter sido feita
uma análise temporal para cada ad group, a fim de obter mais informações de como o
ajuste de lance variou com o tempo. Porém, não foi feita por conta de ajustes de lances
possivelmente errados; muitos ajustes permaneciam fixos por toda a duração do ad
group. Logo, percebe-se que não necessariamente os lances disponibilizados são os
melhores lances para cada ocasião, pois é necessário levar em conta erros humanos.
Os dados disponibilizados pelo Google são poucos e básicos, não fornecendo
muita informação sobre um ad group. Uma alternativa para contornar essa escassez de
features, seria o enriquecimento de dados através do uso de outras fontes que, por
exemplo, disponibilizassem os valores de conversão, não só a quantidade de
conversões.
Não foi possível ter uma diferenciação clara entre os anúncios a ponto de
formarem clusters bem definidos. Logo, a clusterização que foi feita para melhor dividir
os dados para a classificação acabou não tendo muita serventia. Por outro lado, fazer a
classificação sem subdividir os ad groups em demasia pode ter evitado um overfitting.
De acordo com a comparação ao modelo básico, três segmentações tiveram
resultados satisfatórios, alcançando um RMSE menor do que o comparado. Foi notado
que alguns modelos apresentaram melhora significativa no RMSE de acordo com a
mudança de parâmetros, logo, pode ainda haver espaço para melhora em um ajuste
ainda mais fino dos parâmetros.
Para dar continuidade ao projeto e torná-lo aplicável em escala comercial, é
preciso transformá-lo em produto. Para isso, seria necessário encapsular o modelo numa
aplicação com comunicação com API do Google Ads, “conteinerizar” a aplicação
32
através do Docker e hospedar o container Docker em algum serviço de cloud. No caso
de uma pivotagem mais agressiva da ideia, também é possível criar um modelo que faça
previsões e aprenda em tempo real, gastando dinheiro da conta durante esse processo.
33
Bibliografia
[1] ALKHATEEB, F., CLAUSEN, K., KHANFAR, N. et al., 2008, “Digital marketing:
Legal and regulatory risk associated with Web 2.0 adoption by the pharmaceutical
companies”, Journal of Medical Marketing, v. 8, n. 4, pp. 311-318. Doi:
10.1057/jmm.2008.20
[2] About the Google Search Network, About the Google Display Network, About
Shopping campaigns and Shopping ads, About video campaigns, About App campaigns
. Google Ads Help. Disponível em: <support.google.com>. Acesso em: 09/11/2019.
[3] S. MARSLAND, S. Machine Learning – An Algorithmic Perspective. Segunda
edição. CRC Press, 2015.
[4] MÜLLER, A. C. e GUIDO, S. Introduction to Machine Learning with Python.
O’Reilly Media, 2017.
[5] GÉRON, A. Hands-On Machine Learning with Scikit-Learn and TensorFlow.
O’Reilly Media, 2017.
[6] CHEN, Tianqi; GUESTRIN, Carlos. “XGBoost: A Scalable Tree Boosting System”.
14 folhas. 2016.University of Washington. Doi: 10.1145/2939672.2939785.
[7] MORDE, Vishal. XGBoost Algorithm: Long May She Reign! Towards Data
Science, 2019. Disponível em: <https://towardsdatascience.com/https-medium-com-
vishalmorde-xgboost-algorithm-long-she-may-rein-edd9f99be63d>. Acesso em:
19/01/2020.
[8] Inbound Marketing Sales Funnel. The Foundation of your Modern Marketing Sales
Strategies. Disponível em: <https://www.impulsecreative.com/inbound-marketing-
sales-funnel>. Acesso em 07/03/2020.
34
[9] Imp (abs top) % Column. Search Ads 360 Help. Disponível em
<https://support.google.com/searchads/answer/9329947?hl=en>. Acesso em
07/03/2020.
[10] About top and absolute top metrics. Google Ads Help. Disponível em
<https://support.google.com/google-ads/answer/7501826?hl=en>. Acesso em
07/03/2020.
[11] XGBoost Documentation. XGBoost. Disponível em
<https://xgboost.readthedocs.io/en/latest/index.html. Acesso em 30/05/2020.
[12] JAMES, Gareth; WITTEN, Daniela; HASTIE, Trevor; TIBSHIRANI, Robert. An
Introduction to Statistical Learning with Applications in R. Springer, 2013.
[13] XGBoost Parameters. XGBoost. Disponível em
<https://xgboost.readthedocs.io/en/latest/parameter.html>. Acesso em 20/06/2020
[14] MALKIN, Cory. K-means Clustering Python Example. Disponível em
<https://towardsdatascience.com/machine-learning-algorithms-part-9-k-means-
example-in-python-f2ad05ed5203>. Acesso em 16/08/2020.
[15] US Net Digital Ad Revenue Share, by Company, 2019 (% of total digital ad
spending). eMarketer, Feb 2019. Disponível em
<https://www.emarketer.com/chart/227063/us-net-digital-ad-revenue-share-by-
company-2019-of-total-digital-ad-spending>. Acesso em 16/08/2020,
35
Apêndice
1.Tabelas simplificadas da evolução do RMSE por segmentação
1. train-rmse-mean train-rmse-std test-rmse-mean test-rmse-std 2. 0 0.533365 0.001076 0.533954 0.002650 3. 1 0.435233 0.001136 0.436938 0.003977 4. 2 0.376533 0.001404 0.379931 0.003401 5. 3 0.333202 0.004281 0.339677 0.005342 6. 4 0.306626 0.004035 0.313741 0.002025 7. 5 0.289697 0.002363 0.297125 0.002831 8. 6 0.280286 0.002836 0.288506 0.002233 9. 7 0.274038 0.003031 0.283451 0.002398 10. 8 0.270220 0.003003 0.280209 0.003122 11. 9 0.267390 0.003184 0.278175 0.002858 12. 10 0.265621 0.003877 0.277159 0.002451 13. 11 0.263328 0.003414 0.275757 0.001690 14. 12 0.262311 0.003043 0.274802 0.001444 15. 13 0.260820 0.002220 0.273985 0.001771 16. 14 0.260133 0.002185 0.273616 0.001721 17. 15 0.259521 0.002459 0.273222 0.001736 18. 16 0.259190 0.002570 0.273053 0.001660 19. 17 0.258542 0.002185 0.272852 0.001756 20. 18 0.258256 0.002241 0.272744 0.001768 21. 19 0.257833 0.001903 0.272598 0.001969 22. 20 0.257591 0.001915 0.272507 0.002002 23. 21 0.257462 0.001829 0.272390 0.002129 24. 22 0.257129 0.001598 0.272232 0.002217 25. 23 0.257056 0.001550 0.272157 0.002277 26. 24 0.256933 0.001450 0.272086 0.002260 27. 25 0.256872 0.001406 0.272024 0.002249 28. 26 0.256815 0.001369 0.272029 0.002250 29. 27 0.256801 0.001360 0.272019 0.002249
Tabela 3.4 - Evolução do RMSE de acordo com a árvore na segmentação por idade.
1. train-rmse-mean train-rmse-std test-rmse-mean test-rmse-std 2. 0 0.534312 0.003769 0.535234 0.007207 3. 1 0.472503 0.005060 0.474078 0.008928 4. 2 0.427035 0.006247 0.429695 0.011236 5. 3 0.395316 0.007079 0.399023 0.013508 6. 4 0.372786 0.008307 0.377986 0.014976 7. 5 0.356373 0.007949 0.363518 0.017057 8. 6 0.345438 0.008225 0.353055 0.017633 9. 7 0.338232 0.008888 0.346594 0.018673 10. 8 0.333103 0.009071 0.342094 0.019348
36
11. 9 0.329676 0.009396 0.338790 0.019594 12. 10 0.325435 0.007038 0.336134 0.020617 13. 11 0.323234 0.006445 0.334903 0.021067 14. 12 0.320148 0.004600 0.333846 0.021178 15. 13 0.319161 0.004658 0.333128 0.021243 16. 14 0.317448 0.003460 0.332792 0.021108 17. 15 0.316823 0.003346 0.332351 0.021149 18. 16 0.315954 0.003542 0.331966 0.021251 19. 17 0.315463 0.003622 0.331722 0.021285 20. 18 0.314909 0.003688 0.331453 0.021332 21. 19 0.313624 0.003208 0.330779 0.021330 22. 20 0.312965 0.002482 0.330935 0.021155 23. 21 0.312645 0.002401 0.330725 0.021208 24. 22 0.312255 0.002493 0.330664 0.021224 25. 23 0.311861 0.002481 0.330592 0.021274 26. 24 0.311633 0.002404 0.330507 0.021239 27. 25 0.311257 0.002322 0.330443 0.021104 28. 26 0.310774 0.001858 0.330727 0.020812 29. 27 0.310351 0.001710 0.330613 0.020911 30. 28 0.310308 0.001661 0.330617 0.020910 31. 29 0.310011 0.001659 0.330305 0.020871 32. 30 0.309772 0.001821 0.330145 0.020771 33. 31 0.309652 0.001653 0.330201 0.020694 34. 32 0.309529 0.001610 0.330150 0.020786 35. 33 0.309125 0.001889 0.329890 0.020682 36. 34 0.309125 0.001889 0.329890 0.020682 37. 35 0.309125 0.001889 0.329890 0.020682 38. 36 0.309125 0.001889 0.329890 0.020682 39. 37 0.309120 0.001892 0.329891 0.020683 40. 38 0.309116 0.001894 0.329892 0.020684 41. 39 0.309116 0.001894 0.329892 0.020684 42. 40 0.309116 0.001894 0.329892 0.020684 43. 41 0.309064 0.001924 0.329853 0.020646
Tabela 3.5 - Evolução do RMSE de acordo com a árvore na segmentação por gênero.
1. train-rmse-mean train-rmse-std test-rmse-mean test-rmse-std 2. 0 0.487450 0.002962 0.488435 0.007595 3. 1 0.370773 0.003904 0.372199 0.007553 4. 2 0.288100 0.007409 0.289651 0.008652 5. 3 0.228606 0.005238 0.230528 0.008600 6. 4 0.189857 0.004245 0.193206 0.008971 7. 5 0.163339 0.003574 0.167274 0.008121 8. 6 0.146216 0.003304 0.150996 0.008540 9. 7 0.134633 0.004506 0.140543 0.009750 10. 8 0.128083 0.004749 0.134508 0.009993 11. 9 0.123741 0.004464 0.130584 0.011126 12. 10 0.120413 0.004260 0.127487 0.011766 13. 11 0.117577 0.005331 0.125287 0.011386
37
14. 12 0.116170 0.004915 0.124023 0.011883 15. 13 0.114748 0.005593 0.122942 0.011704 16. 14 0.113939 0.005954 0.122439 0.011667 17. 15 0.113326 0.005564 0.121753 0.012087 18. 16 0.112624 0.005765 0.121264 0.012128 19. 17 0.112624 0.005765 0.121264 0.012128 20. 18 0.112228 0.005890 0.121019 0.012213 21. 19 0.112116 0.005752 0.120904 0.012361 22. 20 0.111876 0.005889 0.120790 0.012398 23. 21 0.111876 0.005889 0.120790 0.012398 24. 22 0.111843 0.005849 0.120755 0.012444 25. 23 0.111722 0.006000 0.120713 0.012396 26. 24 0.111675 0.005943 0.120664 0.012460
Tabela 3.6 - Evolução do RMSE de acordo com a árvore na segmentação por renda.
1. train-rmse-mean train-rmse-std test-rmse-mean test-rmse-std 2. 0 0.380690 0.003976 0.381001 0.007888 3. 1 0.309092 0.004626 0.309578 0.009934 4. 2 0.263405 0.004416 0.264925 0.012636 5. 3 0.236809 0.004893 0.238473 0.013971 6. 4 0.218695 0.007857 0.220849 0.013089 7. 5 0.208011 0.006956 0.210286 0.014873 8. 6 0.200318 0.007395 0.203173 0.015383 9. 7 0.196135 0.007143 0.199262 0.016101 10. 8 0.192313 0.007749 0.195760 0.015539 11. 9 0.189916 0.007288 0.193179 0.015897 12. 10 0.188839 0.007176 0.192301 0.016049 13. 11 0.187861 0.007050 0.191339 0.016040 14. 12 0.186571 0.007090 0.190325 0.016092 15. 13 0.185833 0.007348 0.189890 0.015903 16. 14 0.185343 0.007146 0.189551 0.016117 17. 15 0.184763 0.007031 0.189162 0.016110 18. 16 0.184276 0.007057 0.188669 0.016051 19. 17 0.183758 0.007153 0.188376 0.015991 20. 18 0.183366 0.007170 0.188013 0.015974 21. 19 0.183025 0.007176 0.187791 0.015948 22. 20 0.182732 0.007388 0.187640 0.015855 23. 21 0.182538 0.007338 0.187533 0.015909 24. 22 0.182083 0.007466 0.187324 0.015816 25. 23 0.181897 0.007345 0.187246 0.015855 26. 24 0.181797 0.007279 0.187176 0.015886 27. 25 0.181709 0.007251 0.187107 0.015902 28. 26 0.181464 0.007339 0.186944 0.015880 29. 27 0.181396 0.007270 0.186916 0.015904 30. 28 0.181327 0.007353 0.186896 0.015885 31. 29 0.181327 0.007353 0.186896 0.015885 32. 30 0.181327 0.007353 0.186896 0.015885 33. 31 0.181243 0.007346 0.186851 0.015882
38
Tabela 3.7 - Evolução do RMSE de acordo com a árvore na segmentação por aparelho.
2. Clusterização
1. import matplotlib.pyplot as plt 2. import pandas as pd 3. from sklearn.cluster import KMeans 4. from sklearn.decomposition import PCA 5. import seaborn as sns; sns.set() 6. 7. # Importing the dataset 8. dataset = pd.read_excel('Ad group - standard.xlsx') 9. features = list(dataset.columns)[3:12] 10. data = dataset[features] 11. 12. # Getting the number of clusters 13. wcss = [] 14. for index in range(1, 11): 15. kmeans = KMeans(n_clusters = index, 16. init = 'k-means++', 17. max_iter = 300, 18. n_init = 10) 19. kmeans.fit(data) 20. wcss.append(kmeans.inertia_) 21. plt.plot(range(1, 11), wcss) 22. plt.title('The Elbow Method') 23. plt.xlabel('Number of clusters') 24. plt.ylabel('WCSS') 25. plt.show() 26. 27. # Fitting K-Means to the dataset 28. kmeans = KMeans(n_clusters = 3, init = 'k-
means++', max_iter = 300, n_init = 10) 29. data['Clusters'] = kmeans.fit_predict(data) 30. 31. # Run PCA on the data and reduce the dimensions in pca_num_components dimensio
ns 32. reduced_data = PCA(n_components=2).fit_transform(data) 33. results = pd.DataFrame(reduced_data,columns=['pca1','pca2']) 34. 35. # Visualising the clusters 36. sns.scatterplot(x="pca1", y="pca2", hue=data['Clusters'], data=results) 37. plt.title('K-means Clustering with 3 clusters') 38. plt.show()
39
3. Modelo básico
1. import pandas as pd 2. from sklearn.dummy import DummyRegressor 3. from sklearn.model_selection import train_test_split 4. from sklearn.metrics import mean_squared_error 5. from math import sqrt 6. 7. dataset = pd.read_excel('Device report.xlsx') 8. features = list(dataset.columns)[2:12] 9. data = dataset[features] 10. 11. X, y = data.iloc[:,:-1], data.iloc[:,-1] 12. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) 13. 14. # Create a dummy regressor 15. dummy = DummyRegressor(strategy='median') #median or mean 16. 17. # "Train" dummy regressor 18. dummy.fit(X_train, y_train) 19. y_pred = dummy.predict(X_test) 20. 21. # Get RMSE 22. rmse = sqrt(mean_squared_error(y_pred, y_test)) 23. 24. print(rmse)
4. Classificação
40
1. import pandas as pd 2. from sklearn.compose import ColumnTransformer 3. from sklearn.preprocessing import OneHotEncoder 4. from sklearn.model_selection import train_test_split 5. import xgboost as xgb 6. import matplotlib.pyplot as plt 7. 8. # Importing the dataset 9. dataset = pd.read_excel('Household income report.xlsx') 10. features = list(dataset.columns)[2:11] 11. data = dataset[features] 12. 13. # Aplying one hot encoder to segment 14. ct = ColumnTransformer(transformers=[('encoder', OneHotEncoder(), [0])], 15. remainder='passthrough') 16. data = ct.fit_transform(data) 17. 18. # Splitting into training set and test set 19. X, y = data[:,:-1], data[:,-1] 20. data_dmatrix = xgb.DMatrix(data=X, label=y) 21. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2) 22. 23. # Fitting XGBoost to training set and predict 24. module = xgb.XGBClassifier(objective ='reg:squarederror', 25. colsample_bytree = 0.5, 26. learning_rate = 0.3, max_depth = 15, 27. alpha = 10, n_estimators = 60) 28. module.fit(X_train, y_train) 29. print(module.get_num_boosting_rounds()) 30. y_pred = module.predict(X_test) 31. 32. # K-fold 33. params = {"objective":"reg:squarederror", 34. 'colsample_bytree': 0.5,'learning_rate': 0.3, 35. 'max_depth': 15, 'alpha': 10} 36. 37. cv_results = xgb.cv(dtrain=data_dmatrix, params=params, nfold=3, 38. num_boost_round=60, early_stopping_rounds=10, 39. metrics="rmse", as_pandas=True) 40. cv_results.head() 41. print((cv_results)) 42. 43. # Visualizing tree 44. xgb.plot_tree(booster = module, num_trees = 0) 45. fig = plt.gcf() 46. fig.set_size_inches(150, 100) 47. plt.savefig("tree.png") 48. 49. # Visualizing feature importance 50. plt.rcParams['figure.figsize'] = [14, 7] 51. xgb.plot_importance(module) 52. plt.savefig("fi.png") 53. 54. # Scatter graph 55. epochs = len(y_pred) 56. x_axis = range(0, epochs) 57. fig, ax = plt.subplots() 58. ax.scatter(x_axis, y_test, label='Test') 59. ax.scatter(x_axis, y_pred, label='Pred') 60. ax.legend() 61. plt.ylabel('Bid Adjustment') 62. plt.xlabel('Ad group') 63. plt.title('Bid Adjustment per Ad group') 64. plt.savefig("scatter.png")