xgboost 实践[3]_sklearn
- 构建xgboost 模型预测
安装
- (window下安装xgboost)
参考:
选择合适的包,下载下来,在下载下来的文件目录下直接pip:
说明
- 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参数说明
- XGBoost的作者把所有的参数分成了三类:
- 通用参数:宏观函数控制
- Booster参数:控制每一步的booster(tree/regression)
- 学习目标参数:控制训练目标
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的树最多生成n个叶子 - 定义了这个参数,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命名区别
-
eta -> learning_rate
-
lambda -> reg_lambda
-
alpha -> reg_alpha
-
参考
机器学习系列(12)_XGBoost参数调优完全指南(附Python代码)