xgb模型的参数,归一化

这里要重点讲一下 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。

一般的调参步骤是:

  1. 将训练数据的一部分划出来作为验证集。

  2. 先将 eta 设得比较高(比如 0.1),num_round 设为 300 ~ 500。

  3. 用 Grid Search 对其他参数进行搜索

  4. 逐步将 eta 降低,找到最佳值。

  5. 以验证集为 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

[python]  view plain  copy
  1. #例子:将数据缩放至[0, 1]间。训练过程: fit_transform()  
  2. X_train = np.array([[1., -1.2.], [2.0.0.], [0.1., -1.]])  
  3. min_max_scaler = preprocessing.MinMaxScaler()   
  4. X_train_minmax = min_max_scaler.fit_transform(X_train)    
  5. #out: array([[ 0.5       ,  0.        ,  1.        ],   
  6. 1.        ,  0.5       ,  0.33333333],          
  7. 0.        ,  1.        ,  0.        ]])  
  8. #将上述得到的scale参数应用至测试数据  
  9. X_test = np.array([[ -3., -1.4.]])    
  10. X_test_minmax = min_max_scaler.transform(X_test) #out: array([[-1.5 ,  0. , 1.66666667]])  
  11. #可以用以下方法查看scaler的属性  
  12. min_max_scaler.scale_        #out: array([ 0.5 ,  0.5,  0.33...])  
  13. min_max_scaler.min_         #out: array([ 0.,  0.5,  0.33...])  

2. MaxAbsScaler(绝对值最大标准化)

与上述标准化方法相似,但是它通过除以最大值将训练集缩放至[-1,1]。这意味着数据已经以0为中心或者是含有非常非常多0的稀疏数据。

[html]  view plain  copy
  1. X_train = np.array([[ 1., -1.,  2.],  
  2.                      [ 2.,  0.,  0.],  
  3.                     [ 0.,  1., -1.]])  
  4. max_abs_scaler = preprocessing.MaxAbsScaler()  
  5. X_train_maxabs = max_abs_scaler.fit_transform(X_train)  
  6. # doctest +NORMALIZE_WHITESPACE^, out: array([[ 0.5, -1.,  1. ], [ 1. , 0. ,  0. ],       [ 0. ,  1. , -0.5]])  
  7. X_test = np.array([[ -3., -1.,  4.]])  
  8. X_test_maxabs = max_abs_scaler.transform(X_test) #out: array([[-1.5, -1. ,  2. ]])  
  9. max_abs_scaler.scale_  #out: array([ 2.,  1.,  2.])  fit_transform(partData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该partData进行转换transform,从而实现数据的标准化、归一化等等。。


  • fit_transform(partData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),然后对该partData进行转换transform,从而实现数据的标准化、归一化等等。。
  • 必须先用fit_transform(partData),之后再transform(restData)

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值