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:
- Codificação one-hot os recursos categóricos
- A data foi convertida em timestamps unix
- Normalize todos os recursos que ainda não estão entre 0 e 1
- Divida os dados em conjuntos de aprendizado e teste 80/20.
- 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.
- Prever com o conjunto de testes
- 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?
fonte
Respostas:
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:
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.
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.
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:
A distribuição de Poisson é um modelo apropriado se as seguintes suposições forem verdadeiras.
Ou
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:
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?)
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!
fonte
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.
fonte