O LightGBM resulta de maneira diferente, dependendo da ordem dos dados

8

Eu tenho dois conjuntos de dados A e B que são exatamente iguais em termos de número de colunas, nome das colunas e valores. A única diferença é a ordem dessas colunas. Treino o modelo LightGBM em cada um dos dois conjuntos de dados com as seguintes etapas

  1. Divida cada conjunto de dados em treinamento e teste (use a mesma semente e proporção aleatória para A e B)
  2. Deixe os hiperparâmetros como praticamente o padrão
  3. Defina um estado aleatório como um número fixo (para reprodução)
  4. Ajuste o learning_rate usando uma Pesquisa em grade
  5. Treine um modelo LightGBM no conjunto de treinamento e teste-o no conjunto de testes
  6. A taxa de aprendizado com o melhor desempenho no conjunto de testes será escolhida

Os modelos de saída nos dois conjuntos de dados são muito diferentes, o que me faz pensar que a ordem das colunas afeta o desempenho do treinamento do modelo usando o LightGBM.

Você sabe por que esse é o caso?

Duy Bui
fonte

Respostas:

6

Uma possível explicação é esta:

Quando a ordem das colunas é diferente, há uma pequena diferença no procedimento.

O que o LightGBM, XGBoost, CatBoost, entre outros, fazem é selecionar colunas diferentes dos recursos do seu conjunto de dados em todas as etapas do treinamento.

As seleções dessas colunas são feitas aleatoriamente: digamos que seu conjunto de dados tenha 20 colunas. O nó raiz seleciona os recursos 1, 3 e 18 , em ambos os conjuntos de dados, os recursos 1, 3 e 18 são diferentes nos dois conjuntos de dados possíveis. Isso é feito repetidamente e, a cada passo, a aleatoriedade afeta o resultado final.

Juan Esteban da Calle
fonte
Como podemos controlar essa aleatoriedade quando o algoritmo seleciona um subconjunto de recursos para construir uma árvore de decisão? Esse também foi o meu único pensamento para responder a essa situação. Além disso, acho que se sempre selecionarmos todos os recursos por árvore, o algoritmo usará Gini (ou algo semelhante) para calcular a importância do recurso a cada etapa, o que não criará uma aleatoriedade.
Duy Bui
lightgbmpermite ao usuário definir as sementes aleatórias usadas para amostragem de linha e coluna.
Brads
1
@bradS: Eu não defini a semente como um hiperparâmetro no LightGBM, mas verifiquei novamente e as sementes devem ser definidas como um número fixo por padrão. Isso significa que deve ter o mesmo resultado, o que não é o caso aqui. lightgbm.readthedocs.io/en/latest/Parameters.html
Duy Bui
3

Embora a ordem dos dados seja inconseqüente em teoria, é importante na prática. Considerando que você tomou medidas para garantir a reprodutibilidade, a ordem diferente dos dados alterará sua lógica de divisão de teste de trem (a menos que você tenha certeza de que os conjuntos de trens e conjuntos de testes nos dois casos são exatamente os mesmos). Embora você não especifique como os dados são divididos, é altamente possível que uma certa variedade de pontos de dados torne a máquina mais robusta a discrepâncias e, portanto, oferecendo melhor desempenho do modelo. Caso os dados de treinamento e teste sejam os mesmos nos dois casos, é provável que você tenha que verificar se há uma medida de semente / reprodutibilidade (em qualquer parte do seu código) que você não tenha tomado.

gbdata
fonte
Desculpe, esqueci de mencionar isso. Atualizará minha consulta. Treinar e testar são exatamente os mesmos, porque os dividi usando a mesma semente aleatória.
Duy Bui
@DuyBui algumas sugestões para tentar: 1) se você estiver usando o Gpu, defina gpu_use_dp como true De: github.com/Microsoft/LightGBM/pull/560#issuecomment-304561654 2) defina num_threads como um número fixo De: github.com/ Microsoft / LightGBM / Issues / 632 ;
Gbdata