Eu estou procurando construir um modelo preditivo em que a variável de resultado seja binária e a entrada seja uma série temporal. Para torná-lo mais concreto, o modelo preverá se um cliente agita (deixou a empresa; codificado como 1 ou 0) com base no valor gasto com a empresa nos 60 dias anteriores. Portanto, os dados são um cliente por linha e as colunas são um fator de resultado (1 ou 0) e 60 colunas adicionais para o valor gasto no tempo t-1, t-2 .... t-60.
Aqui estão alguns dados de exemplo:
#create the data a series of length 60 and a class ID
sc <- read.table("http://kdd.ics.uci.edu/databases/synthetic_control/synthetic_control.data", header=F, sep="")
#binary class lable
classId <- as.factor(c(rep(0,300), rep(1,300)))
newSc <- data.frame(cbind(classId, sc))
newSc$ID<-seq(1,600,1)
O modelo real pode ter muitas dessas séries para cada cliente; portanto, preciso reduzir a dimensionalidade dos dados para a série; por exemplo, em vez de usar 60 valores, preciso reduzi-los a um punhado. É claro que posso usar a média, o mínimo, o máximo etc da série, mas tenho lido sobre o uso da Discreta Fourier Transform.
Questões:
O DFFT em R é um método adequado para usar para minha finalidade? Qualquer informação sobre como funciona será apreciada.
Assumindo que esta função R esteja correta, como você extrai apenas os coeficientes mais significativos para obter uma redução de dimensionalidade?
ADD: Parece haver um consenso de que usar o DFFT para redução de dimensão não é uma escolha sábia, mas parece que na mineração de dados, essa função, DWT e SVD são todos comumente usados: Mineração de Séries Temporais a partir da página 20.
Respostas:
Não tenho certeza se classificaria uma transformação de Fourier como uma técnica de redução de dimensionalidade em si , embora você possa usá-la dessa maneira.
Uma representação de Fourier pode ser útil se:
Por exemplo, suponha que você esteja registrando os sinais vitais de um paciente. O sinal elétrico do eletrocardiograma (ou o som de um estetoscópio) é um sinal de alta dimensão (digamos, mais de 200 amostras / segundo). No entanto, para algumas aplicações, você pode estar mais interessado na frequência cardíaca do sujeito , que provavelmente é o local do pico na FFT e, portanto, representável por um único dígito.
Uma grande limitação da FFT é que ela considera todo o sinal de uma só vez - não pode localizar alterações nele. Por exemplo, suponha que você observe o coeficiente associado a 10 ciclos / segundo. Você obterá valores de amplitude semelhantes se
Obviamente, não sei muito sobre o seu negócio, mas imagino que esses possam ser recursos muito relevantes. Outra grande limitação da FFT é que ela opera em uma única escala de tempo. Por exemplo, suponha que um cliente visite religiosamente sua empresa todos os dias: ele tem uma "frequência" de 0,5 visitas / dia (ou um período de 2 dias). Outro cliente também pode vir consistentemente por dois dias seguidos, tirar duas e depois visitar novamente nos próximos dois. Matematicamente, o segundo cliente está "oscilando" duas vezes mais lentamente que o primeiro, mas eu apostaria que esses dois têm a mesma probabilidade de agitar.
Uma abordagem de frequência de tempo ajuda a contornar esses problemas localizando alterações na frequência e no tempo. Uma abordagem simples é a FFT de curto prazo, que divide seu sinal em pequenas janelas e depois calcula a transformação de Fourier de cada janela. Isso pressupõe que o sinal está parado dentro de uma janela, mas muda através deles. A análise da wavelet é uma abordagem mais poderosa (e matematicamente rigorosa). Existem muitos tutoriais da Wavelet por aí - o encantador nome Wavelets for Kids é um bom lugar para começar, mesmo que seja um pouco demais para todas, exceto as crianças reais mais inteligentes. Existem vários pacotes wavelet para R, mas sua sintaxe é bastante direta (consulte a página 3 do pacote waveletdocumentação para um). Você precisa escolher uma wavelet apropriada para a sua aplicação - isso idealmente se parece com a flutuação do interesse no seu sinal, mas uma wavelet da Morlet pode ser um ponto de partida razoável. Como a FFT, a própria transformada wavelet não oferece muita redução de dimensionalidade. Em vez disso, representa o sinal original como uma função de dois parâmetros ("escala", que é análoga à frequência, e "tradução", que é semelhante à posição no tempo). Como os coeficientes da FFT, você pode descartar com segurança coeficientes cuja amplitude é próxima de zero, o que fornece uma redução de dimensionalidade eficaz.
Por fim, quero concluir perguntando se a redução de dimensionalidade é realmente o que você deseja aqui. As técnicas sobre as quais você está perguntando são essencialmente formas de reduzir o tamanho dos dados, preservando-os o mais fielmente possível. No entanto, para obter o melhor desempenho de classificação, geralmente queremos coletar e transformar os dados para tornar os recursos relevantes o mais explícitos possível, enquanto descartamos todo o resto.
Às vezes, a análise de Fourier ou Wavelet é exatamente o que é necessário (por exemplo, transformar um sinal de eletrocardiograma de alta dimensão em um único valor de freqüência cardíaca); outras vezes, você se sairia melhor com abordagens completamente diferentes (médias móveis, derivativos etc.). Recomendamos que você pense bem sobre o seu problema real (e talvez até faça um brainstorm com o pessoal de vendas / retenção de clientes para ver se eles têm alguma intuição) e use essas idéias para gerar recursos, em vez de tentar cegamente várias transformações.
fonte
Como Matt disse, não tenho certeza se o DFT produzirá recursos relevantes para o seu aplicativo. Mas, como você faz nesta pergunta , aqui está um código R para criar recursos para os quantis do DFT de um sinal 1D
x
, usando a funçãodetrend
(por exemplo, com o pacote pracma ).fonte
Eu não usaria a FFT aqui, a menos que você tenha algum modelo que sugira que seja a coisa certa a fazer e, pelas informações fornecidas, não vejo motivo para acreditar em simplesmente olhar para a FFT da seus dados são apropriados. Sugiro que, em vez de examinar a FFT, que provavelmente seja um beco sem saída, considere outras abordagens.
Métodos mais apropriados podem ser um filtro de média móvel (por exemplo, as vendas médias nos últimos N dias) ou um filtro de média móvel ponderada (o mesmo, exceto que mais peso é atribuído a valores que se acredita serem mais significativos, ou porque você tem um modelo / hipótese que apóie isso, ou dados reais que indicam que tem sido assim no passado.Por exemplo, você pode ponderar números mais recentes ou ponderar dados de segunda-feira porque possui dados que sugerem que as vendas de segunda-feira são preditivas para alguma razão).
Outra abordagem pode ser simplesmente usar regressão (especialmente regressão logística). Isso pode parecer tradicional e chato, mas funciona.
fonte