2016-12-14 6 views
1

Ich versuche, einen Klassifikator auf einem Datensatz zu machen. Ich zum ersten Mal XGBoost:Warum xgboost.cv und sklearn.cross_val_score unterschiedliche Ergebnisse liefern?

import xgboost as xgb 
import pandas as pd 
import numpy as np 

train = pd.read_csv("train_users_processed_onehot.csv") 
labels = train["Buy"].map({"Y":1, "N":0}) 

features = train.drop("Buy", axis=1) 
data_dmat = xgb.DMatrix(data=features, label=labels) 

params={"max_depth":5, "min_child_weight":2, "eta": 0.1, "subsamples":0.9, "colsample_bytree":0.8, "objective" : "binary:logistic", "eval_metric": "logloss"} 
rounds = 180 

result = xgb.cv(params=params, dtrain=data_dmat, num_boost_round=rounds, early_stopping_rounds=50, as_pandas=True, seed=23333) 
print result 

Und das Ergebnis ist:

 test-logloss-mean test-logloss-std train-logloss-mean 
0    0.683539   0.000141   0.683407 
179   0.622302   0.001504   0.606452 

Wir können es sehen, ist um 0.622;

Aber wenn ich zu sklearn mit den genau gleichen Parametern (denke ich) wechseln, ist das Ergebnis ganz anders. Unten ist mein Code:

from sklearn.model_selection import cross_val_score 
from xgboost.sklearn import XGBClassifier 
import pandas as pd 

train_dataframe = pd.read_csv("train_users_processed_onehot.csv") 
train_labels = train_dataframe["Buy"].map({"Y":1, "N":0}) 
train_features = train_dataframe.drop("Buy", axis=1) 

estimator = XGBClassifier(learning_rate=0.1, n_estimators=190, max_depth=5, min_child_weight=2, objective="binary:logistic", subsample=0.9, colsample_bytree=0.8, seed=23333) 
print cross_val_score(estimator, X=train_features, y=train_labels, scoring="neg_log_loss") 

und das Ergebnis ist: [-4.11429976 -2.08675843 -3.27346662], nach Umkehr es noch weit von 0,622 ist.

Ich warf einen Breakpoint in cross_val_score und sah, dass der Klassifikator verrückte Vorhersagen macht, indem er versucht, jedes Tupel im Testsatz mit einer Wahrscheinlichkeit von etwa 0,99 als negativ zu prognostizieren.

Ich frage mich, wo ich falsch gelaufen bin. Könnte mir jemand helfen?

Antwort

2

Diese Frage ist ein bisschen alt, aber ich lief heute auf das Problem und fand heraus, warum die Ergebnisse von xgboost.cv und sklearn.model_selection.cross_val_score ziemlich unterschiedlich sind.

Standardmäßig verwendet cross_val_score KFold oder StratifiedKFold, deren Shuffle-Argument False ist, so dass die Falten nicht zufällig aus den Daten gezogen werden.

Also, wenn Sie dies tun, dann sollten Sie die gleichen Ergebnisse,

cross_val_score(estimator, X=train_features, y=train_labels, scoring="neg_log_loss", cv = StratifiedKFold(shuffle=True, random_state=23333)) 

Halten Sie die random state in StratifiedKfold und seed in xgboost.cv gleichen exakt reproduzierbare Ergebnisse zu erhalten.

Verwandte Themen