Prever a duração da tarefa


9

Estou tentando criar um modelo de regressão que prevê a duração de uma tarefa. Os dados de treinamento que possuo consistem em aproximadamente 40 mil tarefas concluídas com estas variáveis:

  • Quem executou a tarefa (~ 250 pessoas diferentes)
  • Em que parte (subprojeto) do projeto a tarefa foi executada (~ 20 partes diferentes)
  • O tipo de tarefa
  • A data de início da tarefa (10 anos de dados)
  • Quanto tempo a pessoa que precisa executar a tarefa estima que levará
  • A duração real que esta tarefa levou para concluir

A duração pode variar de meia hora a algumas centenas de horas, mas é altamente inclinada para a direita (a maioria das tarefas é concluída em 10 horas). Em escala de log, a distribuição ainda está ligeiramente inclinada.

A previsão não precisa ser perfeita, mas estou tentando melhorar as estimativas das pessoas. Uma pergunta a fazer é "Que medida podemos usar o define beter ?" Penso que a melhor medida seria o erro médio quadrático (MSE), uma vez que pesa grandes erros muito piores que os pequenos.

Antes de me voltar para o aprendizado de máquina, tentei algumas abordagens simples, como ajustar a estimativa pelo erro médio ou mediano, ajustá-lo pelo erro médio / mediano agrupado por pessoa, agrupado por subprojeto, mas cada um deles teve um desempenho pior.

Com o aprendizado de máquina, um dos primeiros problemas que encontrei foi o número de variáveis ​​categóricas, pois para a maioria dos modelos elas precisam ser codificadas de alguma forma (por exemplo, um caso quente). Enfim, tentei aplicar alguns modelos lineares, por exemplo, com a descida do gradiente estocástico, minha abordagem seria:

  1. Codificação one-hot os recursos categóricos
  2. A data foi convertida em timestamps unix
  3. Normalize todos os recursos que ainda não estão entre 0 e 1
  4. Divida os dados em conjuntos de aprendizado e teste 80/20.
  5. Com a validação cruzada do Grid Search e o conjunto de aprendizado, tente encontrar os melhores hiper parâmetros e ajustar-se ao modelo.
  6. Prever com o conjunto de testes
  7. Calcular o erro / pontuação

Agora, notei que os resultados variavam bastante: em uma corrida, o MSE estava quase o dobro da outra (150 e 280). Outra coisa é que o MSE da estimativa das pessoas é de cerca de 80, então meu modelo tem um desempenho um pouco pior.

Durante meus esforços para melhorar o desempenho, me deparei com essa pergunta em que alguém sugere usar modelos de sobrevivência. Agora, sou pouco familiar com esses tipos de modelos, mas parecia promissor, mas durante meus testes iniciais com isso, ficou muito lento para meus propósitos (muito grande de um conjunto de dados).

Na mesma resposta do Datascience que sugeriu o uso dos modelos de sobrevivência (e da página da Wikipedia ), eles também mencionaram a regressão de Poisson, mas não tenho certeza de como aplicaria isso ao meu caso.

Para resumir uma longa história: Eu tenho apenas duas perguntas: 1. Minha abordagem ao usar o SGD foi 'correta' e você acha que posso melhorar os resultados com isso? 2. Outros modelos são mais adequados para esse tipo de previsão? Em caso afirmativo, você pode explicar um pouco como eu os usaria?


Um pouco fora de tópico, talvez, mas estamos interessados ​​em criar um conjunto para a estimativa da duração da tarefa, portanto, estávamos nos perguntando: existe uma chance de você compartilhar seu conjunto de dados (e modelo que acaba construindo)?
em

11
Infelizmente, após uma curta fase exploratória, o projeto foi enlatado. Também não é possível compartilhar o conjunto de dados. Nem tenho certeza de que ainda posso acessá-lo para ser honesto. Mas boa sorte! Vi e aprendi muito sobre ciência de dados em geral desde então, mas ainda não vi uma arquitetura adequada para essa tarefa.
Jurgy

11
Obrigado pela explicação! microsoft.com/en-us/research/uploads/prod/2019/01/… parece ter construído arquiteturas bem-sucedidas.
em

Muito interessante! Os recursos que eles usaram estão muito próximos do que eu pude usar. Embora suas tarefas sejam armazenadas apenas em quatro baldes bastante pequenos: <30m, 30m, 1h e> 1h. Eu me pergunto como seria o desempenho no meu caso, em que algumas tarefas ocorreram entre 1 a 4 horas e outras em algumas semanas. Se for possível, informe-me se você tiver êxito no seu projeto!
Jurgy

Respostas:


6

Eu acho que a análise que você fez foi boa.

Em relação ao procedimento de Análise de Sobrevivência, acho que usá-lo em seu cenário é bom o suficiente. Pode levar tempo, mas os resultados são bons e muito esclarecedores.

Como você aplicou a análise de sobrevivência nos dados, é necessário garantir que essas suposições sejam atendidas:

  1. Existem várias maneiras diferentes de estimar uma função de sobrevivência ou uma curva de sobrevivência. Existem vários métodos paramétricos populares usados ​​para modelar dados de sobrevivência e diferem em termos das suposições feitas sobre a distribuição dos tempos de sobrevivência na população. Algumas distribuições populares incluem as distribuições exponencial, Weibull, Gompertz e log-normal.

  2. Talvez a mais popular seja a distribuição exponencial, que pressupõe que a probabilidade de um participante sofrer o evento de interesse seja independente de quanto tempo essa pessoa ficou livre de eventos. Outras distribuições fazem suposições diferentes sobre a probabilidade de um indivíduo desenvolver um evento (isto é, pode aumentar, diminuir ou mudar ao longo do tempo). Mais detalhes sobre métodos paramétricos para análise de sobrevivência podem ser encontrados em Hosmer e Lemeshow e Lee e Wang1.

  3. Aqui, sobre dois métodos não paramétricos, que não fazem suposições sobre como a probabilidade de uma pessoa desenvolver o evento muda com o tempo. Usando métodos não paramétricos, estimamos e plotamos a distribuição de sobrevivência ou a curva de sobrevivência. As curvas de sobrevivência são frequentemente plotadas como funções de etapa, conforme mostrado na figura abaixo. O tempo é mostrado no eixo X e a sobrevivência (proporção de pessoas em risco) é mostrada no eixo Y. Observe que a porcentagem de participantes sobreviventes nem sempre representa a porcentagem de pessoas vivas (o que pressupõe que o resultado do interesse seja a morte). "Sobrevivência" também pode se referir à proporção que está livre de outro evento de resultado (por exemplo, porcentagem livre de IM ou doença cardiovascular), ou também pode representar a porcentagem que não apresenta um resultado saudável (por exemplo, remissão do câncer).

Você pode acessar este link para entender melhor.

Em relação à distribuição de Poisson , você plotou e verificou se os dados estão seguindo a distribuição de Poisson, como:

insira a descrição da imagem aqui

A distribuição de Poisson é um modelo apropriado se as seguintes suposições forem verdadeiras.

  • k é o número de vezes que um evento ocorre em um intervalo e k pode assumir os valores 0, 1, 2,….
  • A ocorrência de um evento não afeta a probabilidade de um segundo evento. Ou seja, os eventos ocorrem independentemente.
  • A taxa na qual os eventos ocorrem é constante. A taxa não pode ser mais alta em alguns intervalos e mais baixa em outros intervalos.
  • Dois eventos não podem ocorrer exatamente no mesmo instante; em vez disso, em cada sub-intervalo muito pequeno, exatamente um evento ocorre ou não.
  • A probabilidade de um evento em um pequeno sub-intervalo é proporcional à duração do sub-intervalo.

Ou

  • A distribuição de probabilidade real é dada por uma distribuição binomial e o número de tentativas é suficientemente maior que o número de sucessos que se está perguntando sobre

Se essas condições forem atendidas, você poderá usar o Modelo Poisson, acessar este link

Implementação disso em R , Python .

Finalmente, para responder às suas 2 perguntas:

  1. Sua abordagem está correta, não há problema em usar esse método, para melhorar seus resultados, você precisa trabalhar no recurso engg (derivando novas variáveis). Desde que você esteja considerando a duração como uma variável contínua (você executou essa transformação de log, que você declarou no início?)

  2. No seu cenário, acho que a Survival and Poisson oferece melhores resultados; se você acha que isso leva mais tempo, tente obter amostra de dados e concluir o seu trabalho. Se você está considerando o resultado como uma variável contínua, pode usar a Random Forest, XGBoost, todos os métodos usados ​​para prever uma variável contínua (mas, se você fosse, eu gastaria mais tempo ajustando Survival e Poisson e depois mudaria para outras técnicas de previsão)

Deixe-me saber se você tem algum problema!


1

Muito provavelmente, o SGD não é um fator limitante para você. Mas, você considerou adotar uma classificação em vez de uma abordagem de regressão? (Parece que você está prevendo valores reais em oposição a classes). Como você declara que a previsão não precisa ser perfeita, por que não tentar agrupar sua variável de resultado em compartimentos e prever os compartimentos? Você terá uma solução muito menos granular, mas poderá achar que funciona.


O objetivo principal é melhorar as estimativas, pois foi observado que algumas pessoas superestimam, enquanto outras costumam subestimar a duração. Mudá-lo para um problema de classificação em bin não alcançaria esse objetivo.
Jurgy

Ao converter as classificações em uma estimativa de duração da tarefa através da multiplicação com um escalar / número / coeficiente por classe, a duração pode ser estimada grosseiramente. Além disso, a classificação poderia ser usada para selecionar diferentes modelos ml dedicados a essa classe de tarefa específica para obter uma estimativa mais precisa. (mas essas duas etapas não estão listadas na resposta)
em
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.