Aprendizado de máquina no trading: teoria, prática, negociação e não só - página 24

 

Alexey, tenho outra pergunta sobre sua função para peneirar os preditores - que intervalo de valores de retorno deve ter? Eu executei essa função de fitness nos meus dados com entradas aleatórias (fitness_f(runif(predictor_number, min = 0, max = 1))), vi resultados de 0 a 0,03. Também vejo no código que em caso de erro (zero entradas) a função retornará 0. Algo está errado aqui, GenSA tenta minimizar os resultados, ou seja, no final GenSA irá apenas chegar a zero entradas e parar. Talvez então devêssemos mudar o sinal do resultado da função de fitness para que a GenSA aja em sentido contrário?
Se a função fitness em algum ponto da otimização começar a retornar números negativos e quanto mais baixo eles forem, melhor - então tudo está bem agora.

 
Dr. Trader:

Alexey, eu tenho outra pergunta para a sua função de peneirar os preditores - que intervalo de valores de retorno deve ter? Eu executei essa função de fitness nos meus dados com entradas aleatórias (fitness_f(runif(predictor_number, min = 0, max = 1))), vi resultados de 0 a 0,03. Também vejo no código que em caso de erro (zero entradas) a função retornará 0. Algo está errado aqui, GenSA tenta minimizar os resultados, ou seja, no final GenSA irá apenas chegar a zero entradas e parar. Talvez então devêssemos mudar o sinal do resultado da função de fitness para que a GenSA aja em sentido contrário?
Se a função fitness em algum ponto da otimização começar a retornar números negativos e quanto mais baixo eles forem, melhor - então tudo está bem agora.

Essa é uma boa pergunta. Descobre tu.

Estou a escrever um artigo sobre este método e aqui está um extracto:


Diagrama de blocos do algoritmo baseado em informações mútuas corrigidas e busca estocástica de um subconjunto de preditores.


  • a) Categorizar o conjunto de dados de uma das formas conhecidas.
  • b) Avaliar os parâmetros do conjunto de dados como o número de linhas, preditores, número médio de níveis de preditores (se tiverem números de níveis diferentes) e com base nesses dados calcular o "número ótimo" de preditores no subconjunto final.
  • c) Inicializar um vetor de tipo numérico com o comprimento no número de variáveis de entrada do conjunto, usando números aleatórios distribuídos uniformemente no intervalo [0,1] e atribuir o limite inferior (0) e superior (1) dos valores vetoriais - o argumento da função SA.
  • d) Inicializar a função de avaliação de quantil de informação multinformática, a função de quantil de informação mútua e a função de adequação que combina todos os cálculos.
  • e) Defina o número de simulações de Monte Carlo para estimar os quantis do MI e WI; defina os quantis (ex. 0,9) para os valores de ruído do MI e WI.
  • f) Definir a hora ou o número de iterações do algoritmo. Quanto mais, melhor.
  • g) Execute o algoritmo, aguarde os resultados.


O ponto "b" precisa de ser esclarecido. O número ótimo de variáveis é um valor condicional que é calculado usando a fórmula:

optim_var_num < - log(x = tamanho_amostra / 100, base = redondo(níveis_médicos, 0))


A intuição é que, dado opressuposto de independência das variáveis de entrada, o número médio de níveis de uma variável deve ser elevado à potência necessária para obter um número total de níveis de interacção únicos, de modo a que cada uma delas tenha, em média, pelo menos n observações concentradas, onde n é tomado como 100.

Não podemos ter muitas variáveis de entrada com demasiados níveis, pois uma estimativa conservadora da frequência de observações sobre os níveis de entrada seria demasiado pequena para dar uma inferência estatística sobre a dependência da variável de saída em relação ao conjunto de níveis de entrada.

Ao definir o limiar acima do qual os valores vetoriais do número de variáveis de entrada serão convertidos para 1 (a bandeira de inclusão de índice de variáveis), fazemos um cálculo probabilístico:

limiar < - 1 - optim_var_num / número_preditor


Sua essência é que nós definimos o valor máximo de probabilidade para selecionar o número ótimo calculado de entradas. E esta lógica é verificada através da aplicação da distribuição binomial.

Por exemplo, tomemos os nossos dados: metade de todo o conjunto, que é utilizado para treinamento.

Temos 17.973 filas, 12 preditores, cada uma com 5 níveis. Aplicando as fórmulas acima, obtemos que o número ótimo de preditores é de 3.226.

Aplicando a fórmula de limiar para incluir um preditor no conjunto, obtemos 0,731.

Qual é o número mais provável de variáveis selecionadas a serem obtidas em uma distribuição binomial?


O máximo são 3 observações. Para ser mais preciso, 5 ^ 3.226 nos daria 178 níveis, o que acomodaria uma média de 100 observações cada.
 
Continua. O valor 0 na saída da função é o pior dos valores máximos. Se nenhum elemento do vetor par passar o limite, automaticamente o valor é 0. O melhor valor possível é -1. Significa que a saída é completamente determinista a partir do subconjunto de entradas.
 

Sim, eu encontrei um subconjunto de preditores com um valor de fitness negativo. Havia muitos preditores, vários milhares, limitei a gensa a apenas 2 iterações, demorei 8 horas :). O resultado da função fitness é de 6%. Na frente destes preditores com nnet eu tenho 45% de erro. Não é muito, não acho que a EA estaria em lucro. Eu coloquei um limite de 10 iterações novamente para encontrar um resultado melhor, corri-o, estive esperando por 24 horas, espero que a gensa alguma vez complete. Terei que experimentar a genética (biblioteca GA), ela funcionará mais rápido com vários fios (GA minimiza ao invés de maximizar o resultado, ou seja, o resultado da função de aptidão para GA deve mudar seu sinal). Vou continuar a fazer experiências.

Eu li vários artigos sobre o modelo de componentes principais e tentei ensinar o modelo não só a medir R^2 e maximizá-lo selecionando os preditores, mas também a testá-lo nos dados de frente. Está saindo meio ambíguo. Por um lado eu aumentei R^2 do modelo removendo pares correlacionados de preditores (função findCorrelation do bibiloteka caret), mas como ficou R^2 ao testar o modelo na frente de dados desta diminui. O milagre não aconteceu, o modelo PCA também está requalificado. Quero tentar uma estimativa de previsão mais complexa - dividir a amostra de treinamento em duas - para treinamento propriamente dito e para validação, treinar o modelo PCA, depois testar imediatamente na amostra de validação, retornar no mínimo R^2 como resultado final. Se tal função for usada para avaliação de um conjunto de preditores e maximização deste valor, então serão encontrados apenas os conjuntos de preditores que dão bons resultados sobre os dados treinados e novos. Temos de verificar isso.

Também devo ter entendido mal o texto daquele primeiro artigo sobre PCA neste tópico. Estava dizendo que o número de componentes deve ser escolhido para descrever 95% da variação, eu pensei que eles estavam falando sobre a precisão da previsão da variável alvo. Mas não é esse o caso, os componentes principais são construídos sem variáveis-alvo e a precisão de 95% é a exactidão com que os dados brutos são descritos usando esses mesmos componentes. E a precisão das previsões não tem nada a ver com isso.

 
Dr. Trader:

Sim, eu encontrei um subconjunto de preditores com um valor de fitness negativo. Havia muitos preditores, vários milhares, limitei a gensa a apenas 2 iterações, demorei 8 horas :). O resultado da função fitness é de 6%. Na frente destes preditores com nnet eu tenho 45% de erro. Não é muito, não acho que a EA estaria em lucro. Eu coloquei um limite de 10 iterações novamente para encontrar um resultado melhor, corri-o, estive esperando por 24 horas, espero que a gensa alguma vez complete. Terei que experimentar a genética (biblioteca GA), ela funcionará mais rápido com vários fios (GA minimiza ao invés de maximizar o resultado, ou seja, o resultado da função de aptidão para GA deve mudar seu sinal). Eu vou experimentar mais.

Li vários artigos sobre o modelo de componentes principais e tentei não só treinar o modelo para medir R^2 e maximizá-lo selecionando preditores, mas também para realmente testar o modelo nos dados de frontest. Está saindo meio ambíguo. Por um lado eu aumentei R^2 do modelo removendo pares correlacionados de preditores (função findCorrelation do bibiloteka caret), mas como ficou R^2 ao testar o modelo na frente de dados desta diminui. O milagre não aconteceu, o modelo PCA também está requalificado. Quero tentar uma estimativa de previsão mais complexa - dividir a amostra de treinamento em duas - para treinamento propriamente dito e para validação, treinar o modelo PCA, depois testar imediatamente na amostra de validação, retornar no mínimo R^2 como resultado final. Se tal função for usada para avaliação de um conjunto de preditores e maximização deste valor, então serão encontrados apenas os conjuntos de preditores que dão bons resultados sobre os dados treinados e novos. Vamos ter de verificar.

Além disso, eu devo ter entendido mal o texto daquele primeiro artigo sobre PCA neste tópico. Lá foi dito, que o número de componentes deveria ser escolhido para descrever 95% da variação, eu pensei que eles estavam falando sobre a precisão da previsão da variável alvo. Mas não é esse o caso, os componentes principais são construídos sem variáveis-alvo e a precisão de 95% é a exactidão com que os dados brutos são descritos usando esses mesmos componentes. E a precisão das previsões não tem nada a ver com isso.

Sim, acontece que você não entendeu.

O PCA pode ser aplicado como uma ferramenta independente, mas o artigo não discute isso.

O que é discutido é como filtrar o ruído de algum grande conjunto de preditores.

De acordo com o meu entendimento, isto é feito nos seguintes passos:

1. Y-aware. Isto é um escalonamento dos preditores, dependendo da variável alvo

2. Usando o algoritmo PCA, um conjunto de preditores é ordenado e a parte que explica 95% da variância é tomada.

2. ou assim (não descobri eu mesmo) usando o algoritmo PCA, um novo conjunto de preditores é construído multiplicando o original pelos coeficientes calculados (carregamento). Este conjunto está encomendado. Tomamos tantos destes novos vectores quantos os que explicam 95% da variação.

PS.

Vamos a publicações que o Y-aware é o novo peep no campo da filtragem de preditores de ruído.

Sucesso

 
SanSanych Fomenko:

2. Usando o algoritmo PCA, o conjunto de preditores é ordenado e a parte que explica 95% da variância é tomada.

Isto eu ainda não percebi. (Agora só vou escrever sobre a abordagem do y-aware, para não confundir com a outra). O artigo em si está aqui:http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Após o código"princ <- prcomp(dmTrain, centro = FALSO, escala. = FALSO)" há uma situação: os dados são lidos, escalados por Y, os componentes do PC são construídos. Esta função não limita o número de componentes - tantos quantos os preditores. A primeira coisa a fazer é selecionar apenas uma parte deles (é recomendado o suficiente para descrever 95% das variações). No próprio artigo o autor olhou para o gráfico sdev (algumas variações não especificadas) dos componentes, e disse que 2 ou 5 seriam suficientes, pois eles se destacam no gráfico. De alguma forma nada se destaca, o gráfico está a diminuir suavemente.

Há uma tabela sdev, o número de entradas nela é igual ao número de componentes. É possível calcular quantos componentes se devem retirar daqui? A soma de todos os números não está necessariamente limitada a 1, eu vi uma soma de 6, e provavelmente mais.

> princ$sdev
[1] 0.17585066 0.15322845 0.13818021 0.13090573 0.12177070 0.11854969
[7] 0.11176954 0.10910302 0.10616631 0.10265987 0.10056754 0.09441041
[13] 0.09343688 0.08832101 0.08620753 0.08235531 0.08132748 0.07992235
[19] 0.07800569 0.07575063 0.07463254 0.07311194 0.07210698 0.07032990
[25] 0.06907964 0.06763711 0.06634935 0.06544930 0.06451703 0.06260861
 
Dr. Trader:

Eu ainda não descobri isso. (Agora só vou escrever sobre a abordagem y-aware, para não confundir com a outra). O artigo em si está aqui:http://www.r-bloggers.com/principal-components-regression-pt-2-y-aware-methods/

Após o código"princ <- prcomp(dmTrain, centro = FALSO, escala. = FALSO)" temos esta situação: os dados são lidos, escalados por Y, os componentes do PC são construídos. Esta função não limita o número de componentes - tantos quantos os preditores. A primeira coisa a fazer é selecionar apenas uma parte deles (é recomendado o suficiente para descrever 95% das variações). No próprio artigo o autor olhou para o gráfico sdev (algumas variações não especificadas) dos componentes, e disse que 2 ou 5 seriam suficientes, pois eles se destacam no gráfico. De alguma forma nada se destaca, o gráfico está a diminuir suavemente.

Há uma tabela sdev, o número de entradas nela é igual ao número de componentes. É possível calcular quantos componentes se devem retirar daqui? A soma de todos os números não está necessariamente limitada a 1, eu vi uma soma de 6, e provavelmente mais.

Faço chocalhar e arranjo três mesas:

  • Desvios padrão: aqui você pode ter todos os tipos de valores e dizer que a soma = 1 não é necessária
  • Rotação: são coeficientes pelos quais devemos multiplicar os vetores originais para obter novos vetores
  • A importância dos componentes. o que está sendo discutido

O último tem a 1ª coluna dizendo que se você tomar apenas o PC1 explicará 0,9761 de variabilidade (Proporção acumulada) , se você tomar DOIS componentes - PC1 e PC2 explicará 0,99996 etc.

(Eu não sei como inserir tabelas)

Importância dos componentes:

PC1 PC2 PC3 PC4 PC5

Desvio padrão 2,2092 0,34555 0,01057 0,008382 0,004236

Proporção de variação 0,9761 0,02388 0,00002 0,000010 0,000000

Proporção acumulada 0,9761 0,99996 0,99996 0,99998 1,000000 1,000000

 

Há muito tempo que ando à procura desta tabela, finalmente encontrei-a no resumo. O lugar mais óbvio na verdade :) Obrigado por mostrares isso. Este é o caso quando algo está em resumo, mas não em atributos de objeto.

summary(princ)$importance[3,]

Acontece que esse artigo tem uma sequência, dedicada à própria questão da selecção de componentes, com alguma solução especial para o Y-aware. Ainda não o experimentei.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/

 
Dr. Trader:

Há muito tempo que ando à procura desta tabela, finalmente encontrei-a no resumo. O lugar mais óbvio na verdade :) Obrigado por mostrares isso. Este é o caso quando algo está em resumo, mas não em atributos de objeto.

Acontece que esse artigo tem uma sequência, dedicada à própria questão da selecção de componentes, com alguma solução especial para o Y-aware. Ainda não o experimentei.

http://www.win-vector.com/blog/2016/05/pcr_part3_pickk/

Neste R, assim que você recebe algum objeto, você coloca str e resumo sobre ele, e também trama. Você pode ver muitas coisas incríveis. A questão é que a coisa do "objeto" em R é muito mais complicada do que em muitas linguagens de programação.
 
Dr. Trader:

Sim, eu encontrei um subconjunto de preditores com um valor de fitness negativo. Havia muitos preditores, vários milhares, limitei a gensa a apenas 2 iterações, demorei 8 horas :). O resultado da função fitness é de 6%. Na frente destes preditores com nnet eu tenho 45% de erro. Não é muito, não acho que a EA estaria em lucro. Eu coloquei um limite de 10 iterações novamente para encontrar um resultado melhor, corri-o, estive esperando por 24 horas, espero que a gensa alguma vez complete. Terei que experimentar a genética (biblioteca GA), ela funcionará mais rápido com vários fios (GA minimiza ao invés de maximizar o resultado, ou seja, o resultado da função de aptidão para GA deve mudar seu sinal). Eu vou experimentar mais.

Li vários artigos sobre o modelo de componentes principais, e agora tentei não só treinar o modelo para medir R^2 e maximizá-lo selecionando preditores, mas também para realmente testar o modelo nos dados de frontest. Está saindo meio ambíguo. Por um lado eu aumentei R^2 do modelo removendo pares correlacionados de preditores (função findCorrelation do bibiloteka caret), mas como ficou R^2 ao testar o modelo na frente de dados desta diminui. O milagre não aconteceu, o modelo PCA também está requalificado. Quero tentar uma estimativa de previsão mais complexa - dividir a amostra de treinamento em duas - para treinamento propriamente dito e para validação, treinar o modelo PCA, depois testar imediatamente na amostra de validação, retornar no mínimo R^2 como resultado final. Se tal função for usada para avaliação de um conjunto de preditores e maximização deste valor, então serão encontrados apenas os conjuntos de preditores que dão bons resultados sobre os dados treinados e novos. Vamos ter de verificar.

Além disso, eu devo ter entendido mal o texto daquele primeiro artigo sobre PCA neste tópico. Lá foi dito, que o número de componentes deveria ser escolhido para descrever 95% da variação, eu pensei que eles estavam falando sobre a precisão da previsão da variável alvo. Mas não é esse o caso, os componentes principais são construídos sem variáveis-alvo e a precisão de 95% é a exactidão com que os dados brutos são descritos usando esses mesmos componentes. E a precisão das previsões não tem nada a ver com isso.

Não percebo bem porque demorou tanto tempo. Quantos Optim_var_number você conseguiu? Deve estar dentro de 10 minutos. Ajuste-o para 1200 segundos e já deve ser alguma coisa.