|
一、Xgboost
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/1/4 14:24
# @Author : zhm
# @File : XgbTrain.py
# @Software: PyCharm
from Util import load_data
import xgboost as xgb
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')
def begin():
if not os.path.exists('model/train.buffer'):
x_train, y_train, x_test, y_test = load_data()
dtrain = xgb.DMatrix(x_train, label=y_train)
# dtest = xgb.DMatrix(x_test, label=y_test)
dtrain.save_binary("model/train.buffer")
# dtest.save_binary("model/test.buffer")
else:
dtrain = xgb.DMatrix("model/train.buffer")
# dtest = xgb.DMatrix("model/test.buffer")
param = {'bst:max_depth': 8, 'bst:eta': 0.1, 'objective': 'reg:logistic'}
param['nthread'] = 4
plst = param.items()
# evallist = [(dtest, 'eval'), (dtrain, 'train')]
# bst = xgb.train(plst, dtrain, 20, evallist)
bst = xgb.train(plst, dtrain, 20)
bst.save_model('model/model')
bst.dump_model('model/dump.raw.txt')
if __name__ == '__main__':
begin()
任务参数
根据任务、目的设置的参数,比如回归任务与排序任务的目的是不同的
- objective,训练目标,分类还是回归
reg:linear,线性回归reg:logistic,逻辑回归binary:logistic,使用LR二分类,输出概率binary:logitraw,使用LR二分类,但在进行logistic转换之前直接输出分类得分count:poisson,泊松回归multi:softmax,使用softmax进行多分类,需要设置类别数num_classmulti:softprobrank:pairwise,进行排序任务,最小化pairwise损失reg:gamma,gamma回归reg:tweedie,tweedie回归
- 评价指标
eval_metric,默认根据目标函数设置,针对验证集,默认情况下,最小均方误差用于回归,错分用于分类,平均精确率用于排序等,可以同时使用多个评估指标,在python里使用列表来放置
- 均方误差
rmse - 平均绝对值误差
mae - 对数损失
logloss,负的对数似然 - 错误率
error,根据0.5作为阈值判断的错分率 - 自定义阈值错分率
error@t - 多分类错分率
merror - 多分类对数损失
mlogloss auc主要用来排序ndcg,normalized discounted cumulative gain及其他的一些针对泊松回归等问题的评价指标
命令行参数
num_round迭代次数,也对应基学习器数目task当前对模型的任务,包括
- 训练
train - 预测
pred - 评估/验证
eval - 导出模型
dump
- 导入导出模型的路径
model_in和model_out fmap,feature map用来导出模型
二、Lightgbm
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2018/1/8 14:32
# @Author : zhm
# @File : LgbmTrain.py
# @Software: PyCharm
from Util import load_data
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')
import lightgbm as lgb
def begin():
if not os.path.exists('lgb_model/train.buffer'):
x_train, y_train, x_test, y_test = load_data()
dtrain = lgb.Dataset(x_train, y_train)
dtrain.save_binary("lgb_model/train.buffer")
else:
dtrain = lgb.Dataset("lgb_model/train.buffer")
params = {
'task': 'train',
'boosting_type': 'gbdt',
'objective': 'regression',
'learning_rate': 0.1,
'max_depth': 8,
'verbose': 3
}
print('Start training...')
# train
gbm = lgb.train(params,
dtrain,
num_boost_round=100)
gbm.save_model('lgb_model/model')
if __name__ == '__main__':
begin()
核心参数
- 叶节点数
num_leaves,与模型复杂度直接相关(leaf-wise) - 任务目标
- 回归
regression,对应的损失函数如下
regression_l1,加了l1正则的回归,等同于绝对值误差regression_l2,等同于均方误差huber,Huber Lossfair,Fair Losspoisson,泊松回归
- 分类
- 排序
- 模型
boosting
gbdt,传统的梯度提升决策树rf,随机森林dart,Dropouts meet Multiple Additive Regression Treesgoss,Gradient-based One-Side Sampling
- 迭代次数
num_iterations,对于多分类问题,LightGBM会构建num_class*num_iterations的树 - 学习率/步长
learning_rate,即shrinkage - 树的训练方式
tree_learner,主要用来控制树是否并行化训练
serial,单机的树学习器feature,特征并行的树学习器data,数据并行的树学习器
- 线程数
num_threads - 设备
device,使用cpu还是gpu
训练控制参数
防止过拟合
- 树的最大深度
max_depth,主要用来避免模型的过拟合,设为负数值则表明不限制 - 叶节点的最少样本数
min_data_in_leaf - 叶节点的最小海森值之和
min_sum_hessian_in_leaf - 列采样
feature_fraction,每棵树的特征子集占比,设置在0~1之间,可以加快训练速度,避免过拟合 - 行采样
bagging_fraction,不进行重采样的随机选取部分样本数据,此外需要设置参数bagging_freq来作为采样的频率,即多少轮迭代做一次bagging; - 早停止
early_stopping_roung,在某一验证数据的某一验证指标当前最后一轮迭代没有提升时停止迭代 - 正则化
- 切分的最小收益
min_gain_to_split
IO参数
直方图相关
- 最大直方图数
max_bin,特征值装载的最大直方图数目,一般较小的直方图数目会降低训练的准确性但会提升整体的表现,处理过拟合 - 直方图中最少样本数
min_data_in_bin,设置每个直方图中样本数的最小值,同样防止过拟合
特征相关
- 是否预排序
is_pre_partition - 是否稀疏
is_sparse - 类别特征列
categorical_feature,声明类别特征对应的列(通过索引标记),仅支持int类型 - 声明权重列
weight,指定一列作为权重列
内存相关
- 分阶段加载数据
two_round,一般LightGBM将数据载入内存进行处理,这样会提升数据的加载速度,但是对于数据量较大时会造成内存溢出,所以此时需要分阶段载入 - 保存数据为二进制
save_binary,将数据文件导出为二进制文件,下次加载数据时就会更快一些
缺失值
- 是否处理缺失值
use_missing - 是否将0值作为缺失值
zeros_as_missing
目标参数
sigmoid,sigmoid函数中的参数,用于二分类和排序任务scale_pos_weight,设置正例在二分类任务中的样本占比- 初始化为均值
boost_from_average,调整初始的分数为标签的均值,加速模型训练的收敛速度,仅用于回归任务 - 样本类别是否不平衡
is_unbalance num_class,用于多分类
|