Redução de dimensionalidade em série para classificação

8

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:

  1. O DFFT em R é um método adequado para usar para minha finalidade? Qualquer informação sobre como funciona será apreciada.

  2. 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.

B_Miner
fonte
um comentário rápido que eu gostaria é que você poderia considerar a FFT como outro meio de obter recursos para cada cliente. Supondo que você tenha um vetor de recurso contendo estatísticas de resumo com base em cada série temporal de clientes e outros dados, você pode complementar seu vetor de recurso adicionando recursos derivados de uma FFT. Lembre-se de que é apropriado apenas se a janela sobre a qual você está falando a FFT estiver estacionária. Caso contrário, recursos de tempo como 1º e 2º derivativos podem ser mais apropriados.
precisa saber é o seguinte

Respostas:

12

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.

f(t)F(ω)tωF(ω) geralmente denota frequência: F (10) indica até que ponto o sinal flutua a 10 ciclos / segundo (ou quaisquer que sejam suas unidades temporais), enquanto F (20) indica até que ponto ele flutua duas vezes mais rápido. A transformação de Fourier "funciona" reconstruindo seu sinal original como uma soma ponderada de sinusóides (você realmente obtém "peso", geralmente chamado de amplitude, e um "deslocamento", normalmente chamado de fase, valores para cada componente de frequência). O artigo da wikipedia é um pouco complexo, mas há vários tutoriais decentes flutuando pela web.

NN/2N/2

Uma representação de Fourier pode ser útil se:

  1. Seu sinal é periódico e
  2. Informações úteis são codificadas na periodicidade do sinal.

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

  1. Há oscilação de 10 Hz consistente, mas de tamanho moderado, no sinal,
  2. Essa oscilação é duas vezes maior na primeira metade do sinal, mas totalmente ausente na segunda metade, e
  3. A oscilação está totalmente ausente no primeiro semestre, mas duas vezes maior que o número 1 no segundo semestre.
  4. (e assim por diante)

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.

Matt Krause
fonte
Oi Matt. Postei uma adição com um link. Parece que essas técnicas são usadas para redução de dimensão. Você sabe como usar transformada de wavelet discreta em R para reduzir a dimensão?
22613 B_Miner
Eu fiz algumas edições massivas; Eu sugiro ler o último bit primeiro!
precisa
Isso é ótimo, Matt, obrigado! Não tive a chance de ler completamente sua resposta, mas em breve o farei.
B_Miner
@ MattKrause, você parece ter um bom entendimento da transformação de Fourier. Eu tenho um problema semelhante, onde eu (com base no seu post aqui) acho que faz sentido fazer a transformação de Fourier como uma técnica de redução de dimensionalidade. No entanto, não consigo descobrir como fazê-lo na prática. Você pode dar uma olhada em stats.stackexchange.com/questions/176283/… ?
pir
Obrigado, @felbo! Estou lisonjeado, mas não tenho certeza se tenho muito a acrescentar.
Matt Krause
2

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ção detrend(por exemplo, com o pacote pracma ).

l <- length(x)
detrended <- detrend(x)
dft <- fft(detrended)/l
amplitude <- 2*abs(dft[1:l/2])
plot(amplitude, type='l')
quantiles <- quantile(amplitude)
Emile
fonte
1

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.

Bjorn Roche
fonte