据说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
网友评论