xgboost: dê mais importância a amostras recentes

22

Existe uma maneira de adicionar mais importância aos pontos mais recentes ao analisar dados com o xgboost?

quilojoules
fonte

Respostas:

9

Você pode tentar criar vários modelos xgboost, com alguns deles limitados a dados mais recentes e, em seguida, ponderar esses resultados juntos. Outra idéia seria criar uma métrica de avaliação personalizada que penalize mais fortemente os pontos recentes, o que lhes daria mais importância.

TBSRounder
fonte
4
O PO pode simplesmente fornecer pesos amostrais mais altos para observações mais recentes. A maioria dos pacotes permite isso, assim como o xgboost.
Ricardo Cruz
30

Basta adicionar pesos com base nos rótulos de tempo ao seu xgb.DMatrix. O exemplo a seguir está escrito em R, mas o mesmo princípio se aplica ao xgboost no Python ou Julia.

data <- data.frame(feature = rep(5, 5),
                   year = seq(2011, 2015), 
                   target = c(1, 0, 1, 0, 0))
weightsData <- 1 + (data$year - max(data$year)) * 5 * 0.01

#Now create the xgboost matrix with your data and weights
xgbMatrix <- xgb.DMatrix(as.matrix(data$feature), 
                         label = data$target, 
                         weight = weightsData)
wacax
fonte
Obrigado pela sua resposta - é realmente útil ver um exemplo codificado. Como a magnitude dos coeficientes da função de ponderação afeta o modelo? Examinei os documentos do xgboost, mas não consigo encontrar informações sobre o significado desses valores numéricos.
kilojoules
não conhecia esse truque, legal. há um pequeno detalhe no doc xgboost sob a função setinfo(), embora a sua não muito descritivo
TBSRounder
12

No Python, você tem um bom wrapper scikit-learn, para escrever assim:

import xgboost as xgb
exgb_classifier = xgb.XGBClassifier()
exgb_classifier.fit(X, y, sample_weight=sample_weights_data)

Você pode obter mais informações com isso: http://xgboost.readthedocs.io/en/latest/python/python_api.html#xgboost.XGBClassifier.fit

lucidyan
fonte
Desejo de R acento circunflexo tinha este construído em muito ..
pauljeba
1
que deve ser xgb.XGBClassifier()na segunda linha de código, mas Stackexchange não permite edições de menos de seis caracteres ...
Andre Holzner