xgboost调参代码

xgboost参数:
leanring_rate : 默认是0.3,更新过程中用到的收缩步长,在每次提升计算之后,算法会直接获得新特征的权重。 eta通过缩减特征的权重使提升计算过程更加保守;[0,1]
gamma:默认是0,别名是 min_split_loss,在节点分裂时,只有在分裂后损失函数的值下降了(达到gamma指定的阈值),才会分裂这个节点。gamma值越大,算法越保守(越不容易过拟合);[0,∞]
max_depth:默认是6,树的最大深度,值越大,越容易过拟合;[0,∞]
min_child_weight:默认是1,决定最小叶子节点样本权重和,加权和低于这个值时,就不再分裂产生新的叶子节点。当它的值较大时,可以避免模型学习到局部的特殊样本。但如果这个值过高,会导致欠拟合。[0,∞]
max_delta_step:默认是0,这参数限制每颗树权重改变的最大步长。如果是 0 意味着没有约束。如果是正值那么这个算法会更保守,通常不需要设置。[0,∞]
subsample:默认是1,这个参数控制对于每棵树,随机采样的比例。减小这个参数的值算法会更加保守,避免过拟合。但是这个值设置的过小,它可能会导致欠拟合。 (0,1]
colsample_bytree:默认是1,用来控制每颗树随机采样的列数的占比; (0,1]
colsample_bylevel:默认是1,用来控制的每一级的每一次分裂,对列数的采样的占比; (0,1]
lambda:默认是1,别名是reg_lambda,L2 正则化项的权重系数,越大模型越保守;
alpha:默认是0,别名是reg_alpha,L1 正则化项的权重系数,越大模型越保守;
seed:随机数种子,相同的种子可以复现随机结果,用于调参!
n_estimators:弱学习器的数量

调参demo:
from sklearn.model_selection import GridSearchCV

def search_param():
data = get_data()
x = data[float_cols + int_cols + object_cols]
x = pd.get_dummies(x)
y = np.where(data.target_flag_1 == 'Y',0,1)
train_x,test_x,train_y,test_y = train_test_split(x,y,random_state=0,test_size=0.2)
cv_params = {'learning_rate': [0.01, 0.05, 0.07, 0.1, 0.2]}
other_params = {'learning_rate': 0.1, 'n_estimators': 800, 'max_depth': 10, 'min_child_weight': 1, 'seed': 121,
'subsample': 0.8, 'colsample_bytree': 0.7, 'gamma': 0.1, 'reg_alpha': 3, 'reg_lambda': 2}
model = XGBClassifier(**other_params)
optimized_GBM = GridSearchCV(estimator=model, param_grid=cv_params, scoring='r2', cv=5, verbose=1, n_jobs=4)
optimized_GBM.fit(train_x, train_y)
evalute_result = optimized_GBM.cvresults['mean_test_score']
print('每轮迭代运行结果:{0}'.format(evalute_result))
print('参数的最佳取值:{0}'.format(optimized_GBM.bestparams))
print('最佳模型得分:{0}'.format(optimized_GBM.bestscore))

猜你喜欢

转载自blog.51cto.com/14592795/2459873
今日推荐