我在R中有一个项目,在R中使用XGboost并获得了74%的AUC。 我需要将项目转移到python,我使用了相同的数据框:像在R中使用的那样训练和测试。 我使用的XGboost(xgboost的XGBClassifier)具有与R中使用的相同的超参数,并且AUC为62%。 我得到的实现与R版本不完全相同,种子也不相同,但是两者之间的差异太大以至于不是巧合。
我唯一能想到的是,也许实现无法处理我拥有的缺失值(但是XGboost算法应该使用它们而不是忽略它们)。
我在做什么错?关于如何解决该问题的任何想法?如何检查算法是否忽略缺失值?
我的代码-python:
.....
'params': {
'min_child_weight': [1],
'learning_rate': [0.05],
'n_estimators': [300],
'gamma': [0],
'subsample': [1],
'colsample_bytree': [0.8],
'max_depth': [15],
'booster': ['gbtree'],
'silent': [True],
'missing': [np.nan],
'max_delta_step': [10],
'colsample_bylevel': [0.8],
'scale_pos_weight':[1],
'reg_alpha': [0],
'reg_lambda': [0.5],
......
model = XGBClassifier()
skf = StratifiedKFold(n_splits=folds, shuffle=True, random_state=11)
gridSearch = GridSearchCV(model, param_grid =params, scoring='roc_auc', n_jobs=1,
cv=skf.split(xTrain, yTrain), verbose=3)
gridSearch.fit(xTrain, yTrain[target])
yPred = gridSearch.predict(xTest)
predictions = [round(value) for value in yPred]
# evaluate predictions
fpr, tpr, thresholds = metrics.roc_curve(yTest, predictions, pos_label=1)
print(metrics.auc(fpr, tpr))
我的代码-R:
Grid <- expand.grid(nrounds = 300,
eta = 0.05,
max_depth = 15,
gamma = 0,
colsample_bytree=0.8,
min_child_weight=1,
subsample=1)
set.seed(15)
ctrl2 <- trainControl(method = "cv",
number = 10,
returnData = TRUE,
savePredictions = "all",
classProbs = TRUE,
summaryFunction = twoClassSummary,
selectionFunction = "best",
allowParallel = TRUE)
classifier <- train(x = smote_train[,-1],y = smote_train[,1], method = 'xgbTree',tuneGrid = Grid,trControl = ctrl2,metric = "ROC")
prediction <- predict(classifier, newdata= test_set[,-1],'prob')
library(classifierplots)
a <- test_set
a$y[a$readmmited=="yes"] <- 1
a$y[a$readmmited=="no"] <- 0
classifierplots(a$y, prediction$yes)