XGBoost简单入门以及调参

  据说XGBoost一直都是Kaggle大神们取得好成绩的得力助手,这边也跟风学了下,下面就用 sklearn 自带的手写识别数据来介绍一下 xgb 的上手入门。

  首先是导入需要的包

from sklearn.datasets import load_digits              # 导入 sklearn 手写识别数据
from sklearn.metrics import accuracy_score         # 用来计算 XGB 的预测准确率
import xgboost as xgb

  接下来导入数据:

digits = load_digits()
trX,teX,trY,teY = train_test_split(digits.data,digits.target,test_size=0.3,random_state=0)

  接下来就可以跑模型了。
  要注意的是,这里手写识别是多分类问题,因此objective需要设置。由于是上手,所以其他参数就随便填了下。需要注意的是,这里为了评判模型的结果,所以用到了 sklearn.metrics 的 accuracy_score 方法。

params={'objective':'multi:softmax',            # 定义多分类问题
       'num_class':10,                          # 类别个数
       'eta':0.1,                              # 学习率
       'silent':1                              # 是否打印中间结果,1就是不打印
       }
train = xgb.DMatrix(trX,label=trY)
test = xgb.DMatrix(teX,label=teY)
num_round = 5
bst = xgb.train(params,train,num_round)
pred = bst.predict(test)
accuracy = accuracy_score(teY,pred)
print('The accuracy of is %.4f'%accuracy)

  这样简单的跑下来结果如下:


output.png

  下面是调参环节。这里用到了 sklearn 的 GridSearchCV 类来组合调节参数,以及 xgb 的 python 接口类 XGBClassifier

   GridSearchCV 有一个参数 param_grid,接受 python 字典类型作为 input 。在调参的过程,把需要调整的参数的名字以及多个值作为键值对存入字典当中,sklearn 就会自动训练帮我们选出最好的参数了。

  param_grid 还可以任意组合参数,所以完全可以这样写,

cv_params={'eta':[0.1,0.01],'max_depth':[7,8,9,10]}

  像这种写法,它会给我们自动组合 eta 和 max_depth 的值,然后得到结果最好的值对。

  我这里就没有这么做了。

from sklearn.model_selection import GridSearchCV
cv_params={'eta':[0.1,0.01]}
gbm = xgb.XGBClassifier(**params)
opt_clf = GridSearchCV(estimator=gbm,param_grid=cv_params,cv=5)
opt_clf.fit(trX,trY)
print('参数最佳取值:{0}'.format(opt_clf.best_params_))
print('最佳模型得分:{0}'.format(opt_clf.best_score_))

跑下来结果如下:


output.png

你可能感兴趣的:(XGBoost简单入门以及调参)