XGBOOST

1. 简介

1.1 定义

  • XGBoost的全称是eXtreme Gradient Boosting

1.2 原理

  • 原理与GBDT相同

1.3 特点

  • 是经过优化的分布式梯度提升库,旨在高效、灵活且可移植
  • XGBoost是大规模并行boosting tree的工具,比GBDT更高效

1.4 XGBoost与GDBT的区别

1. 泰勒展开级数不同

  • XGBoost是拟合上一轮损失函数的二阶导展开,也就是二级泰勒展开式
  • GDBT是拟合上一轮损失函数的一阶导展开,也就是一级泰勒展开式
  • 因此,XGBoost的准确性更高,且满足相同的训练效果,需要的迭代次数更少。

2. 树的复杂度

  • XGBoost生成CART树考虑了树的复杂度
  • GDBT未考虑,GDBT在树的剪枝步骤中考虑了树的复杂度。

3. 多线程

  • XGBoost与GDBT都是逐次迭代来提高模型性能
  • 但是XGBoost在选取最佳切分点时可以开启多线程进行,大大提高了运行速度。

2. 应用

2.1 数据说明

  • 皮马印第安人糖尿病数据集(预测是否会得糖尿病) :
    • Pregnancies:怀孕次数
    • Glucose:葡萄糖
    • BloodPressure:血压 (mm Hg)
    • SkinThickness:皮层厚度 (mm)
    • Insulin:胰岛素 2小时血清胰岛素(mu U / ml )
    • BMI:体重指数 (体重/身高)^2
    • DiabetesPedigreeFunction:糖尿病谱系功能
    • Age:年龄 (岁)
    • Outcome:目标值 (0或1)
#加载数据 
import pandas as pd 
data = pd.read_csv('Pima-Indians-Diabetes.csv') 
data.head()

在这里插入图片描述

2.2 使用Xgboost 的 Sklearn接口

1. xgboost参数

  • n_estimators:梯度提升树的棵数,也就是拟合几次残差
  • learning rate:一般情况下,学习速率的值为0.1。但是,对于不同的问题,理想的学习速率有时候会在0.05到0.3之间波动。
  • 正则化参数
    • reg_alpha L1正则化系数
    • reg_lambda L2正则化系数
  • max_depth [default=6]
    • 用于设置树的最大深度
    • range: [1,∞]
  • subsample [default=1]
    • 表示观测的子样本的比率,将其设置为0.5意味着xgboost将随机抽取一半观测用于数的生长,这将有助于防止过拟合现象
    • range: (0,1]
  • min_child_weight [default=1]
    • 表示子树观测权重之和的最小值,如果树的生长时的某一步所生成的叶子结点,其观测权重之和小于min_child_weight,那
      么可以放弃该步生长,在线性回归模式中,这仅仅与每个结点所需的最小观测数相对应。该值越大,算法越保守
    • range: [0,∞]
  • colsample_bytree [default=1]
    • 表示用于构造每棵树时变量的子样本比率
    • range: (0,1]
import warnings 
warnings.filterwarnings("ignore") 
import numpy as np 
import pandas as pd
import pickle 
import xgboost as xgb 
from sklearn.model_selection 
import train_test_split 
from sklearn.externals import joblib 
# 用pandas读入数据 
data = pd.read_csv('Pima-Indians-Diabetes.csv') 
# 做数据切分 
train, test = train_test_split(data) 
# 取出特征X和目标y的部分 
feature_columns = ['Pregnancies', 'Glucose', 'BloodPressure', 'SkinThickness', 'Insulin', 'BMI', 'DiabetesPedigreeFunction', 'Age'] 
target_column = 'Outcome' 
train_X = train[feature_columns].values 
train_y = train[target_column].values 
test_X = test[feature_columns].values 
test_y = test[target_column].values 
# 初始化模型 
xgb_classifier = xgb.XGBClassifier(n_estimators=20,\ max_depth=4, \ learning_rate=0.1, \ subsample=0.7, \ colsample_bytree=0.7) 
# 拟合模型 
xgb_classifier.fit(train_X, train_y) 
# 使用模型预测 
preds = xgb_classifier.predict(test_X) 
# 判断准确率 
print ('错误类为%f' %((preds!=test_y).sum()/float(test_y.shape[0]))) 
# 模型存储 
joblib.dump(xgb_classifier, '2.model') 
# 错误类为0.229167

结果显示:

['0002.model']
  • early-stopping 早停:在训练集上学习模型,一颗一颗树添加,在验证集上看效果,当验证集效果不再提升,停止树的添加与生长
import xgboost as xgb 
from sklearn.model_selection import train_test_split 
from sklearn import datasets 

digits = datasets.load_digits(n_class=2) 
X = digits['data'] 
y = digits['target'] 
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0) 
clf = xgb.XGBClassifier() 
clf.fit(X_train, y_train, early_stopping_rounds=10, eval_metric="auc", eval_set=[(X_test, y_test)])

显示结果:

[0] validation_0-auc:0.99950
Will train until validation_0-auc hasn’t improved in 10 rounds.
[1] validation_0-auc:0.99975
[2] validation_0-auc:0.99975
[3] validation_0-auc:0.99975
[4] validation_0-auc:0.99975
[5] validation_0-auc:0.99975
[6] validation_0-auc:1.00000
[7] validation_0-auc:1.00000
[8] validation_0-auc:1.00000
[9] validation_0-auc:1.00000
[10] validation_0-auc:1.00000
[11] validation_0-auc:1.00000
[12] validation_0-auc:1.00000
[13] validation_0-auc:1.00000
[14] validation_0-auc:1.00000
[15] validation_0-auc:1.00000
[16] validation_0-auc:1.00000
Stopping. Best iteration:
[6] validation_0-auc:1.00000

XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=1, colsample_bynode=1, 
	colsample_bytree=1, gamma=0, learning_rate=0.1, 
	max_delta_step=0, max_depth=3, min_child_weight=1, missing=None, 
	n_estimators=100, n_jobs=1, nthread=None, 
	objective='binary:logistic', random_state=0, 
reg_alpha=0, 
	reg_lambda=1, scale_pos_weight=1, seed=None, silent=None, 
	subsample=1, verbosity=1)

4. 使用Xgboost输出特征重要程度

import xgboost as xgb 
from sklearn.model_selection import train_test_split 
from sklearn import datasets 
iris = datasets.load_iris() 
y = iris['target'] 
X = iris['data'] 
xgb_model = xgb.XGBClassifier().fit(X,y) 

temp = pd.DataFrame() 
temp['feature_names'] = ['sepal_length', 'sepal_width', 'petal_length', 'petal_width'] 
temp['feature_importances'] = xgb_model.feature_importances_ 
temp = temp.sort_values('feature_importances',ascending = False) 
temp

输出结果:
在这里插入图片描述

temp.set_index('feature_names').plot.bar(figsize=(16,8),rot=0)

显示结果:

<matplotlib.axes._subplots.AxesSubplot at 0x1a308a3150>

在这里插入图片描述

  • 不同算法解决不同的问题,但是首先需要确定的是问题本身(分类还是回归)

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值