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?