算法原理
xgboost(eXtreme Gradient Boosting)是Gradient Boosting算法的高效实现,是GBDT的改造和优化版本,GBDT使用Loss Function对f(x)的一阶导数计算出伪残差用于学习生成附加基学习器,xgboost不仅使用到了一阶导数,还使用二阶导数。 上图中的红色箭头指向的l即为损失函数;红色方框为正则项,包括L1、L2;红色圆圈为常数项。利用泰勒公式展开三项,做一个近似,我们可以很清晰地看到,最终的目标函数只依赖于每个数据点在误差函数上的一阶导数和二阶导数。 正则化项是表示树的复杂度的函数,越小复杂度越低,泛化能力越强,避免过拟合。直观上看,目标要求预测误差尽量小,叶子节点尽量少,节点数值尽量不极端。
xgboost在每棵基决策回归树生成的时候,可以并行化计算,所以可以使用GPU加速训练。
模型训练
代码地址 https://github.com/qianshuang/ml-exp
def train():
print("start training...")
# 处理训练数据
train_feature, train_target = process_file(train_dir, word_to_id, cat_to_id)
# 模型训练
model.fit(train_feature, train_target)
def test():
print("start testing...")
# 处理测试数据
test_feature, test_target = process_file(test_dir, word_to_id, cat_to_id)
# test_predict = model.predict(test_feature) # 返回预测类别
test_predict_proba = model.predict_proba(test_feature) # 返回属于各个类别的概率
test_predict = np.argmax(test_predict_proba, 1) # 返回概率最大的类别标签
# accuracy
true_false = (test_predict == test_target)
accuracy = np.count_nonzero(true_false) / float(len(test_target))
print()
print("accuracy is %f" % accuracy)
# precision recall f1-score
print()
print(metrics.classification_report(test_target, test_predict, target_names=categories))
# 混淆矩阵
print("Confusion Matrix...")
print(metrics.confusion_matrix(test_target, test_predict))
if not os.path.exists(vocab_dir):
# 构建词典表
build_vocab(train_dir, vocab_dir)
categories, cat_to_id = read_category()
words, word_to_id = read_vocab(vocab_dir)
# kNN
# model = neighbors.KNeighborsClassifier()
# decision tree
# model = tree.DecisionTreeClassifier()
# random forest
# model = ensemble.RandomForestClassifier(n_estimators=10) # n_estimators为基决策树的数量,一般越大效果越好直至趋于收敛
# AdaBoost
model = ensemble.AdaBoostClassifier(learning_rate=1.0) # learning_rate的作用是收缩基学习器的权重贡献值
# GBDT
model = ensemble.GradientBoostingClassifier(n_estimators=10)
# xgboost
model = xgboost.XGBClassifier(n_estimators=10)
train()
test()
运行结果:
read_category...
read_vocab...
start training...
start testing...
accuracy is 0.914000
precision recall f1-score support
游戏 0.98 0.95 0.97 104
房产 0.92 0.97 0.94 104
家居 0.80 0.83 0.81 89
教育 0.93 0.85 0.88 104
体育 0.98 0.98 0.98 116
时政 0.76 0.85 0.80 94
娱乐 0.90 0.96 0.93 89
科技 0.97 0.93 0.95 94
时尚 0.95 0.92 0.94 91
财经 0.94 0.89 0.91 115
avg / total 0.92 0.91 0.91 1000
Confusion Matrix...
[[ 99 0 0 0 0 3 0 1 1 0]
[ 0 101 0 0 0 3 0 0 0 0]
[ 2 4 74 2 0 3 2 1 0 1]
[ 0 0 5 88 1 7 2 0 1 0]
[ 0 0 0 1 114 0 0 0 1 0]
[ 0 2 3 3 1 80 1 0 0 4]
[ 0 2 1 0 0 1 85 0 0 0]
[ 0 0 4 1 0 0 0 87 1 1]
[ 0 0 1 0 0 1 4 1 84 0]
[ 0 1 5 0 0 7 0 0 0 102]]
tips:xgboost安装
初次安装xgboost的同学,可能会在这里卡不少时间,在这里把安装xgboost的一些坑记录下来,以警后来人。
- pip3 install xgboost 如果顺利通过,那么恭喜你安装成功,如果报如下错:
- curl https://bootstrap.pypa.io/get-pip.py » get-pip.py
- python3 get-pip.py
- 重新执行pip3 install xgboost
- 可以删除get-pip.py文件。
社群
- QQ交流群
- 微信交流群
- 微信公众号