这里要重点讲一下 Xgboost 的调参。通常认为对它性能影响较大的参数有:
-
eta
:每次迭代完成后更新权重时的步长。越小训练越慢。 -
num_round
:总共迭代的次数。 -
subsample
:训练每棵树时用来训练的数据占全部的比例。用于防止 Overfitting。 -
colsample_bytree
:训练每棵树时用来训练的特征的比例,类似RandomForestClassifier
的max_features
。 -
max_depth
:每棵树的最大深度限制。与 Random Forest 不同,Gradient Boosting 如果不对深度加以限制,最终是会 Overfit 的。 -
early_stopping_rounds
:用于控制在 Out Of Sample 的验证集上连续多少个迭代的分数都没有提高后就提前终止训练。用于防止 Overfitting。
一般的调参步骤是:
-
将训练数据的一部分划出来作为验证集。
-
先将
eta
设得比较高(比如 0.1),num_round
设为 300 ~ 500。 -
用 Grid Search 对其他参数进行搜索
-
逐步将
eta
降低,找到最佳值。 -
以验证集为 watchlist,用找到的最佳参数组合重新在训练集上训练。注意观察算法的输出,看每次迭代后在验证集上分数的变化情况,从而得到最佳的
early_stopping_rounds
。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | X_dtrain, X_deval, y_dtrain, y_deval = cross_validation.train_test_split(X_train, y_train, random_state=1026, test_size=0.3) dtrain = xgb.DMatrix(X_dtrain, y_dtrain) deval = xgb.DMatrix(X_deval, y_deval) watchlist = [(deval, 'eval')] params = { 'booster': 'gbtree', 'objective': 'reg:linear', 'subsample': 0.8, 'colsample_bytree': 0.85, 'eta': 0.05, 'max_depth': 7, 'seed': 2016, 'silent': 0, 'eval_metric': 'rmse' } clf = xgb.train(params, dtrain, 500, watchlist, early_stopping_rounds=50) pred = clf.predict(xgb.DMatrix(df_test)) |
最后要提一点,所有具有随机性的 Model 一般都会有一个 seed
或是 random_state
参数用于控制随机种子。得到一个好的 Model 后,在记录参数时务必也记录下这个值,从而能够在之后重现 Model。
归一化:
1. MinMaxScaler(最小最大值标准化)
公式:X_std = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0)) ;
X_scaler = X_std/ (max - min) + min
2. MaxAbsScaler(绝对值最大标准化)
与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。
- fit_transform(partData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该partData进行转换transform,从而实现数据的标准化、归一化等等。。
- 必须先用fit_transform(partData),之后再transform(restData)