xgboost 实践[3]_sklearn

  • 构建xgboost 模型预测

安装

  • (window下安装xgboost)

参考:

  1. Windows下在Anaconda3中安装python版的XGBoost库
  2. 简单到一步安装 xgboost (Windows环境)

选择合适的包,下载下来,在下载下来的文件目录下直接pip:

xgboost 实践[3]_sklearn

说明

  • xgboost自带的接口(predict)输出的是概率
  • sklearn 接口(predict)是分类结果,预测(proba)是概率
  • 参数设置(?)

代码实现

import xgboost as xgb
import pandas as pd
from sklearn.externals import joblib
from xgboost.sklearn import XGBClassifier
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import roc_auc_score

'''------------------------------------------
1 读取数据
----------------------------------------------'''
data = pd.read_csv('data_processed.csv',encoding='gbk') 

'''-------------------------------------------
1.1 划分训练集何验证集
----------------------------------------------'''
train, test = train_test_split(data, test_size=0.1, random_state=666)

'''----------------------------------------
1.2 获取标签
-------------------------------------------'''
y_train = train.status
train.drop(['status'], axis=1, inplace=True)

y_test = test.status
test.drop(['status'], axis=1, inplace=True)

'''---------------------------------------------
1.3 数据标准化
-----------------------------------------------'''
scaler = StandardScaler()
train = pd.DataFrame(scaler.fit_transform(train),index=train.index, columns=test.columns)
test = pd.DataFrame(scaler.fit_transform(test),index=test.index, columns=test.columns)
'''------------------------
【将数据格式转换成xgb模型所需的格式】
-----------------------'''
d_train = xgb.DMatrix(train, label=y_train)
d_valid = xgb.DMatrix(test, label=y_test)
d_test = xgb.DMatrix(test)

watchlist = [(d_train, 'traiin'), (d_valid, 'valid')]  ##??????????
'''-------------------------
1.4 参数设置
----------------------'''
params = {
         'eta': 0.3,
         'max_depth':3,   
         'min_child_weight':1,
         'gamma':0.3, 
         'subsample':0.8,
         'colsample_bytree':0.8,
         'booster':'gbtree',
         'objective': 'binary:logistic',
         'nthread':12,
         'scale_pos_weight': 1,
         'lambda':1,  
         'seed':27,
         'silent':0,   
}

clf = XGBClassifier(
        n_estimators=30,#三十棵树
        learning_rate =0.3,
        max_depth=3,
        min_child_weight=1,
        gamma=0.3,
        subsample=0.8,
        colsample_bytree=0.8,
        objective= 'binary:logistic',
        nthread=12,
        scale_pos_weight=1,
        reg_lambda=1,
        seed=27
        )

'''---------------
1.5 模型训练
------------------'''
model_xgb = xgb.train(params, d_train, 30, watchlist, early_stopping_rounds=500, verbose_eval=10)
model_sklearn = clf.fit(train, y_train)
'''--------------
1.6 保存模型
--------------'''
joblib.dump(model_xgb, 'model/xgb.pkl')
joblib.dump(model_sklearn, 'model/xgb_skearn.pkl')
'''------------------------
1.7 模型预测
--------------------------'''
y_xgb = model_xgb.predict(d_test)

y_skearn_pre = clf.predict(test)
y_skearn_proba = clf.predict_proba(test)[:,1]


print('XGboost_自带接口  AUC:{}'.format(roc_auc_score(y_test, y_xgb)))
print('XGboost_Sklearn接口 AUC(predict):{}'.format(roc_auc_score(y_test,y_skearn_pre)))
print('XGboost_Sklearn接口 AUC(proba):{}'.format(roc_auc_score(y_test, y_skearn_proba)))

xgboost 实践[3]_sklearn

XGBoost参数说明

  • XGBoost的作者把所有的参数分成了三类:
    1. 通用参数:宏观函数控制
    2. Booster参数:控制每一步的booster(tree/regression)
    3. 学习目标参数:控制训练目标

1.通用参数

参数 默认 说明
booster gbtree gbtree:基于树的模型
gbliner:线性模型
silent 0 1:静态模式开启,不会输出任何信息
保持默认的0:帮助更好的理解模型
nthread 最大可能的线程 用来进行多线程控制
算法自动检测cpu的全部核

2.booster参数

  • 尽管有两种booster可以选择,只介绍tree booster (表现远胜过linear booster,一般linear booster很少使用)
参数 默认 说明
eta 0.3 - 和GBM中的 learning rate 参数类似
- 通过减少每一步的权重,可以提高模型的鲁棒性
- 典型值为0.01-0.2
min_child_weight 1 - 决定最小叶子节点样本权重和
- 和GBM的 min_child_leaf 参数类似,但XGBoost的是最小样本权重的和,而GBM是最小样本总数,
- 用于避免过拟合。当它的值较大时,可以避免模型学习到局部的特殊样本
- 但是如果这个值过高,会导致欠拟合。需要使用CV来调整
max_depth 6 - 和GBM中的参数相同,这个值为树的最大深度
- 也是用来避免过拟合,max_depth越大,模型会学到更具体更局部的样本
- 需要使用CV函数来进行调优
- 典型值3-10
max_leaf_nodes - 树上最大的节点或叶子的数量
- 可以替代max_depth的作用,如果生成的是二叉树,一个深度为n的树最多生成nn2n^2个叶子
- 定义了这个参数,GBM会忽略max_depth参数
gamma 0 - 在节点分裂时,只有分裂后损失函数的值下降了,才会分裂这个节点。Gamma指定了节点分裂所需的最小损失函数下降值
- 这个参数的值越大,算法越保守。这个参数的值和损失函数息息相关,所以是需要调整的
max_delta_step 0 - 这参数限制每棵树权重改变的最大步长。如果这个参数的值为0,那就意味着没有约束。如果它被赋予了某个正值,那么它会让这个算法更加保守
- 通常,这个参数不需要设置。但是当各类别的样本十分不平衡时,它对逻辑回归是很有帮助的
- 这个参数一般用不到
subsample 1 - 和GBM中的subsample参数一模一样。这个参数控制对于每棵树,随机采样的比例
- 减小这个参数的值,算法会更加保守,避免过拟合。但是,如果这个值设置得过小,它可能会导致欠拟合
- 典型值:0.5-1
colsample_bytree 1 - 和GBM里面的max_features参数类似。用来控制每棵随机采样的列数的占比(每一列是一个特征)
- 典型值:0.5-1
colsample_bylevel 1 - 用来控制树的每一级的每一次分裂,对列数的采样的占比
lambda 1 - 权重的L2正则化项。(和Ridge regression类似)
alpha 1 - 权重的L1正则化项。(和Lasso regression类似)
- 可以应用在很高维度的情况下,使得算法的速度更快
scale_pos_weight 1 - 在各类别样本十分不平衡时,把这个参数设定为一个正值,使算法更快收敛

3 学习目前参数

  • 这个参数用来控制理想的优化目标和每一个结果的度量方法
参数 默认 说明
objective reg:linear - binary:logistic 二分类的逻辑回归
- multi:softmax 使用softmax的多分类(这种情况下,需要设置:num_class)
-multi:softprob 返回每种数据 属于各个类别的概率
eval_metric 取决于objective参数 - 回归默认rmse ,分类默认error
seed 0 - 随机数种子
  • Scikit-learn中和xgb命名区别

    1. eta -> learning_rate

    2. lambda -> reg_lambda

    3. alpha -> reg_alpha

参考

机器学习系列(12)_XGBoost参数调优完全指南(附Python代码)

相关文章: