我熟悉的“技巧”是:
稀疏矩阵,您已经使用过。但是,您需要确保矩阵中非零值的百分比较低(否则,实际上可能需要更长的时间才能运行)
一棵一棵地种树,观察每批后的表现
我曾经使用过以下(使用 sklearn 的 GBM 实现)
def heldout_auc(model, X_test, y_test):
score = np.zeros((model.get_params()["n_estimators"],), dtype=np.float64)
for i, y_pred in enumerate(model.staged_decision_function(X_test)):
score[i] = auc(y_test, y_pred)
return score
def cv_boost_estimate(X,y,model,n_folds=3):
cv = cross_validation.StratifiedKFold(y, n_folds=n_folds, shuffle=True, random_state=11)
val_scores = np.zeros((model.get_params()["n_estimators"],), dtype=np.float64)
t = time()
i = 0
for train, test in cv:
i = i + 1
print('FOLD : ' + str(i) + '-' + str(n_folds))
model.fit(X.iloc[train,], y.iloc[train])
val_scores += heldout_auc(model, X.iloc[test,], y.iloc[test])
val_scores /= n_folds
return val_scores,(time()-t)
减少 CV 的折叠次数(这会损害性能)。这与您对验证集的描述接近:“最后的手段是制作验证集并尝试使用该集进行参数调整”。但是,我不会推荐这种方法。由于 boosting 涉及很多参数,您很容易陷入验证集的过度拟合。
关注一些参数免责声明,这是高度经验性的!根据我的经验,最重要的参数是 max_depth,η和ntrees. 最后两个“一起工作”:减少η并增加ntrees可以帮助您提高模型的性能。而似乎有一个“最佳”的最大深度参数。
其他参数(colsample_bytree、subsample)通常不太相关。
看一下 python 实现,我发现我的处理器在 python 上的使用比在 R 上更好。也许这个问题已经修复了……