XGBoost算法

一、XGBoost原理详解

此处还未完全看懂和推导,后续学习用到再补充。
可参考:通俗理解kaggle比赛大杀器xgboost
进一步了解XGBoost参数详解
可参考:【机器学习】Xgboost的使用及参数详解

二、XGBoost算法案例

2.1 原生工具库的上手指导

import xgboost as xgb  # 引入工具库
# read in data
dtrain = xgb.DMatrix('demo/data/agaricus.txt.train')   # XGBoost的专属数据格式,但是也可以用dataframe或者ndarray
dtest = xgb.DMatrix('demo/data/agaricus.txt.test')  # # XGBoost的专属数据格式,但是也可以用dataframe或者ndarray
# specify parameters via map
param = {'max_depth':2, 'eta':1, 'objective':'binary:logistic' }    # 设置XGB的参数,使用字典形式传入
num_round = 2     # 使用线程数
bst = xgb.train(param, dtrain, num_round)   # 训练
# make prediction
preds = bst.predict(dtest)   # 预测

xgb.train: 是用于通过梯度提升方法训练模型的低级API (原生接口),可用于分类,也可回归
xgb.XGBClassifier: 分类模型 (sklearn接口)
xgb.XGBRegressor: 回归模型 (sklearn接口)

2.2 分类案例(鸢尾花数据集)

使用xgb.train和xgb.XGBClassifier两种分类方法

from sklearn.datasets import load_iris
import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score   # 准确率
# 加载样本数据集
iris = load_iris()
X,y = iris.data,iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234565) # 数据集分割

# 算法参数
params = {
    'booster': 'gbtree',
    'objective': 'multi:softmax',   # 多分类的问题
    'num_class': 3,                 # 类别数,与 multisoftmax 并用
    'gamma': 0.1,                   # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
    'max_depth': 6,                 # 构建树的深度,越大越容易过拟合
    'lambda': 2,                    # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
    'subsample': 0.7,               # 随机采样训练样本
    'colsample_bytree': 0.75,       # 生成树时进行的列采样
    'min_child_weight': 3,
    'silent': 0,                    # 设置成1则没有运行信息输出,最好是设置为0.
    'eta': 0.1,                     # 如同学习率
    'seed': 1,
    'nthread': 4,                   # cpu 线程数
}


dtrain = xgb.DMatrix(X_train, y_train) # 生成数据集格式
num_rounds = 500
model = xgb.train(params, dtrain, num_rounds) # xgboost模型训练

# 对测试集进行预测
dtest = xgb.DMatrix(X_test)
y_pred = model.predict(dtest)

# 计算准确率
accuracy = accuracy_score(y_test,y_pred)
print("accuarcy: %.2f%%" % (accuracy*100.0))

# 显示重要特征
plot_importance(model)
plt.show()

'''
#使用xgb.XGBClassifier: 分类模型
model1 = xgb.XGBClassifier(max_depth=5, learning_rate=0.1, n_estimators=160, silent=True, objective='multi:softmax')
model1.fit(X_train, y_train)
# 对测试集进行预测
dtest = xgb.DMatrix(X_test)
y_pred1 = model.predict(dtest)
# 计算准确率
accuracy = accuracy_score(y_test,y_pred1)
print("accuarcy: %.2f%%" % (accuracy*100.0))
'''

在这里插入图片描述

2.3 回归案例(boston数据集)

使用xgb.train和xgb.XGBRegressor两种回归方法

import xgboost as xgb
from xgboost import plot_importance
from matplotlib import pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
from sklearn.metrics import mean_squared_error

# 加载数据集
boston = load_boston()
X,y = boston.data,boston.target

# XGBoost训练过程
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

params = {
    'booster': 'gbtree',
    'objective': 'reg:squarederror',    #回归问题
    'gamma': 0.1,                       # 用于控制是否后剪枝的参数,越大越保守,一般0.1、0.2这样子。
    'max_depth': 5,                     # 构建树的深度,越大越容易过拟合
    'lambda': 3,                        # 控制模型复杂度的权重值的L2正则化项参数,参数越大,模型越不容易过拟合。
    'subsample': 0.7,                   # 随机采样训练样本
    'colsample_bytree': 0.7,            # 生成树时进行的列采样
    'min_child_weight': 3,
    'silent': 1,                        # 设置成1则没有运行信息输出,最好是设置为0.
    'eta': 0.1,                         # 如同学习率
    'seed': 1000,                       #随机种子
    'nthread': 4,                       # cpu 线程数
}

dtrain = xgb.DMatrix(X_train, y_train)
num_rounds = 300
model = xgb.train(params, dtrain, num_rounds)

# 对测试集进行预测
dtest = xgb.DMatrix(X_test)
ypred = model.predict(dtest)
print("均方误差:",mean_squared_error(y_test,ypred))
# 显示重要特征
plot_importance(model)
plt.show()

'''
#使用xgb.XGBRegressor回归模型
model1 = xgb.XGBRegressor()
model1.fit(X_train, y_train)

# 对测试集进行预测
dtest1 = xgb.DMatrix(X_test)
ypred1 = model.predict(dtest1)
print("均方误差:",mean_squared_error(y_test,ypred1))
# 显示重要特征
plot_importance(model1)
plt.show()
'''

在这里插入图片描述
在这里插入图片描述

2.4 XGBoost调参(结合sklearn网格搜索算法)

import xgboost as xgb
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import roc_auc_score

iris = load_iris()
X,y = iris.data,iris.target
col = iris.target_names 
train_x, valid_x, train_y, valid_y = train_test_split(X, y, test_size=0.3, random_state=1)   # 分训练集和验证集
parameters = {
              'max_depth': [5, 10, 15, 20, 25],
              'learning_rate': [0.01, 0.02, 0.05, 0.1, 0.15],
              'n_estimators': [500, 1000, 2000, 3000, 5000],
              'min_child_weight': [0, 2, 5, 10, 20],
              'max_delta_step': [0, 0.2, 0.6, 1, 2],
              'subsample': [0.6, 0.7, 0.8, 0.85, 0.95],
              'colsample_bytree': [0.5, 0.6, 0.7, 0.8, 0.9],
              'reg_alpha': [0, 0.25, 0.5, 0.75, 1],
              'reg_lambda': [0.2, 0.4, 0.6, 0.8, 1],
              'scale_pos_weight': [0.2, 0.4, 0.6, 0.8, 1]

}

xlf = xgb.XGBClassifier(max_depth=10,
            learning_rate=0.01,
            n_estimators=2000,
            silent=True,
            objective='multi:softmax',
            num_class=3 ,          
            nthread=-1,
            gamma=0,
            min_child_weight=1,
            max_delta_step=0,
            subsample=0.85,
            colsample_bytree=0.7,
            colsample_bylevel=1,
            reg_alpha=0,
            reg_lambda=1,
            scale_pos_weight=1,
            seed=0,
            missing=None)

gs = GridSearchCV(xlf, param_grid=parameters, scoring='accuracy', cv=3)
gs.fit(train_x, train_y)

print("Best score: %0.3f" % gs.best_score_)
print("Best parameters set: %s" % gs.best_params_ )

参考:DataWhale/ensemble-learning

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值