Xgboost: O que exatamente gblinear+reg:linear faz? E outras perguntas

Criado em 24 mai. 2015  ·  12Comentários  ·  Fonte: dmlc/xgboost

Oi,

Estou começando a descobrir o poder do xgboost e, portanto, brincando com conjuntos de dados de demonstração (conjunto de dados de Boston de sklearn.datasets agora).

Se entendi corretamente os parâmetros, escolhendo:

plst=[('silent', 1),
 ('eval_metric', 'rmse'),
 ('nthread', 1),
 ('objective', 'reg:linear'),
 ('eta', 1),
 ('booster', 'gblinear'),
 ('lambda', 0),
 ('alpha', 10)]

Eu deveria estar fazendo reforço com regressões de Lasso como aprendizes fracos. _É isso mesmo?_ Se for esse o caso, com num_round=1 eu deveria obter de volta a saída de uma única regressão Lasso, portanto, um vetor de peso muito esparso, o que não é totalmente o caso.
Mas, na verdade, não acho que seja possível obter a saída de uma única rodada. De fato, o vetor de peso do modelo muda quando eu mudo eta, mesmo com num_round=1, o que significa que há pelo menos duas rodadas, ou então eu entendi mal alguma coisa. _Minha interpretação está correta?_

Além disso, após alguns testes, não acho que o parâmetro eta esteja limitado à árvore de aumento de gradiente em sua implementação, embora no documento esteja na subseção _tree parameter_. Isso me parece lógico, pois o encolhimento ao definir uma taxa de aprendizado é uma maneira de regularizar o aumento que não é específico para aumentar as árvores.
O que também não poderia se limitar a aumentar a árvore é a opção 'subamostra'. Pode ser uma maneira de regularizar os regressores lineares impulsionadores, bem como impulsionar árvores (pelo menos em teoria).

Por fim, só para ter certeza de que entendi, ao objetivo de aprendizagem corresponde uma determinada perda, que não está necessariamente vinculada à eval_metric, usada apenas para avaliação do usuário? Como muitos eval_metrics podem ser especificados. Nesse caso, quais são as diferentes perdas para reg:logistic , reg:linear e multi:softmax? (por exemplo, perda quadrada ou perda absoluta para regressão, perda exponencial ou de desvio para classificação?)

Obrigado por suas respostas,
melhor,
Alice

Comentários muito úteis

@tqchen Você pode dar mais detalhes sobre o que o gblinear está realmente fazendo? A referência a um artigo/fórmula seria ótima.

Em particular, gostaria de poder calcular as previsões para 1 rodada de treinamento ( nrounds=1 ). Aqui está um conjunto de dados de exemplo:

> train
        x      y
 1: 13.36  37.54
 2:  5.35  14.54
 3:  0.26  -0.72
 4: 84.16 261.19
 5: 24.67  76.90
 6: 22.26  67.15
 7: 18.02  53.89
 8: 14.29  43.48
 9: 61.66 182.60
10: 57.26 179.44

Depois de treinar um modelo de regressão linear e um modelo xgboost com parâmetros { booster="gblinear" , objective="reg:linear" , eta=1 , subsample=1 , lambda=0 , lambda_bias=0 , alpha=0 } Obtenho os seguintes resultados

> test
        x      y Pred.linreg Pred.xgb
 1: 47.75 153.23      146.25    155.7
 2: 12.13  40.05       35.78    107.9
 3: 89.05 274.37      274.34    211.1
 4: 38.87 116.51      118.71    143.8
 5: 27.30  80.61       82.83    128.2
 6: 87.66 267.95      270.02    209.3
 7: 39.33 114.97      120.14    144.4
 8: 64.32 191.73      197.64    177.9
 9: 13.18  48.28       39.04    109.3
10:  8.89  23.30       25.73    103.5

O que realmente está acontecendo aqui? Obrigado!

Todos 12 comentários

Você deseja usar várias rodadas no gblinear para obter de volta uma única regressão de laço.

Isso ocorreu porque faz menos sentido empilhar modelos lineares (que novamente era um modelo linear). Portanto, as etapas de atualização num_round foram usadas em conjunto para resolver um único problema de laço.

eval_metric não tem nada a ver com função objetivo. A função de perda está documentada nos parâmetros.md reg:logistic para regressão logística, reg:linear para perda quadrada e muti:softmax para classificação multiclasse softmax

Oi,

Obrigado por suas respostas! Eu entendi como você recebe de volta um único Lasso após um grande num_rounds e não 1. Então também responde a minha segunda pergunta, que é você está usando a perda ao quadrado para regressão. E acho que você está usando desvio binomial/multinomial para classificação. _Isso está correto?_

Eu não tinha certeza, porque para regressão você também pode usar a perda de L1 ou a perda de Huber, por exemplo (exemplos comuns fornecidos na seção 10.10.2 dos elementos de aprendizado estatístico).

Obrigado pela ajuda,
Alice

Oi,

Eu quero aplicar o xgboost em um modelo de regressão, significa que minha variável dependente é do tipo numérico contínuo. No entanto, estou confuso, o que devo fornecer no argumento "rótulo". Por favor, ajude aqui.

Saudações,
Vivek

no rótulo do caso de regressão é o seu destino de regressão

Em segunda-feira, 25 de maio de 2015 às 8h43, Vivek Agarwal [email protected]
escreveu:

Oi,

Eu quero aplicar o xgboost em um modelo de regressão, significa minha variável dependente
é tipo de numérico contínuo. No entanto, estou confuso, o que devo fornecer
no argumento "rótulo". Por favor, ajude aqui.

Saudações,
Vivek


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/dmlc/xgboost/issues/332#issuecomment -105253915.

Sinceramente,

Tianqi Chen
Ciência da Computação e Engenharia, Universidade de Washington

Veja a documentação do objetivo em
https://github.com/dmlc/xgboost/blob/master/doc/parameter.md
Diferentes funções objetivo podem ser especificadas e você pode encontrar o significado de
parâmetros atuais

Tianqi

Em segunda-feira, 25 de maio de 2015 às 1h47, AliceS [email protected] escreveu:

Oi,

Obrigado por suas respostas! Eu entendi como você recebe de volta um único
Lasso após um grande num_rounds e não 1.

Em relação às funções de perda, ainda não está claro quais são, pelo menos
menos para a regressão. Você pode usar a perda ao quadrado, a perda L1 ou a
Perda de Huber, por exemplo (exemplos comuns fornecidos na seção 10.10.2 do
elementos da aprendizagem estatística). Para classificação, acho que você usa
desvio binomial/multinomial (também pode ser a perda exponencial em que
caso você receba de volta o boost clássico).

Obrigado pela ajuda,
Alice


Responda a este e-mail diretamente ou visualize-o no GitHub
https://github.com/dmlc/xgboost/issues/332#issuecomment -105170486.

Sinceramente,

Tianqi Chen
Ciência da Computação e Engenharia, Universidade de Washington

Obrigado Tianqi,
Alice

A variável dependente tem valores numéricos. Abaixo estão as primeiras 6 observações do alvo de regressão:

head(final_data[1:n.train,'Dependent'])
[1] 4996 3784 1504 4994 3687 3084

Agora, se estou colocando essa variável dependente em rótulos e executando o código abaixo:

param <- list("objective" = "reg:linear",
"num_classe" = 9,
"nthread" = 8,
"eta" = 0,08,
"subamostra" = 0,8,
"gama" = 1,
"min_child_weight" = 2,
"max_profundidade" = 12,
"colsample_bytree" = 1
)
model_xg <- xgboost(param=param,data = final_data[1:n.train,],label=final_data[1:n.train,'Dependent'],nrounds=250)

Então estou recebendo o seguinte erro:

Erro em xgb.get.DMatrix(data, label): xgboost: entrada de dados inválida
Além disso: Mensagem de aviso:
Em xgb.get.DMatrix(data, label): xgboost: label será ignorado.

Por favor, deixe-me saber o que estou fazendo de errado?

@vivekag Por favor, abra um novo problema sobre isso. Seria ótimo se você pudesse fornecer um trecho de código (possivelmente com alguns dados fictícios) que possamos executar para reproduzir o problema.

Eu acho que foi porque o tipo de dados de final_data não era o que xgboost esperava (xgboost espera uma matriz ou matriz esparsa) @hetong007

@tqchen Você pode dar mais detalhes sobre o que o gblinear está realmente fazendo? A referência a um artigo/fórmula seria ótima.

Em particular, gostaria de poder calcular as previsões para 1 rodada de treinamento ( nrounds=1 ). Aqui está um conjunto de dados de exemplo:

> train
        x      y
 1: 13.36  37.54
 2:  5.35  14.54
 3:  0.26  -0.72
 4: 84.16 261.19
 5: 24.67  76.90
 6: 22.26  67.15
 7: 18.02  53.89
 8: 14.29  43.48
 9: 61.66 182.60
10: 57.26 179.44

Depois de treinar um modelo de regressão linear e um modelo xgboost com parâmetros { booster="gblinear" , objective="reg:linear" , eta=1 , subsample=1 , lambda=0 , lambda_bias=0 , alpha=0 } Obtenho os seguintes resultados

> test
        x      y Pred.linreg Pred.xgb
 1: 47.75 153.23      146.25    155.7
 2: 12.13  40.05       35.78    107.9
 3: 89.05 274.37      274.34    211.1
 4: 38.87 116.51      118.71    143.8
 5: 27.30  80.61       82.83    128.2
 6: 87.66 267.95      270.02    209.3
 7: 39.33 114.97      120.14    144.4
 8: 64.32 191.73      197.64    177.9
 9: 13.18  48.28       39.04    109.3
10:  8.89  23.30       25.73    103.5

O que realmente está acontecendo aqui? Obrigado!

Qual é a diferença entre a regressão xg e outra regressão geral?
Eu sei que o xgboost tem uma versão em árvore que é diferente de outro algoritmo de árvore.
Acho que precisa hackear a fonte.

podemos extrair os pesos finais de todos os recursos de entrada quando estamos usando gblinear no xgboost? Estou encontrando dificuldade para extrair os pesos.

Esta página foi útil?
0 / 5 - 0 avaliações