2017-03-28 3 views
2

Ich habe mit scikit-learn ein XGBoost-Modell aufgebaut und bin sehr zufrieden damit. Als Feinabstimmung, um Überanpassung zu vermeiden, möchte ich Monotonie einiger Funktionen sicherstellen, aber dort fange ich an, einige Schwierigkeiten zu stellen ...Wie erzwinge Monotonic Constraints in XGBoost mit ScikitLearn?

Soweit ich verstanden habe, gibt es keine Dokumentation in scikit-lerne über xgboost (das ich gestehen, ich bin wirklich überrascht - in dem Wissen, dass diese Situation mehrere Monate dauert. Die einzige Dokumentation, die ich fand, ist direkt auf http://xgboost.readthedocs.io

Auf dieser Website fand ich heraus, dass Monotonie mit der Option "monotone_constraints" erzwungen werden kann. Ich habe versucht, es zu benutzen, in Scikit-Learn, aber ich bekam eine Fehlermeldung „Typeerror: init() bekam ein unerwartetes Stichwort Argument‚monotone_constraints‘“

Kennen Sie einen Weg, es zu tun? Hier

ist der Code, den ich in Python geschrieben (mit spyder):

grid = {'learning_rate' : 0.01, 'subsample' : 0.5, 'colsample_bytree' : 0.5, 
    'max_depth' : 6, 'min_child_weight' : 10, 'gamma' : 1, 
    'monotone_constraints' : monotonic_indexes} 
#'monotone_constraints' ~ = "(1,-1)" 
m07_xgm06 = xgb.XGBClassifier(n_estimators=2000, **grid) 
m07_xgm06.fit(X_train_v01_oe, Label_train, early_stopping_rounds=10, eval_metric="logloss", 
    eval_set=[(X_test1_v01_oe, Label_test1)]) 

Antwort

0

XGBoost Scikit-Learn-API zur Zeit (0.6a2) nicht monotone_constraints unterstützen. Sie können stattdessen Python API verwenden. Werfen Sie einen Blick in example.

Dieser Code kann in dem Beispiel entfernt werden:

params_constr['updater'] = "grow_monotone_colmaker,prune" 
+0

scheint jedoch wie monotone Einschränkungen für jetzt nicht funktioniert. Ich habe eine Frage dazu [hier] gestellt (https://github.com/dmlc/xgboost/issues/1514#issuecomment-307567705). @ Chapelon funktioniert es für dich? –

0

Wie würden Sie monotone Einschränkungen erwarten für eine allgemeine Klassifikation Problem zu arbeiten, wo die Antwort möglicherweise mehr als zwei Ebenen haben? Alle Beispiele, die ich in Bezug auf diese Funktionalität gesehen habe, sind für Regressionsprobleme. Wenn Ihre Klassifizierungsantwort nur zwei Ebenen hat, wechseln Sie zu einer Regression für eine Indikatorvariable und wählen Sie dann einen geeigneten Score-Schwellenwert für die Klassifizierung.

Diese Funktion scheint mit dem neuesten xgboost/scikit-learn zu funktionieren, sofern Sie einen XGBregressor anstelle eines XGB-Klassifikators verwenden und monotone_constraints über kwargs setzen.

Die Syntax lautet wie folgt:

params = { 
    'monotone_constraints':'(-1,0,1)' 
} 

normalised_weighted_poisson_model = XGBRegressor(**params) 

In diesem Beispiel gibt es eine negative Einschränkung ist auf der Säule 1 in den Trainingsdaten, keine Einschränkung auf der Säule 2 und eine positive Einschränkung für Spalte 3. Es ist Ihnen überlassen, was Sie verfolgen - Sie können nicht auf die Spalten nach Namen, sondern nur nach Position verweisen, und Sie müssen einen Eintrag im Constraint-Tupel für jede Spalte in Ihren Trainingsdaten angeben.