2016-12-14 1 views
1

데이터 세트에서 분류자를 만들려고합니다. 내가 먼저 XGBoost 사용 :xgboost.cv와 sklearn.cross_val_score가 다른 결과를주는 이유는 무엇입니까?

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 

을 그리고 그 결과는 다음과 같습니다

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

우리는 그것을 볼 수는 약 0.622이다;

그러나 정확하게 동일한 매개 변수를 사용하여 sklearn으로 전환하면 결과가 매우 다릅니다. 다음은 내 코드입니다 :

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") 

그 결과는 다음과 같습니다 [-4.11429976 -2.08675843 -3.27346662], 그것은 지금까지 0.622에서 아직 반전 후.

나는 브레이크 포인트를 cross_val_score에 던졌고, 분류기가 테스트 세트의 모든 튜플을 약 0.99 확률로 음수로 예측함으로써 미친 예측을한다는 것을 알았습니다.

내가 잘못 생각한 부분이 있습니다. 누군가 나를 도울 수 있습니까?

답변

2

이 질문은 다소 오래되었지만 오늘 문제가 발생하여 xgboost.cvsklearn.model_selection.cross_val_score의 결과가 왜 다른지를 알아 냈습니다.

기본적으로 cross_val_score는 셔플 인수가 False 인 KFold 또는 StratifiedKFold을 사용하므로 폴드가 데이터에서 임의로 추출되지 않습니다.

그래서 당신이 할 경우, 당신은 동일한 결과를 얻을해야

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

정확히 재현 가능한 결과를 얻을 동일한 random state xgboost.cv에서 StratifiedKfoldseed을 유지합니다.

관련 문제