Histórico da Página
Issue:
Jira | ||||||
---|---|---|---|---|---|---|
|
Objetivo
O O objetivo desse experimento é avaliar o modelo Matriz Matrix Fatorization do BigQuery ML para gerar recomendação de vendas de produtos através de feedback implícito, considerando a contagem de pedidos de venda do produto.
Hipótese
Analise exploratória
Experimento
.
Hipótese
O modelo de fatoração de matrizes irá encontrar novas oportunidades de vendas com base nos perfis de compras dos clientes.
Conjunto de dados
Para esse experimento foram considerados os seguintes dados:
Tabelas: SC6 (Itens do pedido de venda), SA1 (clientes), SB1 (Produtos)
Tenant: cbd00146e2184bb2bc734bab89fa3679
Cliente: AGRO SANDRI LTDA
Total de pedidos: 220.066
Total de itens de pedido: 12.181.658
Número de pedidos por filial | |||
---|---|---|---|
Filial | Descrição | Atividade | Número de Pedidos |
0101001 | Sandri Matriz | Comércio atacadista de defensivos agrícolas, adubos, fertilizantes e corretivos do solo | 108871 |
0101010 | Carazinho | Comércio atacadista de defensivos agrícolas, adubos, fertilizantes e corretivos do solo | 43116 |
0103004 | Loja Taio | Comércio varejista de animais vivos e de artigos e alimentos para animais de estimação | 30917 |
0103003 | Alfredo Wagner | Comércio varejista de animais vivos e de artigos e alimentos para animais de estimação | 15957 |
0103009 | Corupa | Comércio varejista de animais vivos e de artigos e alimentos para animais de estimação | 9420 |
0101002 | Sao Jose | Comércio atacadista de defensivos agrícolas, adubos, fertilizantes e corretivos do solo | 6744 |
0503001 | Cultivagro | Comércio atacadista de defensivos agrícolas, adubos, fertilizantes e corretivos do solo | 4660 |
0601001 | Sandri Distribuidora | Comércio atacadista de defensivos agrícolas, adubos, fertilizantes e corretivos do solo | 316 |
Preparação dos dados
O modelo de fatoração de matrizes exige com input uma tabela com as colunas id do cliente, id do produto e rating.
Para composição da coluna id do cliente foram considerados os campos A1_FILIAL, A1_COD e A1_LOJA.
Para composição da coluna id do produto foram considerados os campos B1_FILIAL e B1_COD.
Para o calculo do rating utilizamos a contagem de pedidos que o cliente fez de um mesmo produto. Após a contagem de pedidos foi utilizado um método de normalização para calcular o rating em uma escala entre 0 e 1.
Foram avaliados os métodos MinMaxScaler e QuantileTransformer da biblioteca Sckit-Learn. O método QuantileTransformer se mostrou mais robusto em relação aos outliers.
Também foi avaliado o método RobustScaler do BigQuery ML, no entanto o modelo não oferece suporte a clausula OVER( PARTITION BY), Sendo necessária a execução de uma query para cada SKU.
Dessa forma, foi utilizado o método QuantileTransformer da biblioteca Sckit-Learn para cálculo do rating.
A tabela a seguir exibe o rating associado ao número de pedidos para o produto JUREDV006 - MISTURA P/CANARIO C/12 UNID 500GR
Quantidade de Clientes | Numero de pedidos | rating |
---|---|---|
1 | 31 | 1.000 |
1 | 30 | 0.995 |
2 | 20 | 0.989 |
1 | 18 | 0.981 |
2 | 17 | 0.976 |
3 | 16 | 0.962 |
13 | 13 | 0.953 |
1 | 11 | 0.948 |
3 | 10 | 0.941 |
2 | 9 | 0.929 |
4 | 8 | 0.915 |
4 | 7 | 0.894 |
1 | 6 | 0.883 |
6 | 5 | 0.866 |
9 | 4 | 0.831 |
18 | 3 | 0.768 |
39 | 2 | 0.635 |
117 | 1 | 0.000 |
Experimento
O Experimento consistiu no treinamento do modelo de fatoração de matrizes do BigQuery ML com o conjunto de dados citado acima.
Para o tuning de hiperparâmetros foi utilizado o algoritmo Vertex AI Vizier (Recomendado na documentação do modelo). O Vertex AI executa uma mistura de algoritmos de busca avançados, incluindo otimização bayesiana com processos gaussianos. Ele também usa aprendizagem por transferência para aproveitar modelos previamente ajustados.
Os parâmetros ajustados do modelo foram:
NUM_FACTORS: Número de fatores latentes a serem usados, considerados valores entre 2 e 30.
WALS_ALPHA: Ajusta o impacto do feedback do usuário na confiança da recomendação, equilibrando entradas positivas e negativas na função de perda, considerados valores entre 0 e 50.
L2_REG: Regularização L2, considerados valores entre 0 e 5.
Para tuning dos hiperparâmetros foram treinados 30 modelos. A Tabela a seguir exibe os resultados obtidos para cada combinação de hiperparâmetros.
trial_id | hyperparameters | training_loss | eval_loss | mean_average_precision | mean_squared_error | normalized_discounted_cumulative_gain | average_rank | is_optimal |
---|---|---|---|---|---|---|---|---|
1 | {'l2_reg': 1.0000000000000013, 'num_factors': 16, 'wals_alpha': 40.0} | 0,008140792453 | 0,325089571 | 0,1394716653 | 0,004160976676 | 0,5309827189 | 0,544753853 | FALSE |
2 | {'l2_reg': 0.000932293581410731, 'num_factors': 21, 'wals_alpha': 50.0} | 0,01018353167 | 0,3585765378 | 0,1434209264 | 0,005347850888 | 0,5501032573 | 0,5310117337 | FALSE |
3 | {'l2_reg': 3.918381916094041e-07, 'num_factors': 28, 'wals_alpha': 38.54831959088628} | 0,07464325328 | 0,8823316423 | 0,05948916347 | 0,06225383414 | 0,4856588742 | 0,5993957009 | FALSE |
4 | {'l2_reg': 9.973483902303402e-07, 'num_factors': 15, 'wals_alpha': 46.82757281423023} | 0,1061076474 | 1,015653238 | 0,05994845923 | 0,09234759986 | 0,4857604136 | 0,5997041825 | FALSE |
5 | {'l2_reg': 4.999999999999985, 'num_factors': 8, 'wals_alpha': 50.0} | 0,01079533522 | 0,3190019012 | 0,1031597772 | 0,005278912502 | 0,5097728587 | 0,5708864756 | FALSE |
6 | {'l2_reg': 1.7616142828028523, 'num_factors': 28, 'wals_alpha': 50.0} | 0,00872710945 | 0,3074075377 | 0,1428821927 | 0,004798782639 | 0,530191688 | 0,5462049257 | FALSE |
7 | {'l2_reg': 0.08499212576564855, 'num_factors': 25, 'wals_alpha': 25.5030172365188} | 0,006085847236 | 0,3664895863 | 0,1691613274 | 0,003259454202 | 0,5456444558 | 0,5327943418 | FALSE |
8 | {'l2_reg': 0.015580976190327321, 'num_factors': 30, 'wals_alpha': 50.0} | 0,009433415772 | 0,637643516 | 0,1500522506 | 0,004985876019 | 0,5596699442 | 0,5220399237 | FALSE |
9 | {'l2_reg': 0.8314321010704594, 'num_factors': 30, 'wals_alpha': 9.503134363849387} | 0,003849134419 | 0,4636857469 | 0,1635964256 | 0,002276292105 | 0,5310002648 | 0,5490352432 | FALSE |
10 | {'l2_reg': 4.999999999999914, 'num_factors': 29, 'wals_alpha': 21.057259771428143} | 0,005527556777 | 0,389551781 | 0,151630155 | 0,002900558109 | 0,5312334089 | 0,5446150245 | FALSE |
11 | {'l2_reg': 0.03535716306591547, 'num_factors': 16, 'wals_alpha': 13.353558118216814} | 0,004788300715 | 0,4284816106 | 0,161273812 | 0,002635191896 | 0,5317141861 | 0,5494085614 | FALSE |
12 | {'l2_reg': 0.005102631432882006, 'num_factors': 30, 'wals_alpha': 10.111796678690158} | 0,003868762943 | 0,4651188518 | 0,204436996 | 0,00233129295 | 0,5426337624 | 0,5398913862 | FALSE |
13 | {'l2_reg': 0.022215434166465067, 'num_factors': 30, 'wals_alpha': 20.426673337034934} | 0,005276830052 | 0,3803404232 | 0,1880105091 | 0,002923461018 | 0,5493424954 | 0,5305577439 | FALSE |
14 | {'l2_reg': 0.0014868484471595774, 'num_factors': 30, 'wals_alpha': 18.41116937576304} | 0,005621790288 | 0,5411622862 | 0,1583410798 | 0,002992062059 | 0,5471152529 | 0,5344720122 | FALSE |
15 | {'l2_reg': 0.00037458000135501783, 'num_factors': 30, 'wals_alpha': 0.0} | 0,001646986075 | 0,6685769856 | 0,2189129236 | 0,001951165103 | 0,5036324968 | 0,5851955414 | FALSE |
16 | {'l2_reg': 5.0426747288577794e-05, 'num_factors': 30, 'wals_alpha': 0.0} | 0,001644197995 | 0,6673522968 | 0,2212785755 | 0,001947168284 | 0,5045348334 | 0,5844760296 | FALSE |
17 | {'l2_reg': 0.006548675713870693, 'num_factors': 30, 'wals_alpha': 0.0} | 0,001644092381 | 0,6712571056 | 0,2205895604 | 0,001947196744 | 0,5046617646 | 0,5841706202 | FALSE |
18 | {'l2_reg': 2.0467372996040806e-07, 'num_factors': 30, 'wals_alpha': 0.0} | 0,001643790251 | 0,6667421311 | 0,2197453759 | 0,001946328902 | 0,5049987295 | 0,5846111577 | FALSE |
19 | {'l2_reg': 9.431030990757945e-06, 'num_factors': 14, 'wals_alpha': 0.0} | 0,0017105631 | 0,693860813 | 0,1642095598 | 0,002034137656 | 0,5025091092 | 0,585820107 | FALSE |
20 | {'l2_reg': 1.520826644574924e-14, 'num_factors': 30, 'wals_alpha': 0.0} | 0,001643476424 | 0,6669727701 | 0,2186300475 | 0,001946245704 | 0,50400326 | 0,585098055 | FALSE |
21 | {'l2_reg': 1e-14, 'num_factors': 2, 'wals_alpha': 50.0} | 0,01308917892 | 0,3573339441 | 0,07579390846 | 0,005758070828 | 0,5076323914 | 0,5732263194 | FALSE |
22 | {'l2_reg': 1.7504184803190196e-11, 'num_factors': 30, 'wals_alpha': 0.0} | 0,00164448241 | 0,6667648347 | 0,2236417385 | 0,001947291792 | 0,5045211048 | 0,584555342 | TRUE |
23 | {'l2_reg': 1.3708551568265646e-14, 'num_factors': 9, 'wals_alpha': 0.0} | 0,001737856441 | 0,7076104656 | 0,1406440263 | 0,002071141662 | 0,4998814351 | 0,5883927622 | FALSE |
24 | {'l2_reg': 1e-14, 'num_factors': 30, 'wals_alpha': 18.13839541172616} | 0,005544037616 | 0,4806857562 | 0,1893585786 | 0,003040597987 | 0,5594205626 | 0,5261018883 | FALSE |
25 | {'l2_reg': 1.249569210306576e-09, 'num_factors': 30, 'wals_alpha': 0.0} | 0,001645627661 | 0,6680610226 | 0,2205016375 | 0,001949417952 | 0,505302172 | 0,5841699882 | FALSE |
26 | {'l2_reg': 5.846331764978993e-13, 'num_factors': 30, 'wals_alpha': 5.754905354815194} | 0,005912505733 | 0,8228278253 | 0,0614571502 | 0,003237331032 | 0,4837544043 | 0,6020142029 | FALSE |
27 | {'l2_reg': 2.3229183670233683e-10, 'num_factors': 19, 'wals_alpha': 0.0} | 0,001686308977 | 0,68302987 | 0,1888253352 | 0,00200191597 | 0,5040440587 | 0,5852810783 | FALSE |
28 | {'l2_reg': 1.7847170142715928e-08, 'num_factors': 30, 'wals_alpha': 23.17396002405451} | 0,008641693254 | 0,715685257 | 0,09783096964 | 0,003648670853 | 0,5355419327 | 0,5485852874 | FALSE |
29 | {'l2_reg': 2.009229403547787e-14, 'num_factors': 2, 'wals_alpha': 22.553367846890787} | 0,008381335381 | 0,4593275235 | 0,08088665098 | 0,003659103744 | 0,5049624444 | 0,5773505599 | FALSE |
30 | {'l2_reg': 0.00036952502039377233, 'num_factors': 30, 'wals_alpha': 4.338784226622727} | 0,002822162837 | 0,5168495524 | 0,2114896056 | 0,002019635331 | 0,5318989979 | 0,5547257438 | FALSE |
Após análise dos resultados obtidos foi selecionado o de id 22 para gerar as recomendações de venda, pois além de ter obtido o melhor mean average precision, o modelo obteve resultado similar ao menor mean_squared_error, além de ter obtidos resultados próximos dos melhores modelos considerando as métricas normalized_discounted_cumulative_gain e average_rank.
Resultados
A tabela a seguir exibe a quantidade de recomendações geradas por faixa de rating.
rating | numero de recomendações | média de recomendações por cliente | clientes | SKUs |
---|---|---|---|---|
>= 0.9 | 54.605 | 15 | 3.685 | 3.005 |
[ 0.8 , 0.9 ) | 43.552 | 10 | 4.388 | 2.878 |
[ 0.7 , 0.8 ) | 75.056 | 13 | 5.663 | 3.857 |
[ 0.6 , 0.7 ) | 124.080 | 17 | 7.136 | 4.974 |
[ 0.5 , 0.6 ) | 211.100 | 24 | 8.960 | 6.419 |
[ 0.4 , 0.5 ) | 372.212 | 33 | 11.215 | 8.527 |
[ 0.3, 0.4 ) | 703.519 | 49 | 14.375 | 7.926 |
[ 0.2, 0.3 ) | 1.537.023 | 83 | 18.613 | 11.354 |
[ 0.1, 0.2 ) | 4.590.031 | 178 | 25.757 | 17.805 |
<= 0.1 | 1.364.616.147 | 32.342 | 42.193 | 32.525 |
A tabela a seguir exibe alguns exemplos de recomendações geradas.
Cliente | Top 5 produtos comprados | Top 5 recomendações |
---|---|---|
000000SSA1T|0000 | MACHRC033 | MILHO MOIDO 25KG | COXIAD015 | UREIA PLUS 50 KG COXILHA |
HOKKDF003 | HOKKO KASUMIN 1LT CTIII | FERTAD025 | UREIA PLUS 50KG FERTIPAR | |
SYNGDF022 | RIDOMIL GOLD 1KG CTII | ATANDF004 | SHADOW 20 LT | |
NIORAD001 | FERTILIZANTE NIORG ORGANICO GRANULADO | FERTAD018 | ADUBO 05-20-10 50KG FERTIPAR | |
COXIAD021 | ADUBO 05-20-10 50KG | COXIAD008 | ADUBO 07-28-14 50KG | |
000001|01 | PFIZVT001 | DECTOMAX 50ML | BRAVVT011 | MERCEPTON INJETAVEL 100ML |
MONSDF001 | ROUNDUP 1LT CTIV | GERDGP028 | PREGO 17X27 KG GERDAU | |
GERDGG013 | ARAME GALV. N. 18 10KG | PFIZVT032 | TERRAMICINA LA 50ML | |
TORTVT004 | SAL MINERAL NOVO BOVIGOLD 10 KG | PFIZVT001 | DECTOMAX 50ML | |
AGRIDF007 | GLIFOSATO 1LT AGRIPEC | GERDGP001 | GRAMPO 1X9 KG GLV GERDAU | |
0000055MUKY|0000 | OESTVT002 | STAR ALHO 500GR | BAYESP010 | K-OTHRINE 30ML CT II |
MACHRC051 | CASCA DE SOJA MOIDA 25 KG | FORTVT013 | MATABICHEIRA F. SV ZT 500ML | |
KONIVT007 | BACTROVET PRATA 500ML | MERIVT007 | IVOMEC INJETAVEL 50ML | |
MACHRC087 | MACHS AVES POSTURA P 5 KG | AGROVT001 | SABAO SARNICIDA MATACURA 80GR | |
PFIZVT032 | TERRAMICINA LA 50ML | ||
00000AAAINT|0000 | MACHRC029 | MACHS COELHOS 15% 5 KG # | COXIAD015 | UREIA PLUS 50 KG COXILHA |
MACHRC100 | MACHS PIG CRESCIMENTO F 25KG | FERTAD02 | UREIA PLUS 50KG FERTIPAR | |
ATANDF002 | SHADOW 5 LT | ATANDF004 | SHADOW 20 LT | |
SYNGDF038 | ACTARA 250WG 1KG | IHARDF022 | FLUMYZIN 100GR | |
COXIAD015 | UREIA PLUS 50 KG COXILHA | FERTAD018 | ADUBO 05-20-10 50KG FERTIPAR |
Referências
Tutorial do modelo de fatoração de matrizes do BQML utilizando feedback implícito:
https://cloud.google.com/bigquery/docs/bigqueryml-mf-implicit-tutorial?hl=pt-br
Documentação do modelo de fatoração de Matrizes:
Comparação de diferentes métodos de normalização para dados com outliers:
Método de normalização RobustScaler BigQuery ML:
...