Afonso Jose Torres Da Silva e Sousa
Afonso Jose Torres Da Silva e Sousa
Afonso Jose Torres Da Silva e Sousa
Escola de Engenharia
| Afonso Sousa
UMinho
202X
October 2022
Afonso José Torres da Silva e Sousa
Dissertação de Mestrado
Mestrado Integrado em Engenharia e Gestão de
Sistemas de Informação
Outubro 2022
DIREITOS DE AUTOR E CONDIÇÕES DE UTILIZAÇÃO DO TRABALHO POR TERCEIROS
Este é um trabalho académico que pode ser utilizado por terceiros desde que respeitadas
as regras e boas práticas internacionalmente aceites, no que concerne aos direitos de autor
e direitos conexos.
Assim, o presente trabalho pode ser utilizado nos termos previstos na licença abaixo
indicada.
Caso o utilizador necessite de permissão para poder fazer um uso do trabalho em condições
não previstas no licenciamento indicado, deverá contactar o autor, através do RepositóriUM
da Universidade do Minho.
Licença concedida aos utilizadores deste trabalho
6
AGRADECIMENTOS
A felicidade está caminho que percorremos e não no destino ao qual chegamos, por isso,
quero agradecer a todos que caminharam ao meu lado. Tornaram esta viagem única.
Ao professor Doutor Paulo Cortez, agradeço a partilha do conhecimento, o qual me
permitiu desenvolver competências na área de Machine Learning, e da sua disponibilidade
demonstrada, para a elaboração deste projeto.
Aos meus colegas do CCG, obrigado por todo o apoio e companheirismo. Vocês tiveram
um papel fundamental no meu percurso pessoal e profissional, durante o último ano.
À minha Mãe e ao meu Pai, agradeço por tudo o que fizeram por mim nos últimos 24
anos da minha existência.
À Joanna, com quem tenho o prazer de partilhar todos os meus momentos, o meu mais
profundo obrigado. És a minha inspiração, sem ti ao meu lado, não seria a pessoa que sou
hoje.
A todos que marcaram o meu trajeto, o meu obrigado.
DECLARAÇÃO DE INTEGRIDADE
Palavras-Chave: Análises Preditivas, AutoML, Indústria 4.0, Machine Learning, Séries Temporais.
I
Abstract
In the development of new solutions for the optimization of industrial production processes,
new challenges have risen due to the complexity of value creation and the implications
associated with production processes, along the supply chains. While technological
development is an inherent goal for every company, it is necessary to ensure that economic
growth is proportional to the benefits it provides to society, as well as carried out under
policies of sustainable and circular development.
This dissertation aims to research the implementation of Machine Learning (ML) techniques
that can be associated with production planning systems, allowing to automate, predict
and act on the management of production processes. The objectives are to investigate the
benefits of implementing certain methods and techniques of Machine Learning, in order to
create essential predictions for the development of a production plan, based on the results
obtained through historical data.
II
Índice
Resumo I
Abstract III
Lista de Figuras V
Lista de Tabelas VI
Lista de Abreviaturas, Siglas e Acrónimos VII
1 Introdução 1
1.1 Enquadramento e Motivação 1
1.2 Objetivos e Resultados Esperados 1
1.3 Organização do Documento 2
1.4 Abordagem Metodológica 3
2 Estado de Arte 5
2.1 Estratégia de Pesquisa Bibliográfica 5
2.2 Indústria 4.0 6
2.3 Inteligência Artificial 7
2.4 Machine Learning 8
2.4.1 Aprendizagem Supervisionada 10
2.4.2 Aprendizagem Não-Supervisionada 13
2.4.3 Reinforcement Learning 14
2.4.4 Automated Machine Learning (AutoML) 15
2.4.5 Séries Temporais 17
2.5 Machine Learning no Planeamento de Cadeias de Abastecimento 18
2.6 Ferramentas Tecnológicas 23
3 Caso de Estudo - Previsão de Encomendas 27
3.1 Iteração 1 28
3.1.1 Compreensão do Negócio 28
3.1.2 Compreensão dos Dados 28
3.1.3 Preparação dos Dados 29
3.1.4 Modelação 29
3.1.5 Avaliação 31
3.2 Iteração 2 32
3.2.1 Compreensão do Negócio 32
3.2.2 Compreensão dos Dados 33
3.2.3 Preparação dos Dados 33
3.2.4 Modelação 33
III
Índice IV
3.2.5 Avaliação 34
3.3 Considerações finais 36
4 Caso de Estudo - Previsão do Tempo de Produção 37
4.1 Iteração 1 38
4.1.1 Compreensão do negócio 38
4.1.2 Compreensão dos dados 38
4.1.3 Preparação dos dados 39
4.1.4 Modelação 40
4.1.5 Avaliação 40
4.2 Iteração 2 41
4.2.1 Compreensão do negócio 41
4.2.2 Compreensão dos dados 41
4.2.3 Preparação dos dados 42
4.2.4 Modelação 42
4.2.5 Avaliação 43
4.3 Iteração 3 44
4.3.1 Preparação dos dados 44
4.3.2 Modelação 45
4.3.3 Avaliação 45
4.4 Considerações finais 45
5 Conclusão 47
5.1 Síntese do Trabalho Realizado 47
5.2 Contributos 48
5.3 Trabalho Futuro 48
Referências Bibliográficas 49
a Anexos 53
a.1 Código Python 53
Lista de Figuras
V
L i s t a d e Ta b e l a s
VI
Lista de Abreviaturas, Siglas e Acrónimos
AR Autoregressive.
ARIMA Autoregressive Integrated Moving Average.
ARMA Autoregressive Moving Average.
AutoML Automated Machine Learning.
IA Inteligência Artificial.
IDF Inverse Document Frequency.
MA Moving Average.
MAE Mean Absolute Error.
ML Machine Learning.
VII
1
Intro dução
1
1.3. Organização do Documento 2
Com o objetivo de desenvolver e alcançar um projeto final bem sucedido, de acordo com
a complexidade relacionada com a elaboração de uma dissertação, de modo a compreender
os aspetos fundamentais, é necessário definir um conjunto de metodologias de trabalho.
Para auxiliar o desenvolvimento deste projeto, técnicas de boas práticas de investigação
deverão ser implementadas.
Neste contexto foi utilizada a metodologia CRISP-DM (CRoss-Industry Standard Process for
Data Mining), que serve de suporte a projetos de Data Mining, que permitirá definir o plano
de ação. Esta metodologia foi desenvolvida com o objetivo de servir como um guião para
o desenvolvimento de projetos de Data Mining.
Assim sendo, a metodologia CRISP-DM está dividida em seis etapas: Business Unders-
tanding, Data Understanding, Data Preparation, Evaluation e Deployment. Cada fase
possui um conjunto de tarefas específicas:
1.4. Abordagem Metodológica 4
2. Data Understanding (Compreensão dos Dados): Nesta etapa, os dados serão recolhidos
e posteriormente será realizada uma análise dos mesmos, para compreender as
diversas relações entre as variáveis, e identificar os problemas relacionados com a
qualidade dos dados, como incoerências que estes possam apresentar.
3. Data Preparating (Preparação dos Dados): Esta etapa é caracterizada pelo tratamento
e processamento de dados. Dependendo das características dos mesmos serão
selecionadas as técnicas necessárias para o seu tratamento, de forma a elaborar um
dataset final para a modelação. Sendo o CRISP-DM uma metodologia cíclica, caso
sejam detetadas falhas que necessitem de serem tratadas novamente, esta tarefa
deverá ser novamente executada.
5
2.2. Indústria 4.0 6
O fenómeno da Indústria 4.0 foi mencionado pela primeira vez em 2011 na Alemanha
como uma proposta para o desenvolvimento de um novo conceito de política económica
alemã, baseado em estratégias de alta tecnologia. Consiste numa era que veio revolucionar
a indústria pela interação entre o mundo digital e o real, com a adoção de tecnologias
responsáveis por conectar tudo e todos. Esta indústria é a componente económica
encarregue da produção de bens materiais muito mecanizados e automatizados, também
encarregue da forma como os shop floors operam (Vaidya et al., 2018).
Definido por muitos como uma transformação global da indústria de manufatura, com
a introdução da digitalização e da Internet, estas transformações envolvem melhorias
revolucionárias nos processos de manufatura, operações e serviços de produtos e sistemas.
Partilham muitas semelhanças com os desenvolvimentos no âmbito das Smart Factories, Smart
Industry, Advanced Manufacturing e Industrial Internet of Things (Tjahjono et al., 2017). No contexto
da Indústria 4.0, há ainda a possibilidade de conectar máquinas com humanos através da
utilização de Sistemas Ciber-Físicos. Este tipo de sistemas monitoriza os processos físicos,
criando uma cópia virtual do mundo real, que toma decisões descentralizadas (Lu, 2017).
Os principais atributos da Indústria 4.0 são a digitalização, otimização e a customização
da produção; automatização e adaptação; interação homem-máquina; serviços e negócios
de valor acrescentado; comunicação e troca de dados automática. A Indústria 4.0 fornece
mudanças disruptivas nas cadeias de abastecimento, modelos de negócio e processos de
negócio. A Indústria 4.0 pode ser resumida como um processo de manufatura integrado,
adaptado, otimizado, orientado a serviços e interoperável, que está correlacionado com
algoritmos, Big Data e tecnologias de ponta. Sendo assim, os princípios da Indústria 4.0 são
a interoperabilidade, virtualização, descentralização, capacidade em tempo real, orientação
para serviço e modularidade (Shafiq et al., 2015).
Apesar do conceito de Indústria 4.0 se estar a desenvolver, torna-se necessário destacar os
fatores que a impulsionam. Atualmente, já se verifica um progresso notável na capacidade
dos computadores, assim como, na quantidade de informação digitalizada, (Big Data), isto
devido aos atuais procedimentos de inovação.
São diversos benefícios associados como, o aumento da produtividade, sendo que, esta
indústria oferece modelos de automação e otimização dos processos eficientes, os quais
contribuem para um aumento da produtividade. Consequentemente, há uma redução dos
custos associados, uma quebra nas falhas do sistema e um aumento da eficácia da produção.
A melhoria das condições de trabalho, ainda que esta indústria seja fundamentada em
tecnologias, as questões sociais e ambientais não são ignoradas, pelo contrário, são aspetos
importantes uma vez que se pretende trabalhar de forma sustentável.
2.3. Inteligência Artificial 7
A Inteligência Artificial tem como principal objetivo procurar métodos e formas dos
computadores fazerem o mesmo tipo de análises que a mente humana faz sistematicamente.
Esta definição de IA apesar de ser bastante simples de compreender, a verdade é que por
detrás desta afirmação tão breve, não revela a tamanha complexidade e potencial deste
tema. Ao afirmar que este conceito relaciona a mente humana, referimo-nos às capacidades
psicológicas como a previsão, associação, perceção, planeamento, entre outras.
O primeiro sistema de Inteligência Artificial apareceu primeiramente em 1955, concebido
pelo professor Allen Newell, que atribui o nome de Logic Theorist ao sistema que tinha criado,
o qual provava cerca de 40 teoremas. Um ano depois, em 1956, é o ano em que o conceito
de Inteligência Artificial surge, devido à conferência em Dartmouth College.
Em investigações futuras, Allen Newell, Simon e Shaw, desenvolveram um sistema de
processamento de habilidades mentais humanas que permitia resolver um conjunto de
problemas como a Integração Simbólica, fazer o puzzle da Torre de Hanoi, etc. Desta forma,
o paradigma da simulação cognitiva ficou definido, o qual afirma que, um sistema de
Inteligência Artificial é estruturado pela forma como os humanos resolvem os problemas
(Chang, 2020). Mais tarde, já em 1972, Allen Newell e Simon, reconheceram a demonstração
de Oliver Selfridge, sobre a manipulação para o reconhecimento de padrões. Este trabalho
consistia numa aprendizagem e numa abordagem com múltiplos agentes para a resolução
de problemas. Os outros trabalhos relativos aos anos de 1950 também foram considerados,
concluindo que as demonstrações realçavam o impressionante poder das heurísticas para o
2.4. Machine Learning 8
desenvolvimento da IA. Assim sendo, a tese de Thomas Evans em 1963, sobre a resolução de
problemas de analogia para testes de QI, foi o primeiro a explorar o raciocínio analógico
através da utilização de um programa em execução.
Vários avanços científicos foram alcançados ao perceber o raciocínio por detrás dos
sistemas baseados em conhecimento e analogias, tornando-se o gatilho para diversas
investigações e desenvolvimentos nas áreas como a medicina, indústria e em áreas como
o desenvolvimento de mecanismos de condução autónoma de veículos (Buchanan, 2005).
Atualmente os desenvolvimentos em torno da Inteligência Artificial tem como foco as áreas
de engenharias, estando associado ao baixo nível de reconhecimento de padrões, assim
como, no âmbito estatístico com foco no reconhecimento de padrões, através de dados
armazenados, possibilitando o teste de hipóteses assim como apoio à tomada de decisão.
A Inteligência Artificial tem dois objetivos principais, um relacionado com o aspeto
tecnológico, em que os computadores chegam a resultados úteis através da integração
de métodos de aprendizagem. Por outro lado, através da utilização dos conceitos e dos
modelos de Inteligência Artificial e com uma visão em torno de um aspeto científico, o
objetivo passa por tentar responder a questões relacionadas com humanos e outros seres
vivos, no aspeto em que, devido aos sistemas de IA, a intervenção humana deixa de ser
necessária, e o processo de tomada de decisão é com base no resultado dos métodos de IA,
como por exemplo na medicina.
Com a evolução das tecnologias de informação, e com o desenvolvimento tecnológico
baseado em dados, os modelos de Machine Learning são cada vez mais importantes neste
contexto, devido à capacidade de modelação de processos computacionais para responder
aos desafios da IA. Assim sendo, surge o conceito de Machine Learning que irá responder ao
subconjunto de objetivos da IA com foco no desenvolvimento de máquinas inteligentes
(Arrieta et al., 2020).
Machine Learning tem vindo a ser desenvolvido desde meados do século XX, no qual se
acreditava na possibilidade de um computador aprender novos padrões ou regras, estando
ele programado para essa função. Tendo este conceito de Machine Learning ter sido descrito
pela primeira vez por Arthur Samuel, em 1959, da seguinte forma: “Campo de estudo que
dá aos computadores a capacidade de aprender sem serem especificamente programados” (Samuel,
1967). Mais tarde, por Tom Mitchell, em 1997, que atribuiu uma definição mais formal a
este conceito: “É dito a um programa de computador para aprender através de uma experiência E
relativamente a uma tarefa T e da medição da performance P, se a performance em T, medida através de
P, melhora através da experiência E” (Mitchell and Mitchell, 1997).
2.4. Machine Learning 9
O conceito de Machine Learning, sendo este uma vertente da Inteligência Artificial, tem
como principal objetivo a implementação de capacidades de aprendizagem nas máquinas,
através do estudo de técnicas de modelação de processos computacionais, que permitam
alcançar soluções para diversos problemas num vasto conjunto de áreas, que métodos
convencionais não permitem resolver.
Figura 2: Relacionamento da Inteligênica Artificial com Machine Learning e Deep Learning (adaptado de
Goodfellow, 2016)
• Collection and Data Preparation (Recolha e Preparação dos Dados): Esta fase consiste
na recolha dos dados, que irão servir como input do modelo, os quais devem ser
devidamente tratados, de modo a construir uma base sólida para as fases seguintes;
• Selection of Models and Paramaters (Seleção dos Modelos e Parâmetros): Seleção dos
algoritmos que permitam responder ao problema da melhor forma, e customização
dos parâmetros dos mesmos;
• Training (Treino): Etapa na qual os dados recolhidos são utilizados para treino no
modelo;
2018). Conforme os inputs são introduzidos no modelo, este ajusta os valores até que o
modelo tenha ajustado adequadamente.
A Aprendizagem Supervisionada auxilia as organizações na resolução de diversos
problemas do mundo real a grande escala. Sendo que existem diferentes tipos de problemas
dependendo do output, como problemas de classificação, quando são variáveis discretas não
ordenadas, ou então problemas de regressão, quando o resultado é contínuo.
Uma tarefa da Aprendizagem Supervisionada é designada de regressão quando os outputs
são valores numéricos, e chamados de classificação quando os outputs tomam valores
categóricos ou discretos. Por exemplo, quando se tenta prever um preço de uma televisão
a partir de um dataset, este é um caso de regressão, pois o preço vai ser um resultado
contínuo. Analisando o mesmo dataset sobre televisões, seria um problema de classificação,
no caso do algoritmo prever se o preço vai ser superior ou inferior ao preço de custo, ou
seja, o output só pode ser entre duas categorias (Matloff, 2017).
Exemplos de alguns algoritmos mais comuns de regressão são, Linear Regression, Support
Vector Machine (SVM) e Regression Tree. Quanto a algoritmos de classificação, alguns exemplos
comuns são, Naive Bayes, Decision Trees e K Nearest Neighbors (KNN), (Hastie et al., 2009):
• Support Vector Machine (SVM): Sendo este um modelo mais complexo em compa-
ração com outros modelos, por outro lado, permite obter resultados com elevada
2.4. Machine Learning 12
• Decision Trees: Sendo esta técnica uma das mais comuns dentro da Aprendizagem
Supervisionada, este modelo é caracterizado pela construção de uma árvore, na
qual a sua raiz consiste na representação do conjunto de dados, e os diversos ramos
representam uma decisão. Este algoritmo é bastante utilizado em contextos de pre-
visão, tanto em problemas de classificação ou regressão, diminuindo a complexidade,
simplificando o processo de decisão (Myles et al., 2004).
Figura 6: Arquitetura geral de um modelo de Decision Tree (adaptado de Iorkyase et al., 2019)
2.4. Machine Learning 13
Figura 7: Arquitetura de um modelo Regression Tree (adaptado de Murray and Scime, 2010)
• Naive Bayes: O conceito deste modelo consiste em utilizar a regra de Bayes juntamente
com atributos que são condicionalmente independentes entre si. Assim sendo, apesar
desta independência por vezes não ser praticada, o modelo é capaz de obter bons
resultados preditivos comparado a outros modelos (Webb et al., 2010).
desempenho limitado, mas à medida que aprende mais sobre os dados, o desempenho
aumenta consequentemente.
Dois dos principais métodos usados na aprendizagem não supervisionada são a com-
ponente principal e a análise de agrupamento. Um exemplo é a análise de clusters que
é utilizada na aprendizagem não supervisionada, para criar conjuntos de dados com
atributos comuns, e fomentar os relacionamentos algorítmicos. A análise de clusters é um
domínio que agrupa os dados que não foram rotulados, classificados ou categorizados
(Jain, 2010).
O Reinforcement Learning consiste numa das áreas do Machine Learning que lida com os
processos de tomada de decisão ao longo de uma determinada sequência de acontecimentos.
Este conceito pode ser formalizado como um agente que toma determinadas ações com
base numa determinada recompensa, dentro de um ambiente. Este ambiente é formulado
como um processo de decisão de Markov, no qual o agente interage com um ambiente
dinâmico através de tentativa e erro. O algoritmo inicialmente desconhece a solução
ótima, mas o agente através de um sistema de recompensas, com base em experiências, é
capaz de descobrir quais as ações mais benéficas dentro do ambiente ao longo do tempo.
Um aspeto fundamental é que o agente não necessita de conhecer o ambiente, apenas é
necessário que este consiga interagir com o ambiente e recolher informações ao longo das
diversas interações. Assim sendo, é possível identificar 4 elementos principais num sistema
de Reinforcement Learning (Sutton and Barto, 2018):
• Reward: O agente em cada iteração recebe uma recompensa, e este, ao longo das
várias experiências de tentativa e erro, procura maximizar a reward de acordo com o
objetivo do problema de Reinforcement Learning.
• TPOT: O TPOT (Tree-based Pipeline Optimization Tool) é uma ferramenta open source, que
permite otimizar uma série de features associadas ao pré-processamento de dados,
e selecionar um conjunto de modelos com o objetivo de maximizar a eficácia dos
mesmos. Assim sendo, o TPOT tem como objetivo a automatização da pipeline
de Machine Learning face a um problema, sem a necessidade de intervenção humana
(Olson and Moore, 2016). utiliza uma versão de Genetic Programing, que consiste
numa técnica automática de programação, que permite a evolução de programas de
computadores, que resolvem problemas.
• ARIMA (Auto-Regressive Integrated Moving Average): Esta ferramenta consiste num modelo
que permite criar previsões com base em dados históricos. Este modelo é uma
generalização do modelo ARMA (Autoregressive Moving Average), que é resultado da
combinação de dois processos, Autoregressive (AR) e Moving Average (MA), gerando o
acrónimo ARIMA (p, d, q). O p (AR de Autoregressive), consiste no modelo de regressão
que usa as dependências entre uma observação e o número de latência utilizada no
treino. O d (I de Integrated) refere-se à medição da diferença do número de observações
em diferentes intervalos de tempo. Por fim, o q (MA de Moving Average) tem em conta
2.5. Machine Learning no Planeamento de Cadeias de Abastecimento 18
• LSTM: Long Short-Term Memory é um tipo especial de uma Recurrent Neural Network (RNN)
com características adicionais de modo a memorizar a sequência do tempo. Cada
LSTM consiste num conjunto de células, onde os fluxos de dados são guardados. Uma
célula conecta dois módulos, transportando os dados entre os dois. Esta também
é composta por gates, baseados na camada de uma rede neuronal, que permite ao
módulo armazenar ou descartar os dados. Assim sendo, uma LSTM pode armazenar
e aprender através de longas sequências de dados (LeCun et al., 2015);
Figura 11: Arquitetura de um LSTM gate com um input, output e um forget gate adaptado de Zaytar and
El Amrani, 2016)
• É possível prever a procura no mercado por novos produtos, assim como, identificar
os fatores que contribuíram para o mesmo;
• A vida útil dos principais ativos da empresa, tem sido ampliada, através da análise
de padrões nos dados coletados, que tornam possível detetar quais os fatores que
determinam, por exemplo, o desempenho das máquinas através de métricas mais
precisas, como Eficácia Geral do Equipamento;
Versão
Nome Descrição Licença Área
Python
H20 AutoML, consiste numa ferramenta, que permite automatizar o fluxo de trabalho
de Machine Learning, ao incluir a seleção dos modelos e os respetivos hiperparâmetros,
de modo a facilitar o processo de treino dos modelos. O utilizador desta ferramenta
MIT
H2O AutoML pode ainda definir o período de tempo de treino nos modelos. Esta ferramenta, oferece Modelação >=3.6
License
também uma interface gráfica, que foi projetada para ter o mínimo de parâmetros
possíveis, de modo a que o utilizador, apenas necessita de definir o conjunto de dados,
identificar o target, e o tempo de treino.
Python
Sendo esta biblioteca uma extensão da biblioteca NumPy, que suporta Python Software
Matplotlib Análise >=2.7
da versão 2.7 à 3.6, tem como objetivo a criação de gráficos e visualização dos dados. Foundation
License
A biblioteca Numpy (Numerical Python), consiste, numa ferramenta desenvolvida para Análise
Numpy Python, composta por um conjunto de funções matemáticas para operar sobre matrizes. BSD Pré- >=3.6
Esta biblioteca, suporta um elevado processamento de arrays multidimensionais. -Processamento
A biblioteca Pandas foi criada para o processamento e análise de dados, em Python. Análise
BSD
Pandas A estrutura da ferramenta e das operações disponíveis, tem como objetivo a manipulação Pré- >=2.7
3-Clause
de tabelas numéricas e de séries temporais. -Processamento
2.6. Ferramentas Tecnológicas 26
Versão
Nome Descrição Licença Área
Python
O plotly consiste numa ferramenta open source, que permite o desenvolvimento de MIT
Plotly Analytics >=2.7
gráficos iterativos. License
27
3.1. Iteração 1 28
3.1 Iteração 1
Este caso de estudo consiste, num problema que utilizará técnicas de Machine Learning para
a sua resolução, portanto, ao longo desta primeira iteração da metodologia CRIPS-DM, o
objetivo consiste na previsão do número de encomendas.
Nesta fase, foi analisado um dataset disponibilizado pela empresa, relativo às encomendas
recebidas num período de um ano. O dataset Orders Recived, consiste num conjunto de dados
composto por 81648 registos, com datas entre 01-01-2020 e 31-12-2020. Estes registos
referem-se às encomendas de recipiente de metal, por diversos clientes.
Desta forma, este dataset é composto por 8 colunas: Sold-to Party, Name 1, Sales Document,
Purchase Order No, Document Date, Delivery Data, Order Quantity e Factory. Por motivos de interesse
da empresa, os dados dos clientes serão mantidos anonimizados. Na tabela abaixo podemos
ver o resumos dos atributos do dataset:
3.1. Iteração 1 29
A fase da preparação dos dados, tem como objetivo a estruturação do dataset, de modo
a que este possa servir como input para os modelos preditivos de Time Series.
Inicialmente foram removidas todas as colunas desnecessárias para a elaboração dos
modelos, ficando apenas com os atributos, Document Date e Order Quantity. Concluído este
passo, o dataset ficou reduzido apenas a duas colunas: Document Date, atributo relativo à
data da encomenda, e à variável target, Order Quantity, relativa à quantidade de produto
encomendada.
Com o objetivo de criar uma série temporal, os valores da coluna Document Date,
foram agregados pela data, e os valores da coluna Order Quantity somados conforme o dia
correspondente. Os dados recebidos consistem nas encomendas ao longo do ano de 2020.
Como é possível analisar, num período de um ano, 366 dias, apenas existem 281 registo
temporais diferentes, isto significa, que em 85 dias ao longo do ano, não existem quaisquer
registos de encomendas. De modo a criar uma série temporal contínua no tempo, foi
necessário criar novos registos, preenchendo a coluna Document Date com os dias em falta e
a respetiva data. Como a falta de registos corresponde à ausência de encomendas, o valor
da coluna Order Quantity foi preenchido com o valor 0.
Por fim, após este processo de transformação dos dados, resultou um dataset composto
por 366 linhas e 2 colunas, correspondentes à quantidade de produto encomendado ao
longo dos dias do ano de 2020.
3.1.4 Modelação
Figura 12: Estrutura do conceito Rolling Window (adaptado de Matos et al., 2022)
Com o objetivo de desenvolver uma solução robusta, optou-se por realizar 20 iterações
da Rolling Window (Cortez et al., 2020), sobre o dataset resultante da etapa anterior, o qual
está ordenado no tempo. O número de iterações é possível obter através da seguinte
fórmula:
𝐷L − (𝑊 + 𝐻)
𝑈= +1 (1)
𝐻
Como o número de dias para o qual se pretende obter as previsões não é constante,
variando entre 7/14/21 e 28 dias, os valores atribuídos a W, H e S, foram ligeiramente
3.1. Iteração 1 31
1 𝑛
𝑀𝐴𝐸 = ( ) ∑ ∣𝑦𝑖 − 𝑥𝑖 ∣ (2)
𝑛 𝑖=1
𝑀𝐴𝐸
𝑁𝑀𝐴𝐸 = ∗ 100 (3)
𝑦max − 𝑦min
3.1.5 Avaliação
3.2 Iteração 2
Um dos principais motivos que levou a realizar uma nova iteração consistiu no facto de
novos aspetos relevantes sobre o comportamento do negócio terem surgido.
A empresa, ao possuir quatro fábricas distintas, distribuídas em quatro localizações
diferentes, cada uma delas, responsável por receber e produzir as suas encomendas, feitas
pelos clientes nessas mesmas fábricas. Exceto esta nova condição introduzida pela empresa,
os restantes fatores relacionados com o negócio mantiveram-se constantes.
3.2. Iteração 2 33
Nesta fase o conjunto de dados a analisar é o mesmo que na iteração anterior, o dataset
Orders Recived. Por conseguinte, não existem novos aspetos para serem detalhados nesta
etapa.
Nesta fase de preparação dos dados, a abordagem foi semelhante à iteração anterior.
Face ao novos insights recolhidos, o dataset foi novamente preparado para potenciar a
previsão da quantidade de produtos encomendados por fábrica, através de métodos de
Machine Learning.
Deste modo, o dataset Orders Recived foi dividido em quatro subconjuntos de dados, através
da coluna Factory. Este atributo possuí apenas quatro valores distintos, cada um deles
referentes às fábrica sobre a qual a encomenda é realizada. Cada um dos novos datasets
sofreu o processamento efetuado na iteração anterior, remoção das colunas desnecessárias
para a elaboração do modelo preditivo, ficando apenas com duas colunas, Document Date e
Order Quantity, a qual continua a ser o target neste caso de estudo. De forma semelhante, e
com o objetivo de criar uma série temporal, o valor das datas foram agregados, somando
os valores da quantidade encomenda. Foi necessário criar novos registos com a data em
falta na coluna Document Date, preenchendo com o valor 0 a coluna Order Quantity, pois a
ausência de registos no dataset, significa ausência de encomendas nesse dia. Por último, os
dados foram ordenados no tempo.
Por fim, após este processamento dos dados, resultaram 4 datasets, cada um deles
constituído por 366 linhas e 2 colunas. Os conjuntos de dados originados foram renomeados,
de forma a manter o anonimato dos dados, a pedido da empresa, dando origem aos datasets
Factory A, Factory B, Factory C e Factory D.
3.2.4 Modelação
Para esta fase de modelação, as ferramentas utilizadas para a elaboração dos modelos
de Time Series foram as mesmas da iteração anterior, Auto-Arima, Prophet e Neural-Prophet.
Com o objetivo de manter a consistência do trabalho realizado, o método de desenvol-
vimento passou pela utilização da Rolling Window, com os mesmos parâmetros da fase de
modelação da iteração 1, mantendo assim, as 20 iterações do método Rolling Window ao
longo das previsões para 7/14/21 e 28 dias, ao longo dos quatro novos conjuntos de dados.
As métricas selecionadas para a fase de avaliação dos modelos também se mantiveram,
possibilitando assim a comparação dos resultados entre as duas iterações.
3.2. Iteração 2 34
3.2.5 Avaliação
Através da análise da tabela, podemos observar que mais uma vez, o Neural Prophet,
obteve os melhores resultados para cada uma das quatro fábricas distintas. Para o dataset
Factory A, o melhor resultado obtido foi a previsão para 7 dias, com um MAE de 333.52 e
um NMAE de 2.05%. Para o dataset Factory B, o melhor resultado obtido foi a previsão
para 14 dias, com um MAE de 625.34 e um NMAE de 5.88%, apesar de muito semelhante
à previsão apenas para 7 dias. Relativamente ao dataset Factory C, o melhor resultado foi a
previsão para 7 dias, com um MAE de 969.90 e um NMAE de 2.68%. Por fim, o dataset
Factory D, o melhor resultado obtido foi para previsão a 7 dias, com um MAE de 1462.07 e
um NMAE de 2.36%.
3.3. Considerações finais 36
Ao longo das duas iterações podemos observar que o algoritmo Neural Prophet proporcionou
os melhores resultados na globalidade das previsões, tanto para o dataset Order Quantity,
como para os dataset divididos por fábrica.
Outro aspeto fundamental nesta análise, consistiu na melhoria do valor do NMAE
entre as duas iterações. A divisão do conjunto de dados principal por fábrica é um dos
principais motivos para esse acontecimento. Sendo que, cada uma das fábrica possuí uma
periodicidade entre encomendas diferente, assim como, diferenças a nível das quantidades
encomendadas, a divisão do dataset, foi benéfica para os resultados obtidos pelo modelo.
Este processamento de dados permitiu aos modelos a detenção de padrões temporais
específicos, para cada uma das fábricas, traduzindo-se na melhoria dos resultados.
Neste caso de estudo é importante realçar a diferença dos resultados entre cada tipo de
previsão. Como seria expectável, quanto menor o espaço temporal da previsão, menor
seria o erro. Outro aspeto relevante neste caso de estudo, é o facto de o conjunto de dados
possuir registos de apenas um ano, traduzindo-se em apenas 366 linhas, no qual, padrões
relevantes, como a sazonalidade anual, não foram possíveis de obter.
Podemos concluir que a segunda iteração da metodologia permitiu obter melhores
resultados preditivos, especificamente para cada uma das fábricas.
No âmbito deste projeto não foi possível passar à fase de implementação dos modelos na
infraestrutura tecnológica da empresa. Assim, o trabalho desenvolvido teve como objetivo
a apresentação dos contributos alcançados, através das experiências realizadas, provando
a eficácia dos modelos utilizados, para a previsão do número de encomendas a 7/14/21 e
28 dias. No decorrer do projeto Produtech4S&C, existirá a probabilidade de implementar os
modelos preditivos, nas plataforma de gestão da empresa, provando a sua utilidade no
mundo industrial.
4
C a s o d e E s t u d o - P r e v i s ã o d o Te m p o d e P r o d u ç ã o
37
4.1. Iteração 1 38
4.1 Iteração 1
Nesta primeira iteração, foram realizadas a cinco primeiras fases da metodologia CRISP-
DM, com o objetivo de prever o tempo de produção de uma determinada encomenda.
Para esta fase, foi analisada a primeira fonte de dados fornecida pela empresa: Production
Orders. Este conjunto de dados é composto por 14614 registos, os quais foram recolhidos
4.1. Iteração 1 39
ao longo de 24 meses, desde dezembro de 2018 até dezembro de 2020. Cada um destes
registos, está relacionado com uma ordem de produção finalizada.
Este dataset é composto por cinco colunas diferentes: OrderID, Material, Order_quantity,
Start_order e End_order. Na tabela 9 é possível ver o resumo dos atributos do conjunto de
dados.
4.1.4 Modelação
4.1.5 Avaliação
Para avaliar os resultados preditivos, foram calculadas as médias das métricas dos 10
folds externos. Também foi adicionado um intervalo de confiança com base na distribuição
de t, com 95% de confiança, de modo a garantir a significância estatística de cada uma
das experiências. A tabela 10, mostra os resultados médios para a primeira iteração do
CRISP-DM.
Para cada uma das ferramentas selecionadas, a tabela mostra o algoritmo que obteve
melhores resultados durante o treino dos 10 folds (Melhor Algoritmo). Os resultados
obtidos também mostram os valores médios dos 10 folds externos e os seus intervalos de
confiança (MAE e NMAE)
Através dos resultados obtidos, os quais podemos observar na tabela acima, o melhor
resultado foi obtido pelo H20 AutoML, com uma média de erro de 3,70 dias, o que corresponde
4.2. Iteração 2 41
4.2 Iteração 2
Durante esta nova fase da compreensão do negócio, a empresa forneceu novos insights
sobre o processo de litografia, relevantes no âmbito deste caso de estudo. O processo
produtivo composto por diversas operações como por exemplo o corte ou a pintura das
folhas metálicas.
Cada uma destas operações, são realizadas num centro específico de operações, com a
possibilidade de envolver diferentes tipos de matérias-primas. Cada uma das operações de
produção está associada a um Order_ID, sendo também composto por um registo temporal
de início e fim da operação. O objetivo desta iteração do CRISP-DM, consiste em melhorar
os resultados da iteração anterior, através da previsão do tempo necessário a realizar
cada uma das operações de produção, em vez da previsão do tempo de produção das
encomendas.
Ao tentar prever este atributo, podemos estimar o tempo total necessário para concluir
a ordem de produção associada às operações definidas.
Para esta fase do CRISP-DM, foi analisado um novo dataset (Operations), diretamente
relacionado com as operações de produção associadas a uma ordem de produção específica.
Este conjunto de dados é composto por 40610 registos e 8 colunas. Cada uma das ordens
de produção tem entre uma e nove operações. O número mais comum de operações pela
qual uma ordem de produção passa, é de três. Na tabela 11 podemos ver a descrição dos
atributos do novo dataset.
4.2. Iteração 2 42
A criação do novo target, seguiu a mesma abordagem que na iteração anterior. Foi
criada uma coluna target, que consiste no número de dias que uma operação demora para
ser concluída. Neste caso em específico, como o dataset Operations é composto por dados
relativos ao horário de início e de fim de uma operação, calculamos a diferença entre estes
dois valores, de modo a obter a duração da operação. O resultado obtido, consiste nos
valores da coluna target, os quais, foram convertidos para um valor decimal, por exemplo
1,50 dias, correspondendo a um dia e meio que leva uma operação a ser concluída.
Relativamente à preparação dos dados, foram usadas transformações semelhantes à
iteração anterior. Primeiro foram removidos os registos com valores vazios, e de seguida,
foi utilizado o mesmo threshold para a remoção de outliers da variável target (operações que
registassem mais de 150 dias para serem concluídas, foram removidas). Este processo
apenas resultou na remoção de 12 registos.
Sendo que, várias operações de produção estão associadas ao mesmo pedido de produção,
não houve a necessidade de remover os registos com o Order_ID duplicado. Por outro lado,
houve a necessidade de remover os registos com Order_ID que não estavam presentes no
dataset Production Orders, utilizado na iteração anterior.
Por fim, a coluna Operation_quantity, passou por processo de standardização, e às colunas
categóricas (Order_ID, Operation_ID e Work_Center). Nesta fase o número de registos do dataset
passou de 40610 registo para 39225.
4.2.4 Modelação
4.2.5 Avaliação
Os resultados, nesta segunda iteração revelam que, de forma geral, esta abordagem
obteve piores resultados, quando comparados com os resultados obtidos na primeira
iteração. Mesmo comparando a melhor ferramenta AutoML, para esta iteração (H20
AutoML), que obteve MAE de 5,83 dias, este resultado é pior que todos os resultados
obtidos por todas as ferramentas da primeira iteração, na qual foi obtido um MAE entre
3,70 a 4,00 dias.
Estes resultados, sugerem que neste caso, prever o tempo de produção por meio da
previsão do tempo de operação, é menos eficaz que usar os modelos de Machine Learning
para prever o tempo total de produção.
Por fim, depois de analisar os resultados desta iteração com os especialistas da empresa,
foi possível concluir, que a degradação dos resultados foi causada por dois fatores: primei-
ramente, algumas operações podem ser executas simultaneamente em duas ou mais linhas
de produção, e a segunda razão, deve-se ao facto de que diferentes operações também
têm tempos diferentes de configuração da máquina, onde a operação irá ser realizada.
Estes registos relativos ao tempo de configuração da máquina, não são armazenados pela
empresa.
4.3. Iteração 3 44
4.3 Iteração 3
Para verificar se é possível melhorar os resultados obtidos, foi decidido realizar uma nova
etapa do CRISP-DM, utilizando em simultâneo ambos os conjuntos de dados, Production
Orders e Operations. Os dataset, foram intercalados ficando com apenas um registo por cada
Order_ID, mas com colunas adicionais, relativas às operações executadas por cada uma das
ordens de produção. Como os conjuntos de dados a serem usados são os mesmos que nas
iterações anteriores, a fase de compreensão do negócio e de compreensão dos dados foram
ignoradas para esta iteração.
4.3.2 Modelação
O processo de modelação desta iteração, foi similar às outras duas iterações do CRISP-
DM, na qual foram usadas as mesmas ferramentas de AutoML (AutoGluon, H2O AutoML,
rminer e TPOT).
4.3.3 Avaliação
A tabela 14, apresenta um resumo dos resultados preditivos obtidos, ao longo das
três etapas do CRISP-DM. Para cada uma das iterações, podemos observar os datasets
utilizados, assim como, as ferramentas de AutoML aplicadas e os respetivos algoritmos
que obtiveram os melhores resultados ao longo do treino com 10 folds. Os resultados são
apresentados através da média das métricas (MAE e NMAE), utilizadas para avaliar os
resultados de teste.
Após realizadas três diversas iterações do CRISP-DM, podemos observar, que os piores
resultados foram obtidos durante a segunda iteração, como podemos observar na tabela
Y, quando o objetivo passou por prever o tempo de produção final, utilizando apenas o
dataset Operations. Enquanto na primeira iteração a melhor ferramenta de AutoML, o H20
4.4. Considerações finais 46
AutoML, obteve um MAE médio de 3,70 dias, o melhor resultado na segunda iteração
obteve quase o dobro, mais concretamente, um MAE médio de 5.83 dias.
Como explicado anteriormente, a degradação dos resultados obtidos durante a segunda
iteração, deve-se ao facto, da falta de informação, relativa ao tempo que demora a preparar
uma máquina para outra operação, assim como, com a possibilidade de ocorrerem operações
em paralelo.
Tabela 14: Média dos resultados obtidos nas várias iterações do CRISP-DM.
Iteration Datasets AutoML Tool Best Algorithm MAE NMAE
AutoGluon Ensemble 4.00±0.15 3.46±0.26
H2O AutoML Stacked Ensemble 3.70±0.10 3.21±0.24
1 Orders
rminer Stacked Ensemble 3.98±0.12 3.45±0.27
TPOT Gradient Boosting 3.77±0.12 3.26±0.25
AutoGluon Ensemble 6.00±0.10 4.46±0.35
H2O AutoML Deep Learning 5.83±0.68 4.35±0.76
2 Operations
rminer SVM 6.51±0.11 4.82±0.38
TPOT Gradient Boosting 6.64±0.11 4.92±0.40
AutoGluon Ensemble 3.38±0.07 2.81±0.31
Orders
H2O AutoML Stacked Ensemble 3.03±0.04 2.53±0.29
3 and
rminer Stacked Ensemble 3.42±0.08 2.85±0.31
Operations
TPOT Gradient Boosting 3.17±0.08 2.64±0.29
A terceira iteração, onde os datasets Orders e Operantios foram intercalados, foi onde se
obteve os melhores resultados preditivos, com um MAE médio de 3.03 dias e um NMAE
de 2.53%, através do H20 AutoML. No entanto, nesta iteração, é possível observar que
todas as ferramentas alcançaram resultados médios melhores do que, nas outras duas
iterações. Isto deve-se ao facto, das transformações realizadas na etapa Preparação dos
Dados da metodologia CRISP-DM, através da utilização dos dados referentes às operações
individuais.
Por fim, em relação às ferramentas de AutoML utilizadas, podemos observar que o H20
AutoML, obteve os melhores resultados ao longo das três iterações.
5
Conclusão
Este último capítulo, consiste em apresentar uma visão global do trabalho realizado,
sintetizando os principais aspetos desenvolvidos ao longo desta dissertação. Dividido em
três subcapítulos, na primeira parte, Síntese do Trabalho Realizado, é descrito brevemente
o trabalho realizado ao longo deste documento. Seguidamente os contributos alcançados e
por último, são identificados os próximos passos no âmbito deste projeto.
47
5.2. Contributos 48
5.2 Contributos
Alzubi, J., Nayyar, A., and Kumar, A. (2018). Machine learning from theory to algorithms:
An overview. Journal of Physics: Conference Series, 1142:012012.
Arrieta, A. B., Díaz-Rodríguez, N., Del Ser, J., Bennetot, A., Tabik, S., Barbado, A.,
García, S., Gil-López, S., Molina, D., Benjamins, R., et al. (2020). Explainable
artificial intelligence (xai): Concepts, taxonomies, opportunities and challenges toward
responsible ai. Information fusion, 58:82–115.
Bontempi, G., Ben Taieb, S., and Borgne, Y.-A. L. (2012). Machine learning strategies for
time series forecasting. In European business intelligence summer school, pages 62–77.
Springer.
Briot, J.-P., Hadjeres, G., and Pachet, F. (2017). Deep learning techniques for music
generation - a survey.
Chauhan, V. K., Dahiya, K., and Sharma, A. (2019). Problem formulations and solvers
in linear svm: a review. Artificial Intelligence Review, 52(2):803–855.
Cortez, P., Pereira, P. J., and Mendes, R. (2020). Multi-step time series prediction
intervals using neuroevolution. Neural Comput. Appl., 32(13):8939–8953.
Ferreira, L., Pilastri, A., Martins, C. M., Pires, P. M., and Cortez, P. (2021). A comparison
of automl tools for machine learning, deep learning and xgboost. In 2021 International
Joint Conference on Neural Networks (IJCNN), pages 1–8.
Feurer, M., Klein, A., Eggensperger, K., Springenberg, J., Blum, M., and Hutter, F. (2015).
Efficient and robust automated machine learning. Advances in neural information
processing systems, 28.
49
Referências Bibliográficas 50
Gelper, S., Fried, R., and Croux, C. (2010). Robust forecasting with exponential and
holt–winters smoothing. Journal of forecasting, 29(3):285–300.
Goodfellow, I. (2016). Nips 2016 tutorial: Generative adversarial networks. arXiv preprint
arXiv:1701.00160.
Hastie, T., Tibshirani, R., Friedman, J. H., and Friedman, J. H. (2009). The elements of
statistical learning: data mining, inference, and prediction, volume 2. Springer.
He, X., Zhao, K., and Chu, X. (2021). Automl: A survey of the state-of-the-art. Knowledge-
Based Systems, 212:106622.
Iorkyase, E., Tachtatzis, C., Glover, I., Lazaridis, P., Upton, D., Saeed, B., and Atkinson, R.
(2019). Improving rf-based partial discharge localization via machine learning ensemble
method. IEEE Transactions on Power Delivery.
Jain, A. K. (2010). Data clustering: 50 years beyond k-means. Pattern recognition letters,
31(8):651–666.
Lasi, H., Fettke, P., Kemper, H.-G., Feld, T., and Hoffmann, M. (2014). Industry 4.0.
Business & information systems engineering, 6(4):239–242.
LeCun, Y., Bengio, Y., and Hinton, G. (2015). Deep learning. nature, 521(7553):436–444.
Lingitz, L., Gallina, V., Ansari, F., Gyulai, D., Pfeiffer, A., Sihn, W., and Monostori, L.
(2018). Lead time prediction using machine learning algorithms: A case study by a
semiconductor manufacturer. Procedia CIRP, 72:1051–1056.
Loh, W.-Y. (2011). Classification and regression trees. Wiley interdisciplinary reviews:
data mining and knowledge discovery, 1(1):14–23.
Lu, Y. (2017). Industry 4.0: A survey on technologies, applications and open research
issues. Journal of industrial information integration, 6:1–10.
Makkar, S., Devi, G., and Solanki, V. K. (2019). Applications of machine learning
techniques in supply chain optimization. In International Conference on Intelligent
Computing and Communication Technologies, pages 861–869. Springer.
Matloff, N. (2017). Statistical regression and classification: from linear models to machine
learning. Chapman and Hall/CRC.
Matos, L. M., Azevedo, J., Matta, A., Pilastri, A., Cortez, P., and Mendes, R. (2022). Ca-
tegorical attribute transformation environment (cane): A python module for categorical
to numeric data preprocessing. Software Impacts, 13:100359.
Referências Bibliográficas 51
Mechelli, A. and Viera, S. (2019). Machine learning: methods and applications to brain
disorders. Academic Press.
Mohri, M., Rostamizadeh, A., and Talwalkar, A. (2018). Foundations of machine learning.
MIT press.
Myles, A. J., Feudale, R. N., Liu, Y., Woody, N. A., and Brown, S. D. (2004). An
introduction to decision tree modeling. Journal of Chemometrics: A Journal of the
Chemometrics Society, 18(6):275–285.
Nasir, Y., He, J., Hu, C., Tanaka, S., Wang, K., and Wen, X. (2021). Deep reinforcement
learning for constrained field development optimization in subsurface two-phase flow.
Frontiers in Applied Mathematics and Statistics, 7:689934.
Okoshi, C. Y., Pinheiro de Lima, E., and Gouvea Da Costa, S. E. (2019). Performance cause
and effect studies: Analyzing high performance manufacturing companies. International
Journal of Production Economics, 210:27–41.
Oliveira, N., Cortez, P., and Areal, N. (2017). The impact of microblogging data for stock
market prediction : Using Twitter to predict returns , volatility , trading volume and
survey sentiment indices. Expert Systems With Applications, 73:125–144.
Olson, R. S., Bartley, N., Urbanowicz, R. J., and Moore, J. H. (2016). Evaluation of a
tree-based pipeline optimization tool for automating data science.
Samuel, A. L. (1967). Some studies in machine learning using the game of checkers.
iirecent progress. IBM Journal of research and development, 11(6):601–617.
Referências Bibliográficas 52
Shafiq, S. I., Sanin, C., Toro, C., and Szczerbicki, E. (2015). Virtual engineering object
(veo): Toward experience-based design and manufacturing for industry 4.0. Cybernetics
and Systems, 46(1-2):35–50.
Siami-Namini, S., Tavakoli, N., and Namin, A. S. (2018). A comparison of arima and
lstm in forecasting time series. In 2018 17th IEEE international conference on machine
learning and applications (ICMLA), pages 1394–1401. IEEE.
Su, X., Yan, X., and Tsai, C.-L. (2012). Linear regression. Wiley Interdisciplinary Reviews:
Computational Statistics, 4(3):275–294.
Tjahjono, B., Esplugues, C., Ares, E., and Pelaez, G. (2017). What does industry 4.0
mean to supply chain? Procedia manufacturing, 13:1175–1182.
Vaidya, S., Ambad, P., and Bhosle, S. (2018). Industry 4.0–a glimpse. Procedia manufac-
turing, 20:233–238.
Webb, G. I., Keogh, E., and Miikkulainen, R. (2010). Naïve bayes. Encyclopedia of
machine learning, 15:713–714.
Wirth, R. (2000). Crisp-dm: Towards a standard process model for data mining. In
Proceedings of the Fourth International Conference on the Practical Application of
Knowledge Discovery and Data Mining, pages 29–39.
d f = d f . d r o p ( c o l u m n s = [ ’ S o l d − T o P a r t y ’ , ’ Name 1 ’ , ’ S a l e s D o c u m e n t ’ , ’
P u r c h a s e o r d e r no . ’ , ’ M a t e r i a l ’ , ’ D e s c r i p t i o n ’ , ’ D e l i v e r y D a t e ’ , ’
C r e a t e d By ’ ] )
d f 2 0 2 0 [ ’ D i a s ’ ] = pd . t o _ d a t e t i m e ( d f 2 0 2 0 [ ’ D i a s ’ ] , d a y f i r s t = T r u e )
df2020 = df2020 . s o r t _ v a l u e s ( by = ’ D i a s ’ ) . r e s e t _ i n d e x ( drop = True )
d f [ ’ D o c u m e n t D a t e ’ ] = pd . t o _ d a t e t i m e ( d f [ ’ D o c u m e n t D a t e ’ ] , d a y f i r s t = True )
# Groupby Dia
d f _ g b = d f . g r o u p b y ( d f [ ’ D o c u m e n t D a t e ’ ] . d t . d a t e ) . sum ( ) . r e s e t _ i n d e x ( d r o p =
False )
d f = pd . D a t a F r a m e ( d f _ g b )
d f 2 0 2 0 = pd . D a t a F r a m e ( d f 2 0 2 0 )
# Formataçao
df2020 . rename ( columns ={ ” D i a s ” : ” Document Date ” } , i n p l a c e = T r u e )
df2020 [ ” Document Date ” ] = df2020 [ ” Document Date ” ] . a s t y p e ( ” s t r ” )
d f _ t e s t = pd . m e r g e ( d f , d f 2 0 2 0 , on = ” D o c u m e n t D a t e ” , how = ” o u t e r ” )
d f _ t e s t [ ” D o c u m e n t D a t e ” ] = pd . t o _ d a t e t i m e ( d f _ t e s t [ ” D o c u m e n t D a t e ” ] )
d f _ t e s t . s o r t _ v a l u e s ( by = ’ Document Date ’ ) . r e s e t _ i n d e x ( drop = True )
d f _ t e s t = d f _ t e s t . g r o u p b y ( [ ’ D o c u m e n t D a t e ’ ] ) . a p p l y ( l a m b d a x : x [~ x [ ’ D o c u m e n t
D a t e ’ ] . d u p l i c a t e d ( ) | ~x [ ’ O r d e r Q u a n t i t y ’ ] . i s n a ( ) ] )
df = d f _ t e s t . r e s e t _ i n d e x ( drop = True )
df [ ’ Order Quantity ’ ] = df [ ’ Order Quantity ’ ] . f i l l n a (0)
53
A.1. Código Python 54
d e f h o l d ( y , r a t i o =2 / 3 , mode = ” r o l l i n g ” , i t = 1 , w i n d o w = 1 0 , i n c r e m e n t = 1 ) :
A L L I T R = None
V A L = None
NSIZE = l e n ( y )
i f mode == ” i n c r e m e n t a l ” o r mode == ” r o l l i n g ” :
aux = window + i n c r e m e n t * ( i t − 1)
aux = min ( aux , NSIZE )
i f mode == ” r o l l i n g ” :
i a u x = max ( ( a u x − w i n d o w + 1 ) , 1 )
else :
iaux = 1
ALLTR = r a n g e ( i a u x , aux )
end = aux + r a t i o
e n d = m i n ( end , N S I Z E )
iend = aux + 1
i f i e n d < end :
TS = r a n g e ( i e n d , e n d )
else :
TS = None
r e t u r n { ” t r ” : ALLTR , ” i t r ” : A L L I T R , ” v a l ” : VAL , ” t s ” : TS }
t r a i n i n g S i z e = 192
testSize = 8
ratio = testSize
stepSize = 8
# t o t a l L e n g h t = df . shape [ 0 ]
mode = ” r o l l i n g ”
def r u n n e u r a l p r o p h e t ( data , i t e r a t i o n s ) :
m a x _ v a l u e = d a t a [ ’ y ’ ] . max ( )
m i n _ v a l u e = d a t a [ ’ y ’ ] . min ( )
denominator = max_value − min_value
A.1. Código Python 55
MAEVals = [ ]
NMAEVals = [ ]
MSEVals = [ ]
for i in trange ( i t e r a t i o n s ) :
h o l d s = h o l d ( d a t a [ [ ’ y ’ ] ] , r a t i o , mode , i + 1 , t r a i n i n g S i z e ,
stepSize )
print ( ’ holds ’ )
p r i n t ( ” I t e r a t i o n ” , i +1 , ” o f ” , i t e r a t i o n s , ” TR : ” , h o l d s [ ’ t r
’ ] , ” TS : ” , h o l d s [ ’ t s ’ ] )
t r = data . i l o c [ holds [ ’ t r ’ ] ] . r e s e t _ i n d e x ( drop = True )
ts = data . i l o c [ holds [ ’ ts ’ ] ] . r e s e t _ i n d e x ( drop = True )
m = NeuralProphet ()
m. f i t ( ts , f r e q = ”D” )
print ( tr )
p = m. p r e d i c t ( t s )
MAE = m e a n _ a b s o l u t e _ e r r o r ( t s [ ’ y ’ ] . v a l u e s . t o l i s t ( ) , p [ ’ y h a t 1 ’ ] )
NMAE = ( MAE / d e n o m i n a t o r ) * 100 # o d e n o m i n a d o r é c a l c u l a d o com o
maximo e minimo g l o b a l
MSE = m e a n _ s q u a r e d _ e r r o r ( t s [ ’ y ’ ] , p [ ’ y h a t 1 ’ ] )
y_true = ts [ ’y ’ ]. values
y_pred = p [ ’ yhat1 ’ ] . values
pyplot . p l o t ( y_true , l a b e l = ’ Actual ’ )
pyplot . p l o t ( y_pred , l a b e l = ’ P r e d i c t e d ’ )
pyplot . legend ( )
pyplot . show ( )
f i g _ f o r e c a s t = m. p l o t ( p )
f i g _ c o m p o n e n t s = m. p l o t _ c o m p o n e n t s ( p )
f i g _ m o d e l = m. p l o t _ p a r a m e t e r s ( p )
M A E V a l s . a p p e n d ( MAE )
N M A E V a l s . a p p e n d ( NMAE )
A.1. Código Python 56
M S E V a l s . a p p e n d ( MSE )
return dfFinal
# production
df = pd . r e a d _ c s v ( ’ O r d e r s . c s v ’ , s e p = ” ; ” )
df = d f [ [ ’ Ordem ’ , ’ M a t e r i a l ’ , ’ Q t d . c o n f i r m a d a ’ , ’ I n í c . r e a l ’ , ’ D t a R e a l F i m ’ ] ]
df = d f . rename ( c o l u m n s = { ” I n í c . r e a l ” : ” I n i c _ O r d e m ” , ” D t a R e a l F i m ” : ” Fim_Ordem ” ,
” Qtd . c o n f i r m a d a ” : ” Qtd_Ordem ” } )
df = df . dropna ( ) . r e s e t _ i n d e x ( drop = True )
df [ ” Qtd_Ordem ” ] = d f [ ” Qtd_Ordem ” ] . s t r . r e p l a c e ( ’ ’ , ’ ’ )
df [ ’ Qtd_Ordem ’ ] = d f [ ’ Qtd_Ordem ’ ] . a s t y p e ( f l o a t )
df . head ( 3 )
# operations
d f 1 = pd . r e a d _ c s v ( ’ O p e r a t i o n s . c s v ’ , s e p = ” ; ” )
d f 1 = d f 1 [ [ ’ Ordem ’ , ’ O p e r a ç ã o ’ , ’ C e n t r o d e t r a b a l h o ’ , ’ Q u a n t i d a d e o p e r a ç ã o
( MEINH ) ’ , ’ D a t a i n í c i o r e a l d e e x e c u ç ã o ’ , ’ D a t a f i m r e a l d a e x e c u ç ã o ’ , ’
Hora i n í c i o r e a l de e x e c u ç ã o ’ , ’ Hora f i m r e a l da e x e c u ç ã o ’ ] ]
d f 1 = d f 1 . r e n a m e ( c o l u m n s = { ” Q u a n t i d a d e o p e r a ç ã o ( MEINH ) ” : ” Q n t _ O p e r a c a o ” , ”
D a t a i n í c i o r e a l de e x e c u ç ã o ” : ” D _ I n i c _ O p e r a c a o ” ,
” D a t a f i m r e a l da e x e c u ç ã o ” : ” D _ F im _ O p e r a ca o ” , ”
Hora i n í c i o r e a l de e x e c u ç ã o ” : ” H _ I n i c _ O p e r a c a o ”
,
” Hora f i m r e a l da e x e c u ç ã o ” : ” H_Fim_Operacao ” } )
# merge o p e r a t i o n s and p r o d u c t i o n
d f _ m e r g e = pd . m e r g e ( d f , d f 1 , on = ’ Ordem ’ )
df_merge . head ( 3 )
# combine d a t e and t i m e
d f _ m e r g e [ ’ D T _ I n i c _ O p e r a c a o ’ ] = pd . t o _ d a t e t i m e ( d f _ m e r g e [ ’ D _ I n i c _ O p e r a c a o ’ ] +
’ ’ + df_merge [ ’ H_Inic_Operacao ’ ] )
d f _ m e r g e [ ’ D T _ F i m _ O p e r a c a o ’ ] = pd . t o _ d a t e t i m e ( d f _ m e r g e [ ’ D _ F i m _ O p e r a c a o ’ ] + ’
’ + df_merge [ ’ H_Fim_Operacao ’ ] )
A.1. Código Python 57
# change t y p e s
df_merge [ ’ Operação ’ ] = df_merge [ ’ Operação ’ ] . astype ( s t r )
# label encoding
label_encoder = preprocessing . LabelEncoder ()
df_merge [ ’ Operação ’ ] = l a b e l _ e n c o d e r . f i t _ t r a n s f o r m ( df_merge [ ’ Operação ’ ] )
d f _ m e r g e [ ’ C e n t r o de t r a b a l h o ’ ] = l a b e l _ e n c o d e r . f i t _ t r a n s f o r m ( d f _ m e r g e [ ’
C e n t r o de t r a b a l h o ’ ] )
df_merge . head ( 3 )
# c r e a t e t a r g e t column
df_merge [ ’ D e l t a ’ ] = df_merge [ ’ DT_Fim_Operacao ’ ] − df_merge [ ’
DT_Inic_Operacao ’ ]
d f _ m e r g e [ ’ D e l t a ’ ] = d f _ m e r g e [ ’ D e l t a ’ ] / np . t i m e d e l t a 6 4 ( 1 , ’ D ’ )
df_merge [ ’ D e l t a ’ ] = df_merge [ ’ D e l t a ’ ] + 1
df_merge . head ( 3 )
d f _ m e r g e [ ’ I n i c _ O r d e m ’ ] = pd . t o _ d a t e t i m e ( d f _ m e r g e [ ’ I n i c _ O r d e m ’ ] , e r r o r s = ’
coerce ’ , d a y f i r s t = True )
d f _ m e r g e [ ’ F i m _ O r d e m ’ ] = pd . t o _ d a t e t i m e ( d f _ m e r g e [ ’ F i m _ O r d e m ’ ] , e r r o r s = ’
coerce ’ , d a y f i r s t = True )
df_merge = df_merge . dropna ( ) . r e s e t _ i n d e x ( drop = True )
d f _ m e r g e [ ’ D e l t a T ’ ] = d f _ m e r g e [ ’ Fim_Ordem ’ ] − d f _ m e r g e [ ’ I n i c _ O r d e m ’ ]
d f _ m e r g e [ ’ D e l t a T ’ ] = d f _ m e r g e [ ’ D e l t a T ’ ] / np . t i m e d e l t a 6 4 ( 1 , ’ D ’ )
df_merge . head ( 3 )
# pivot table
p i v o t = d f 1 [ [ ’ Ordem ’ , ’ O p e r a ç ã o ’ ] ] . p i v o t ( i n d e x = ’ Ordem ’ , c o l u m n s = ’ O p e r a ç ã o ’ ,
values = ’ Operação ’ ) . f i l l n a ( 0 ) . r e s e t _ i n d e x ( )
p i v o t . d r o p ( c o l u m n s = [ ’ Ordem ’ ] , i n p l a c e = T r u e )
p i v o t [ p i v o t != 0] = 1
pivot = pivot . astype ( int )
# group o p e r a t i o n s by o r d e r
d f 1 _ g r o u p = d f 1 . g r o u p b y ( [ ’ Ordem ’ ] ) . sum ( )
df1_group = df1_group . drop ( columns =[ ’ Operação ’ ] ) . r e s e t _ i n d e x ( drop = F a l s e )
d f 2 = pd . m e r g e ( p i v o t , d f 1 _ g r o u p , l e f t _ i n d e x = T r u e , r i g h t _ i n d e x = T r u e )
# df2 = df2 . drop ( columns =[ ’ i n d e x ’ ] )
c o l s = df2 . columns . t o l i s t ( )
cols = cols [ −1:] + cols [: −1]
df2 = df2 [ cols ]
A.1. Código Python 58
d f _ f i n a l = d f _ m e r g e . m e r g e ( d f 2 , how = ” l e f t ” , on = ” Ordem ” )
d f _ f i n a l . d r o p ( c o l u m n s = [ ’ O p e r a ç ã o ’ , ’ C e n t r o de t r a b a l h o ’ ,
’ Qnt_Operacao_x ’ , ’ Qnt_Operacao_y ’ , ’ DT_Inic_Operacao ’ , ’
DT_Fim_Operacao ’ , ’ D e l t a ’ ] , i n p l a c e = True )
d f _ f i n a l . drop ( d f _ f i n a l [ d f _ f i n a l [ ’ DeltaT ’ ] < 0 ] . index , i n p l a c e = True )
d f _ f i n a l . drop ( d f _ f i n a l [ d f _ f i n a l [ ’ DeltaT ’ ] > 150]. index , i n p l a c e = True )
d f _ f i n a l . d r op _ du p li c at e s ( i n p l a c e = True )
d f _ f i n a l . r e s e t _ i n d e x ( drop = True , i n p l a c e = True )
d f _ f i n a l . head ( 3 )
# n o r m a l i z e qtd_ordem
scaler = StandardScaler ()
s c a l e r . f i t ( pd . D a t a F r a m e ( d f _ f i n a l [ ” Q t d _ O r d e m ” ] ) )
d f _ f i n a l [ ” Q t d _ O r d e m ” ] = pd . D a t a F r a m e ( s c a l e r . t r a n s f o r m ( pd . D a t a F r a m e ( d f _ f i n a l
[ ” Qtd_Ordem ” ] ) ) )
# apply idf
c o l s = [ ” Ordem ” , ” M a t e r i a l ” ]
d f _ f i n a l = cane . i d f ( d f _ f i n a l , columns_use = c o l s )
d f _ f i n a l . t o _ c s v ( ” p r o d u c t i o n _ o r d e r s . csv ” , sep =” , ” , i n d e x = F a l s e )
c o l s _ t o _ d r o p = [ ” Fim_Ordem ” ]
f o l d 9 = f o l d 9 . drop ( columns = c o l s _ t o _ d r o p )
f o l d 1 0 = f o l d 1 0 . drop ( columns = c o l s _ t o _ d r o p )
folds = [ fold1 , fold2 , fold3 , fold4 , fold5 , fold6 , fold7 , fold8 , fold9 ,
fold10 ]
i m p o r t a u t o g l u o n as ag
from autogluon . t a b u l a r import TabularDataset , T a b u l a r P r e d i c t o r
target = ” DeltaT ”
folds = [ fold1 , fold2 , fold3 , fold4 , fold5 , fold6 , fold7 , fold8 , fold9 ,
fold10 ]
m e t r i c s = pd . D a t a F r a m e ( c o l u m n s = [ ’ f o l d ’ , ’ m o d e l _ i d ’ , ’ mae ’ , ’ nmae ’ ] )
f o l d _ f o l d e r = ” ./ f o l d ” + s t r ( i + 1)
folds = [ fold1 , fold2 , fold3 , fold4 , fold5 ,
fold6 , fold7 , fold8 , fold9 , fold10 ]
test_df = folds [ i ]
t e s t = h 2o . H2OFrame ( t e s t _ d f )
del folds [ i ]
t r a i n _ d f = pd . c o n c a t ( f o l d s )
t r a i n = h 2o . H2OFrame ( t r a i n _ d f )
x = t r a i n . columns
y = target
x . remove ( y )
x . remove ( ” Fim_Ordem ” )
a m l = H2OAutoML (
seed =42 ,
s o r t _ m e t r i c = ” MAE ” ,
n f o l d s =5 ,
# exclude_algos =[” DeepLearning ”] ,
A.1. Código Python 61
m a x _ r u n t i m e _ s e c s =3600 ,
)
aml . t r a i n ( x =x , y =y , t r a i n i n g _ f r a m e = t r a i n )
l b = aml . l e a d e r b o a r d . a s _ d a t a _ f r a m e ( )
lb . to_csv ( f o l d _ f o l d e r + ”/ leaderboard . csv ” , index = False )
p e r f = aml . t r a i n i n g _ i n f o
p e r f = j s o n . dumps ( p e r f )
f = open ( f o l d _ f o l d e r + ” / p e r f . j s o n ” , ”w” )
f . write ( perf )
f . close ()
h2 o . d o w n l o a d _ m o d e l ( a m l . l e a d e r , p a t h = f o l d _ f o l d e r )
p r e d s = aml . l e a d e r . p r e d i c t ( t e s t )
mae = m e a n _ a b s o l u t e _ e r r o r ( t e s t [ y ] . a s _ d a t a _ f r a m e ( ) , p r e d s . a s _ d a t a _ f r a m e
() [ ’ predict ’ ])
nmae = mae / ( max ( t e s t . a s _ d a t a _ f r a m e ( ) [ y ] ) − m i n ( t e s t . a s _ d a t a _ f r a m e ( ) [ y
]) )
m e t r i c s = m e t r i c s . append ( { ’ f o l d ’ : ( i +1) , ’ model_id ’ : l b [ ” model_id ” ] [ 0 ] ,
’ mae ’ : mae , ’ nmae ’ : nmae } , i g n o r e _ i n d e x = T r u e )
h2 o . c l u s t e r ( ) . s h u t d o w n ( )
import time
time . sleep (5)
label_column = ’ DeltaT ’
m e t r i c = ” MAE ”
task = ” reg ”
r e s u l t s <− d a t a . f r a m e ( m a t r i x ( n c o l = 6 , n r o w = 0 ) )
c o l _ n a m e s <− c ( ” t a r g e t ” , ” t o o l ” , ” m o d e l ” , ” mae ” , ” nmae ” , ” t i m e ” )
c o l n a m e s ( r e s u l t s ) <− c o l _ n a m e s
for ( x in 0:9) {
f o l d _ f o l d e r = p a s t e ( ” . / f o l d ” , as . c h a r a c t e r ( x +1) , sep =” ” )
folds = l i s t ( fold1 , fold2 , fold3 , fold4 , fold5 , fold6 , fold7 , fold8 ,
fold9 , fold10 )
t e s t _ d f = f o l d s [ [ ( x +1) ] ]
f o l d s = f o l d s [ −( x +1) ]
t r a i n _ d f <− d o . c a l l ( r b i n d , f o l d s )
i n p u t s = n c o l ( t r a i n _ d f ) −1
t r a i n _ d f [ i s . na ( t r a i n _ d f ) ] = 0
t e s t _ d f [ i s . na ( t e s t _ d f ) ] = 0
sm= m p a r h e u r i s t i c ( m o d e l = ” a u t o m l 3 ” , n =NA , t a s k = t a s k , i n p u t s = i n p u t s )
method =c ( ” k f o l d ” ,5 ,123)
s e a r c h = l i s t ( s e a r c h =sm , s m e t h o d = ” a u t o ” , m e t h o d = m e t h o d , m e t r i c = m e t r i c , c o n v e x
=0)
M= f i t ( D e l t a T ~ . , d a t a = t r a i n _ d f , m o d e l = ” a u t o ” , s e a r c h = s e a r c h , f d e b u g = TRUE )
P= p r e d i c t ( M, t e s t _ d f )
mae = r o u n d ( m m e t r i c ( t e s t _ d f $ D e l t a T , P , m e t r i c = m e t r i c ) , 2 )
nmae = r o u n d ( m m e t r i c ( t e s t _ d f $ D e l t a T , P , m e t r i c = ” NMAE ” ) , 2 )
b e s t _ m o d e l = M@model
A.1. Código Python 63
r e s u l t s [ n r o w ( r e s u l t s ) + 1 , ] = c ( l a b e l _ c o l u m n , ” r m i n e r ” , b e s t _ m o d e l , mae ,
nmae , M@time )
w r i t e ( perf , p a s t e ( f o l d _ f o l d e r , ” / p e r f . j s o n ” , sep = ” ” ) )
save (M, f i l e = p a s t e ( f o l d _ f o l d e r , ” / model . RData ” , sep = ” ” ) )
w r i t e . c s v ( r e s u l t s , ” . / m e t r i c s . c s v ” , r o w . names = F A L S E )
target = ’ DeltaT ’
c o l s _ t o _ d r o p = [ ” I n i c _ O r d e m ” , ” Fim_Ordem ” ]
f o l d 1 = f o l d 1 . drop ( columns = c o l s _ t o _ d r o p )
f o l d 2 = f o l d 2 . drop ( columns = c o l s _ t o _ d r o p )
f o l d 3 = f o l d 3 . drop ( columns = c o l s _ t o _ d r o p )
f o l d 4 = f o l d 4 . drop ( columns = c o l s _ t o _ d r o p )
f o l d 5 = f o l d 5 . drop ( columns = c o l s _ t o _ d r o p )
f o l d 6 = f o l d 6 . drop ( columns = c o l s _ t o _ d r o p )
f o l d 7 = f o l d 7 . drop ( columns = c o l s _ t o _ d r o p )
f o l d 8 = f o l d 8 . drop ( columns = c o l s _ t o _ d r o p )
f o l d 9 = f o l d 9 . drop ( columns = c o l s _ t o _ d r o p )
f o l d 1 0 = f o l d 1 0 . drop ( columns = c o l s _ t o _ d r o p )
A.1. Código Python 64
folds = [ fold1 , fold2 , fold3 , fold4 , fold5 , fold6 , fold7 , fold8 , fold9 ,
fold10 ]
del folds [ i ]
t r a i n _ d f = pd . c o n c a t ( f o l d s )
X _ t r a i n = t r a i n _ d f . drop ( columns =[ t a r g e t ] ) . to_numpy ( )
y _ t r a i n = t r a i n _ d f [ t a r g e t ] . to_numpy ( )
s t a r t = d a t e t i m e . now ( ) . s t r f t i m e ( ” %H : % M : % S ” )
tpot . f i t ( X_train , y_train )
e n d = d a t e t i m e . now ( ) . s t r f t i m e ( ” %H : % M : % S ” )
t 1 = d a t e t i m e . s t r p t i m e ( s t a r t , ” %H : % M : % S ” )
t 2 = d a t e t i m e . s t r p t i m e ( end , ” %H : % M : % S ” )
d u r a t i o n = ( t2 − t1 ) . seconds
t p o t . e x p o r t ( f o l d _ f o l d e r + ” / p i p e l i n e . py ” )
w i t h open ( f o l d _ f o l d e r + ’ / p i p e l i n e . py ’ ) as f :
x = True
while x :
line = f . readline ()
i f ” A v e r a g e CV s c o r e on t h e t r a i n i n g s e t was ” i n line :
mae = l i n e
x = False
t r a i n _ m a e = f l o a t ( mae . s p l i t ( ” : ” ) [ 1 ] [ 2 : ] . r e p l a c e ( ” \ n ” , ” ” ) )
mae = t p o t . s c o r e ( X _ t e s t , y _ t e s t )
nmae = 100 * ( mae / a b s ( max ( y _ t e s t ) − m i n ( y _ t e s t ) ) )
A.1. Código Python 65
perf = {
” t r a i n i n g _ s c o r e ” : train_mae ,
” t e s t _ s c o r e ” : mae ,
” start ” : start ,
” end ” : end
}
p e r f = j s o n . dumps ( p e r f )
f = open ( f o l d _ f o l d e r + ” / p e r f . j s o n ” , ”w” )
f . write ( perf )
f . close ()
r e s u l t s = r e s u l t s . a p p e n d ( { ’ f o l d ’ : ( i + 1 ) , ’ m o d e l ’ : ” ” , ’ mae ’ : mae , ’
nmae ’ : nmae , ’ t i m e ’ : d u r a t i o n } , i g n o r e _ i n d e x = T r u e )
r e s u l t s . to_csv ( ” ./ metrics . csv ” , index = False )