数学基础
- 线性代数
- 概率论与随机过程
- 数值计算
- 蒙特卡洛方法与 MCMC 采样
- 机器学习方法概论
统计学习
深度学习
- 深度学习简介
- 深度前馈网络
- 反向传播算法
- 正则化
- 深度学习中的最优化问题
- 卷积神经网络
- CNN:图像分类
- 循环神经网络 RNN
- Transformer
- 一、Transformer [2017]
- 二、Universal Transformer [2018]
- 三、Transformer-XL [2019]
- 四、GPT1 [2018]
- 五、GPT2 [2019]
- 六、GPT3 [2020]
- 七、OPT [2022]
- 八、BERT [2018]
- 九、XLNet [2019]
- 十、RoBERTa [2019]
- 十一、ERNIE 1.0 [2019]
- 十二、ERNIE 2.0 [2019]
- 十三、ERNIE 3.0 [2021]
- 十四、ERNIE-Huawei [2019]
- 十五、MT-DNN [2019]
- 十六、BART [2019]
- 十七、mBART [2020]
- 十八、SpanBERT [2019]
- 十九、ALBERT [2019]
- 二十、UniLM [2019]
- 二十一、MASS [2019]
- 二十二、MacBERT [2019]
- 二十三、Fine-Tuning Language Models from Human Preferences [2019]
- 二十四 Learning to summarize from human feedback [2020]
- 二十五、InstructGPT [2022]
- 二十六、T5 [2020]
- 二十七、mT5 [2020]
- 二十八、ExT5 [2021]
- 二十九、Muppet [2021]
- 三十、Self-Attention with Relative Position Representations [2018]
- 三十一、USE [2018]
- 三十二、Sentence-BERT [2019]
- 三十三、SimCSE [2021]
- 三十四、BERT-Flow [2020]
- 三十五、BERT-Whitening [2021]
- 三十六、Comparing the Geometry of BERT, ELMo, and GPT-2 Embeddings [2019]
- 三十七、CERT [2020]
- 三十八、DeCLUTR [2020]
- 三十九、CLEAR [2020]
- 四十、ConSERT [2021]
- 四十一、Sentence-T5 [2021]
- 四十二、ULMFiT [2018]
- 四十三、Scaling Laws for Neural Language Models [2020]
- 四十四、Chinchilla [2022]
- 四十七、GLM-130B [2022]
- 四十八、GPT-NeoX-20B [2022]
- 四十九、Bloom [2022]
- 五十、PaLM [2022] (粗读)
- 五十一、PaLM2 [2023](粗读)
- 五十二、Self-Instruct [2022]
- 句子向量
- 词向量
- 传统CTR 预估模型
- CTR 预估模型
- 一、DSSM [2013]
- 二、FNN [2016]
- 三、PNN [2016]
- 四、DeepCrossing [2016]
- 五、Wide 和 Deep [2016]
- 六、DCN [2017]
- 七、DeepFM [2017]
- 八、NFM [2017]
- 九、AFM [2017]
- 十、xDeepFM [2018]
- 十一、ESMM [2018]
- 十二、DIN [2017]
- 十三、DIEN [2019]
- 十四、DSIN [2019]
- 十五、DICM [2017]
- 十六、DeepMCP [2019]
- 十七、MIMN [2019]
- 十八、DMR [2020]
- 十九、MiNet [2020]
- 二十、DSTN [2019]
- 二十一、BST [2019]
- 二十二、SIM [2020]
- 二十三、ESM2 [2019]
- 二十四、MV-DNN [2015]
- 二十五、CAN [2020]
- 二十六、AutoInt [2018]
- 二十七、Fi-GNN [2019]
- 二十八、FwFM [2018]
- 二十九、FM2 [2021]
- 三十、FiBiNET [2019]
- 三十一、AutoFIS [2020]
- 三十三、AFN [2020]
- 三十四、FGCNN [2019]
- 三十五、AutoCross [2019]
- 三十六、InterHAt [2020]
- 三十七、xDeepInt [2023]
- 三十九、AutoDis [2021]
- 四十、MDE [2020]
- 四十一、NIS [2020]
- 四十二、AutoEmb [2020]
- 四十三、AutoDim [2021]
- 四十四、PEP [2021]
- 四十五、DeepLight [2021]
- 图的表达
- 一、DeepWalk [2014]
- 二、LINE [2015]
- 三、GraRep [2015]
- 四、TADW [2015]
- 五、DNGR [2016]
- 六、Node2Vec [2016]
- 七、WALKLETS [2016]
- 八、SDNE [2016]
- 九、CANE [2017]
- 十、EOE [2017]
- 十一、metapath2vec [2017]
- 十二、GraphGAN [2018]
- 十三、struc2vec [2017]
- 十四、GraphWave [2018]
- 十五、NetMF [2017]
- 十六、NetSMF [2019]
- 十七、PTE [2015]
- 十八、HNE [2015]
- 十九、AANE [2017]
- 二十、LANE [2017]
- 二十一、MVE [2017]
- 二十二、PMNE [2017]
- 二十三、ANRL [2018]
- 二十四、DANE [2018]
- 二十五、HERec [2018]
- 二十六、GATNE [2019]
- 二十七、MNE [2018]
- 二十八、MVN2VEC [2018]
- 二十九、SNE [2018]
- 三十、ProNE [2019]
- Graph Embedding 综述
- 图神经网络
- 一、GNN [2009]
- 二、Spectral Networks 和 Deep Locally Connected Networks [2013]
- 三、Fast Localized Spectral Filtering On Graph [2016]
- 四、GCN [2016]
- 五、神经图指纹 [2015]
- 六、GGS-NN [2016]
- 七、PATCHY-SAN [2016]
- 八、GraphSAGE [2017]
- 九、GAT [2017]
- 十、R-GCN [2017]
- 十一、 AGCN [2018]
- 十二、FastGCN [2018]
- 十三、PinSage [2018]
- 十四、GCMC [2017]
- 十五、JK-Net [2018]
- 十六、PPNP [2018]
- 十七、VRGCN [2017]
- 十八、ClusterGCN [2019]
- 十九、LDS-GNN [2019]
- 二十、DIAL-GNN [2019]
- 二十一、HAN [2019]
- 二十二、HetGNN [2019]
- 二十三、HGT [2020]
- 二十四、GPT-GNN [2020]
- 二十五、Geom-GCN [2020]
- 二十六、Graph Network [2018]
- 二十七、GIN [2019]
- 二十八、MPNN [2017]
- 二十九、UniMP [2020]
- 三十、Correct and Smooth [2020]
- 三十一、LGCN [2018]
- 三十二、DGCNN [2018]
- 三十三、AS-GCN
- 三十四、DGI [2018]
- 三十五、DIFFPOLL [2018]
- 三十六、DCNN [2016]
- 三十七、IN [2016]
- 图神经网络 2
- 图神经网络 3
- 推荐算法(传统方法)
- 一、Tapestry [1992]
- 二、GroupLens [1994]
- 三、ItemBased CF [2001]
- 四、Amazon I-2-I CF [2003]
- 五、Slope One Rating-Based CF [2005]
- 六、Bipartite Network Projection [2007]
- 七、Implicit Feedback CF [2008]
- 八、PMF [2008]
- 九、SVD++ [2008]
- 十、MMMF 扩展 [2008]
- 十一、OCCF [2008]
- 十二、BPR [2009]
- 十三、MF for RS [2009]
- 十四、 Netflix BellKor Solution [2009]
- 推荐算法(神经网络方法 1)
- 一、MIND [2019](用于召回)
- 二、DNN For YouTube [2016]
- 三、Recommending What Video to Watch Next [2019]
- 四、ESAM [2020]
- 五、Facebook Embedding Based Retrieval [2020](用于检索)
- 六、Airbnb Search Ranking [2018]
- 七、MOBIUS [2019](用于召回)
- 八、TDM [2018](用于检索)
- 九、DR [2020](用于检索)
- 十、JTM [2019](用于检索)
- 十一、Pinterest Recommender System [2017]
- 十二、DLRM [2019]
- 十三、Applying Deep Learning To Airbnb Search [2018]
- 十四、Improving Deep Learning For Airbnb Search [2020]
- 十五、HOP-Rec [2018]
- 十六、NCF [2017]
- 十七、NGCF [2019]
- 十八、LightGCN [2020]
- 十九、Sampling-Bias-Corrected Neural Modeling [2019](检索)
- 二十、EGES [2018](Matching 阶段)
- 二十一、SDM [2019](Matching 阶段)
- 二十二、COLD [2020 ] (Pre-Ranking 模型)
- 二十三、ComiRec [2020](https://www.wenjiangs.com/doc/0b4e1736-ac78)
- 二十四、EdgeRec [2020]
- 二十五、DPSR [2020](检索)
- 二十六、PDN [2021](mathcing)
- 二十七、时空周期兴趣学习网络ST-PIL [2021]
- 推荐算法之序列推荐
- 一、FPMC [2010]
- 二、GRU4Rec [2015]
- 三、HRM [2015]
- 四、DREAM [2016]
- 五、Improved GRU4Rec [2016]
- 六、NARM [2017]
- 七、HRNN [2017]
- 八、RRN [2017]
- 九、Caser [2018]
- 十、p-RNN [2016]
- 十一、GRU4Rec Top-k Gains [2018]
- 十二、SASRec [2018]
- 十三、RUM [2018]
- 十四、SHAN [2018]
- 十五、Phased LSTM [2016]
- 十六、Time-LSTM [2017]
- 十七、STAMP [2018]
- 十八、Latent Cross [2018]
- 十九、CSRM [2019]
- 二十、SR-GNN [2019]
- 二十一、GC-SAN [2019]
- 二十二、BERT4Rec [2019]
- 二十三、MCPRN [2019]
- 二十四、RepeatNet [2019]
- 二十五、LINet(2019)
- 二十六、NextItNet [2019]
- 二十七、GCE-GNN [2020]
- 二十八、LESSR [2020]
- 二十九、HyperRec [2020]
- 三十、DHCN [2021]
- 三十一、TiSASRec [2020]
- 推荐算法(综述)
- 多任务学习
- 系统架构
- 实践方法论
- 深度强化学习 1
- 自动代码生成
工具
- CRF
- lightgbm
- xgboost
- scikit-learn
- spark
- numpy
- matplotlib
- pandas
- huggingface_transformer
- 一、Tokenizer
- 二、Datasets
- 三、Model
- 四、Trainer
- 五、Evaluator
- 六、Pipeline
- 七、Accelerate
- 八、Autoclass
- 九、应用
- 十、Gradio
Scala
- 环境搭建
- 基础知识
- 函数
- 类
- 样例类和模式匹配
- 测试和注解
- 集合 collection(一)
- 集合collection(二)
- 集成 Java
- 并发
七、Python API
7.1 数据接口
7.1.1 数据格式
xgboost
的数据存储在DMatrix
对象中xgboost
支持直接从下列格式的文件中加载数据:libsvm
文本格式的文件。其格式为:xxxxxxxxxx
[label] [index1]:[value1] [index2]:[value2] ... [label] [index1]:[value1] [index2]:[value2] ... ...xgboost binary buffer
文件
xxxxxxxxxx
dtrain = xgb.DMatrix('train.svm.txt') #libsvm 格式 dtest = xgb.DMatrix('test.svm.buffer') # xgboost binary buffer 文件xgboost
也支持从二维的numpy array
中加载数据xxxxxxxxxx
data = np.random.rand(5, 10) label = np.random.randint(2, size=5) dtrain = xgb.DMatrix(data, label=label)#从 numpy array 中加载你也可以从
scipy.sparse array
中加载数据xxxxxxxxxx
csr = scipy.sparse.csr_matrix((dat, (row, col))) dtrain = xgb.DMatrix(csr)
7.1.2 DMatrix
DMatrix
: 由xgboost
内部使用的数据结构,它存储了数据集,并且针对了内存消耗和训练速度进行了优化。xxxxxxxxxx
xgboost.DMatrix(data, label=None, missing=None, weight=None, silent=False, feature_names=None, feature_types=None, nthread=None)参数:
data
:表示数据集。可以为:- 一个字符串,表示文件名。数据从该文件中加载
- 一个二维的
numpy array
, 表示数据集。
label
:一个序列,表示样本标记。missing
: 一个值,它是缺失值的默认值。weight
:一个序列,给出了数据集中每个样本的权重。silent
: 一个布尔值。如果为True
,则不输出中间信息。feature_names
: 一个字符串序列,给出了每一个特征的名字feature_types
: 一个字符串序列,给出了每个特征的数据类型nthread
:
属性:
feature_names
: 返回每个特征的名字feature_types
: 返回每个特征的数据类型
方法:
.get_base_margin()
: 返回一个浮点数,表示DMatrix
的base margin
。.set_base_margin(margin)
: 设置DMatrix
的base margin
- 参数:
margin
: t一个序列,给出了每个样本的prediction margin
- 参数:
.get_float_info(field)
: 返回一个numpy array
, 表示DMatrix
的float property
。.set_float_info(field,data)
: 设置DMatrix
的float property
。.set_float_info_npy2d(field,data)
: 设置DMatrix
的float property
。这里的data
是二维的numpy array
参数:
field
: 一个字符串,给出了information
的字段名。注:意义未知。data
: 一个numpy array
,给出了数据集每一个点的float information
.get_uint_info(field)
: 返回DMatrix
的unsigned integer property
。.set_unit_info(field,data)
: 设置DMatrix
的unsigned integer property
。参数:
field
: 一个字符串,给出了information
的字段名。注:意义未知。data
: 一个numpy array
, 给出了数据集每个点的uint information
返回值:一个
numpy array
,表示数据集的unsigned integer information
.get_label()
: 返回一个numpy array
,表示DMatrix
的label
。.set_label(label)
: 设置样本标记。.set_label_npy2d(label)
: 设置样本标记。这里的label
为二维的numpy array
- 参数:
label
: 一个序列,表示样本标记
- 参数:
.get_weight()
: 一个numpy array
,返回DMatrix
的样本权重。.set_weight(weight)
: 设置样本权重。.set_weight_npy2d(weight)
: 设置样本权重。这里的weight
为二维的numpy array
- 参数:
weight
:一个序列,表示样本权重
- 参数:
.num_col()
: 返回DMatrix
的列数- 返回值:一个整数,表示特征的数量
.num_row()
: 返回DMatrix
的行数- 返回值:一个整数,表示样本的数量
save_binary(fname,silent=True)
: 保存DMatrix
到一个xgboost buffer
文件中参数:
fname
: 一个字符串,表示输出的文件名silent
: 一个布尔值。如果为True
,则不输出中间信息。
.set_group(group)
: 设置DMatrix
每个组的大小(用于排序任务)- 参数:
group
: 一个序列,给出了每个组的大小
- 参数:
slice(rindex)
: 切分DMaxtrix
,返回一个新的DMatrix
。 该新的DMatrix
仅仅包含rindex
- 参数:
rindex
: 一个列表,给出了要保留的index
- 返回值:一个新的
DMatrix
对象
- 参数:
示例:
data/train.svm.txt
的内容:xxxxxxxxxx
1 1:1 2:2 1 1:2 2:3 1 1:3 2:4 1 1:4 2:5 0 1:5 2:6 0 1:6 2:7 0 1:7 2:8 0 1:8 2:9测试代码:
x import xgboost as xgt import numpy as np class MatrixTest: ''' 测试 DMatrix ''' def __init__(self): self._matrix1 = xgt.DMatrix('data/train.svm.txt') self._matrix2 = xgt.DMatrix(data=np.arange(0, 12).reshape((4, 3)), label=[1, 2, 3, 4], weight=[0.5, 0.4, 0.3, 0.2], silent=False, feature_names=['a', 'b', 'c'], feature_types=['int','int','float'], nthread=2) def print(self,matrix): print('feature_names:%s'%matrix.feature_names) print('feature_types:%s' % matrix.feature_types) def run_get(self,matrix): print('get_base_margin():', matrix.get_base_margin()) print('get_label():', matrix.get_label()) print('get_weight():', matrix.get_weight()) print('num_col():', matrix.num_col()) print('num_row():', matrix.num_row()) def test(self): print('查看 matrix1 :') self.print(self._matrix1) # feature_names:['f0', 'f1', 'f2'] # feature_types:None print('\n查看 matrix2 :') self.print(self._matrix2) # feature_names:['a', 'b', 'c'] # feature_types:['int', 'int', 'float'] print('\n查看 matrix1 get:') self.run_get(self._matrix1) # get_base_margin(): [] # get_label(): [1. 1. 1. 1. 0. 0. 0. 0.] # get_weight(): [] # num_col(): 3 # num_row(): 8 print('\n查看 matrix2 get:') self.run_get(self._matrix2) # get_base_margin(): [] # get_label(): [1. 2. 3. 4.] # get_weight(): [0.5 0.4 0.3 0.2] # num_col(): 3 # num_row(): 4 print(self._matrix2.slice([0,1]).get_label()) # [1. 2.]
7.2 模型接口
7.2.1 Booster
Booster
是xgboost
的模型,它包含了训练、预测、评估等任务的底层实现。xxxxxxxxxx
xbgoost.Booster(params=None,cache=(),model_file=None)参数:
params
: 一个字典,给出了模型的参数。该
Booster
将调用self.set_param(params)
方法来设置模型的参数。cache
:一个列表,给出了缓存的项。其元素是DMatrix
的对象。模型从这些DMatrix
对象中读取特征名字和特征类型(要求这些DMatrix
对象具有相同的特征名字和特征类型)model_file
: 一个字符串,给出了模型文件的位置。如果给出了
model_file
,则调用self.load_model(model_file)
来加载模型。
属性:
通过方法来存取、设置属性。
方法:
.attr(key)
: 获取booster
的属性。如果该属性不存在,则返回None
参数:
key
: 一个字符串,表示要获取的属性的名字
.set_attr(**kwargs)
: 设置booster
的属性参数:
kwargs
: 关键字参数。注意:参数的值目前只支持字符串。如果参数的值为
None
,则表示删除该参数
.attributes()
: 以字典的形式返回booster
的属性.set_param(params,value=None)
: 设置booster
的参数参数:
params
: 一个列表(元素为键值对)、一个字典、或者一个字符串。表示待设置的参数value
: 如果params
为字符串,那么params
就是键,而value
就是参数值。
.boost(dtrain,grad,hess)
: 执行一次训练迭代参数:
dtrain
: 一个DMatrix
对象,表示训练集grad
: 一个列表,表示一阶的梯度hess
: 一个列表,表示二阶的偏导数
.update(dtrain,iteration,fobj=None)
: 对一次迭代进行更新参数:
dtrain
: 一个DMatrix
对象,表示训练集iteration
: 一个整数,表示当前的迭代步数编号fobj
: 一个函数,表示自定义的目标函数
由于
Booster
没有.train()
方法,因此需要用下面的策略进行迭代:xxxxxxxxxx
for i in range(0,100): booster.update(train_matrix,iteration=i).copy()
: 拷贝当前的booster
,并返回一个新的Booster
对象.dump_model(fout,fmap='',with_stats=False)
:dump
模型到一个文本文件中。参数:
fout
: 一个字符串,表示输出文件的文件名fmap
: 一个字符串,表示存储feature map
的文件的文件名。booster
需要从它里面读取特征的信息。该文件每一行依次代表一个特征。每一行的格式为:
feature name:feature type
。 其中feature type
为int
、float
等表示数据类型的字符串。with_stats
: 一个布尔值。如果为True
,则输出split
的统计信息
.get_dump(fmap='',with_stats=False,dump_format='text')
:dump
模型为字符的列表(而不是存到文件中)。参数:
fmap
: 一个字符串,表示存储feature map
的文件的文件名。booster
需要从它里面读取特征的信息。with_stats
: 一个布尔值。如果为True
,则输出split
的统计信息dump_format
: 一个字符串,给出了输出的格式
返回值:一个字符串的列表。每个字符串描述了一棵子树。
.eval(data,name='eval',iteration=0)
: 对模型进行评估参数:
data
: 一个DMatrix
对象,表示数据集name
: 一个字符串,表示数据集的名字iteration
: 一个整数,表示当前的迭代编号
返回值:一个字符串,表示评估结果
.eval_set(evals,iteration=0,feval=None)
: 评估一系列的数据集参数:
evals
: 一个列表,列表元素为元组(DMatrix,string)
, 它给出了待评估的数据集iteration
: 一个整数,表示当前的迭代编号feval
: 一个函数,给出了自定义的评估函数
返回值:一个字符串,表示评估结果
.get_fscore(fmap='')
: 返回每个特征的重要性参数:
fmap
: 一个字符串,给出了feature map
文件的文件名。booster
需要从它里面读取特征的信息。
返回值:一个字典,给出了每个特征的重要性
.get_score(fmap='',importance_type='weight')
: 返回每个特征的重要性参数:
fmap
: 一个字符串,给出了feature map
文件的文件名。booster
需要从它里面读取特征的信息。importance_type
: 一个字符串,给出了特征的衡量指标。可以为:'weight'
: 此时特征重要性衡量标准为:该特征在所有的树中,被用于划分数据集的总次数。'gain'
: 此时特征重要性衡量标准为:该特征在树的'cover'
中,获取的平均增益。
返回值:一个字典,给出了每个特征的重要性
.get_split_value_histogram(feature,fmap='',bins=None,as_pandas=True)
: 获取一个特征的划分value histogram
。参数:
feature
: 一个字符串,给出了划分特征的名字fmap
: 一个字符串,给出了feature map
文件的文件名。booster
需要从它里面读取特征的信息。bins
: 最大的分桶的数量。如果bins=None
或者bins>n_unique
,则分桶的数量实际上等于n_unique
。 其中n_unique
是划分点的值的unique
as_pandas
:一个布尔值。如果为True
,则返回一个pandas.DataFrame
; 否则返回一个numpy ndarray
。
返回值:以一个
numpy ndarray
或者pandas.DataFrame
形式返回的、代表拆分点的histogram
的结果。
.load_model(fname)
: 从文件中加载模型。- 参数:
fname
: 一个文件或者一个内存buffer
,xgboost
从它加载模型
- 参数:
.save_model(fname)
: 保存模型到文件中- 参数:
fname
: 一个字符串,表示文件名
- 参数:
save_raw()
: 将模型保存成内存buffer
- 返回值:一个内存
buffer
,代表该模型
- 返回值:一个内存
.load_rabit_checkpoint()
: 从rabit checkpoint
中初始化模型。- 返回值:一个整数,表示模型的版本号
.predict(data,output_margin=False,ntree_limit=0,pred_leaf=False,pred_contribs=False,approx_contribs=False)
: 执行预测该方法不是线程安全的。对于每个
booster
来讲,你只能在某个线程中调用它的.predict
方法。如果你在多个线程中调用.predict
方法,则可能会有问题。要想解决该问题,你必须在每个线程中调用
booster.copy()
来拷贝该booster
到每个线程中参数:
data
: 一个DMatrix
对象,表示测试集output_margin
: 一个布尔值。表示是否输出原始的、未经过转换的margin value
ntree_limit
: 一个整数。表示使用多少棵子树来预测。默认值为0,表示使用所有的子树。如果训练的时候发生了早停,则你可以使用
booster.best_ntree_limit
。pred_leaf
: 一个布尔值。如果为True
,则会输出每个样本在每个子树的哪个叶子上。它是一个nsample x ntrees
的矩阵。每个子树的叶节点都是从
1
开始编号的。pred_contribs
: 一个布尔值。如果为True
, 则输出每个特征对每个样本预测结果的贡献程度。它是一个nsample x ( nfeature+1)
的矩阵。之所以加1,是因为有
bias
的因素。它位于最后一列。其中样本所有的贡献程度相加,就是该样本最终的预测的结果。
approx_contribs
: 一个布尔值。如果为True
,则大致估算出每个特征的贡献程度。
返回值:一个
ndarray
,表示预测结果
Booster
没有train
方法。因此有两种策略来获得训练好的Booster
- 从训练好的模型的文件中
.load_model()
来获取 - 多次调用
.update()
方法
- 从训练好的模型的文件中
示例:
xxxxxxxxxx
import xgboost as xgt import numpy as np import pandas as pd from sklearn.model_selection import train_test_split _label_map={ # 'Iris-setosa':0, #经过裁剪的,去掉了 iris 中的 setosa 类 'Iris-versicolor':0, 'Iris-virginica':1 } class BoosterTest: ''' 测试 Booster ''' def __init__(self): df=pd.read_csv('./data/iris.csv') _feature_names=['Sepal Length','Sepal Width','Petal Length','Petal Width'] x=df[_feature_names] y=df['Class'].map(lambda x:_label_map[x]) train_X,test_X,train_Y,test_Y=train_test_split(x,y, test_size=0.3,stratify=y,shuffle=True,random_state=1) self._train_matrix=xgt.DMatrix(data=train_X,label=train_Y, eature_names=_feature_names, feature_types=['float','float','float','float']) self._validate_matrix = xgt.DMatrix(data=test_X, label=test_Y, feature_names=_feature_names, feature_types=['float', 'float', 'float', 'float']) self._booster=xgt.Booster(params={ 'booster':'gbtree', 'silent':0,#打印消息 'eta':0.1, #学习率 'max_depth':5, 'tree_method':'exact', 'objective':'binary:logistic', 'eval_metric':'auc', 'seed':321}, cache=[self._train_matrix,self._validate_matrix]) def test_attribute(self): ''' 测试属性的设置和获取 :return: ''' self._booster.set_attr(key1= '1') print('attr:key1 -> ',self._booster.attr('key1')) print('attr:key2 -> ',self._booster.attr('key2')) print('attributes -> ',self._booster.attributes()) def test_dump_model(self): ''' 测试 dump 模型 :return: ''' _dump_str=self._booster.get_dump(fmap='model/booster.feature', with_stats=True,dump_format='text') print('dump:',_dump_str[0][:20]+'...' if _dump_str else []) self._booster.dump_model('model/booster.model', fmap='model/booster.feature',with_stats=True) def test_train(self): ''' 训练 :return: ''' for i in range(0,100): self._booster.update(self._train_matrix,iteration=i) print(self._booster.eval(self._train_matrix, name='train', iteration=i)) print(self._booster.eval(self._validate_matrix,name='eval',iteration=i)) def test_importance(self): ''' 测试特征重要性 :return: ''' print('fscore:',self._booster.get_fscore('model/booster.feature')) print('score.weight:', self._booster.get_score(importance_type='weight')) print('score.gain:', self._booster.get_score(importance_type='gain')) def test(self): self.test_attribute() # attr:key1 -> 1 # attr:key2 -> None # attributes -> {'key1': '1'} self.test_dump_model() # dump: [] self.test_train() # [0] train-auc:0.980816 # [0] eval-auc:0.933333 # ... # [99] train-auc:0.998367 # [99] eval-auc:0.995556 self.test_dump_model() # dump: 0:[f2<4.85] yes=1,no... self.test_importance() # score: {'f2': 80, 'f3': 72, 'f0': 6, 'f1': 5} # score.weight: {'Petal Length': 80, 'Petal Width': 72, 'Sepal Length': 6, 'Sepal Width': 5} # score.gain: {'Petal Length': 3.6525380337500004, 'Petal Width': 2.2072901486111114, 'Sepal Length': 0.06247816666666667, 'Sepal Width': 0.09243024} if __name__ == '__main__': BoosterTest().test()
7.2.2 直接学习
xgboost.train()
: 使用给定的参数来训练一个booster
xxxxxxxxxx
xgboost.train(params, dtrain, num_boost_round=10, evals=(), obj=None, feval=None, maximize=False, early_stopping_rounds=None, evals_result=None, verbose_eval=True, xgb_model=None, callbacks=None, learning_rates=None)参数:
params
: 一个列表(元素为键值对)、一个字典,表示训练的参数dtrain
:一个DMatrix
对象,表示训练集num_boost_round
: 一个整数,表示boosting
迭代数量evals
: 一个列表,元素为(DMatrix,string)
。 它给出了训练期间的验证集,以及验证集的名字(从而区分验证集的评估结果)。obj
:一个函数,它表示自定义的目标函数feval
: 一个函数,它表示自定义的evaluation
函数maximize
: 一个布尔值。如果为True
,则表示是对feval
求最大值;否则为求最小值early_stopping_rounds
:一个整数,表示早停参数。如果在
early_stopping_rounds
个迭代步内,验证集的验证误差没有下降,则训练停止。该参数要求
evals
参数至少包含一个验证集。如果evals
参数包含了多个验证集,则使用最后的一个。返回的模型是最后一次迭代的模型(而不是最佳的模型)。
如果早停发生,则模型拥有三个额外的字段:
.best_score
: 最佳的分数.best_iteration
: 最佳的迭代步数.best_ntree_limit
: 最佳的子模型数量
evals_result
: 一个字典,它给出了对测试集要进行评估的指标。verbose_eval
: 一个布尔值或者整数。- 如果为
True
,则evalutation metric
将在每个boosting stage
打印出来 - 如果为一个整数,则
evalutation metric
将在每隔verbose_eval
个boosting stage
打印出来。另外最后一个boosting stage
,以及早停的boosting stage
的evalutation metric
也会被打印
- 如果为
learning_rates
: 一个列表,给出了每个迭代步的学习率。- 你可以让学习率进行衰减
xgb_model
: 一个Booster
实例,或者一个存储了xgboost
模型的文件的文件名。它给出了待训练的模型。这种做法允许连续训练。
callbacks
: 一个回调函数的列表,它给出了在每个迭代步结束之后需要调用的那些函数。你可以使用
xgboost
中预定义的一些回调函数(位于xgboost.callback
模块) 。如:xgboost.reset_learning_rate(custom_rates)
返回值:一个
Booster
对象,表示训练好的模型
xgboost.cv()
: 使用给定的参数执行交叉验证 。它常用作参数搜索 。xxxxxxxxxx
xgboost.cv(params, dtrain, num_boost_round=10, nfold=3, stratified=False, folds=None, metrics=(), obj=None, feval=None, maximize=False, early_stopping_rounds=None, fpreproc=None, as_pandas=True, verbose_eval=None, show_stdv=True, seed=0, callbacks=None, shuffle=True)参数:
params
: 一个列表(元素为键值对)、一个字典,表示训练的参数dtrain
:一个DMatrix
对象,表示训练集num_boost_round
: 一个整数,表示boosting
迭代数量nfold
: 一个整数,表示交叉验证的fold
的数量stratified
: 一个布尔值。如果为True
,则执行分层采样folds
: 一个scikit-learn
的KFold
实例或者StratifiedKFold
实例。metrics
:一个字符串或者一个字符串的列表,指定了交叉验证时的evaluation metrics
如果同时在
params
里指定了eval_metric
,则metrics
参数优先。obj
:一个函数,它表示自定义的目标函数feval
: 一个函数,它表示自定义的evaluation
函数maximize
: 一个布尔值。如果为True
,则表示是对feval
求最大值;否则为求最小值early_stopping_rounds
:一个整数,表示早停参数。如果在
early_stopping_rounds
个迭代步内,验证集的验证误差没有下降,则训练停止。- 返回
evaluation history
结果中的最后一项是最佳的迭代步的评估结果
- 返回
fpreproc
: 一个函数。它是预处理函数,其参数为(dtrain,dtest,param)
, 返回值是经过了变换之后的(dtrain,dtest,param)
as_pandas
: 一个布尔值。如果为True
,则返回一个pandas.DataFrame
;否则返回一个numpy.ndarray
verbose_eval
: 参考xgboost.train()
show_stdv
: 一个布尔值。是否verbose
中打印标准差。它对返回结果没有影响。返回结果始终包含标准差。
seed
: 一个整数,表示随机数种子callbacks
: 参考xgboost.train()
shuffle
: 一个布尔值。如果为True
,则创建folds
之前先混洗数据。
返回值:一个字符串的列表,给出了
evaluation history
。它给的是早停时刻的history
(此时对应着最优模型),早停之后的结果被抛弃。
示例:
xxxxxxxxxx
class TrainTest: def __init__(self): df = pd.read_csv('./data/iris.csv') _feature_names = ['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width'] x = df[_feature_names] y = df['Class'].map(lambda x: _label_map[x]) train_X, test_X, train_Y, test_Y = train_test_split(x, y, test_size=0.3, stratify=y, shuffle=True, random_state=1) self._train_matrix = xgt.DMatrix(data=train_X, label=train_Y, feature_names=_feature_names, feature_types=['float', 'float', 'float', 'float']) self._validate_matrix = xgt.DMatrix(data=test_X, label=test_Y, feature_names=_feature_names, feature_types=['float', 'float', 'float', 'float']) def train_test(self): params={ 'booster':'gbtree', 'eta':0.01, 'max_depth':5, 'tree_method':'exact', 'objective':'binary:logistic', 'eval_metric':['logloss','error','auc'] } eval_rst={} booster=xgt.train(params,self._train_matrix,num_boost_round=20, evals=([(self._train_matrix,'valid1'),(self._validate_matrix,'valid2')]), early_stopping_rounds=5,evals_result=eval_rst,verbose_eval=True) ## 训练输出 # Multiple eval metrics have been passed: 'valid2-auc' will be used for early stopping. # Will train until valid2-auc hasn't improved in 5 rounds. # [0] valid1-logloss:0.685684 valid1-error:0.042857 valid1-auc:0.980816 valid2-logloss:0.685749 valid2-error:0.066667 valid2-auc:0.933333 # ... # Stopping. Best iteration: # [1] valid1-logloss:0.678149 valid1-error:0.042857 valid1-auc:0.99551 valid2-logloss:0.677882 valid2-error:0.066667 valid2-auc:0.966667 print('booster attributes:',booster.attributes()) # booster attributes: {'best_iteration': '1', 'best_msg': '[1]\tvalid1-logloss:0.678149\tvalid1-error:0.042857\tvalid1-auc:0.99551\tvalid2-logloss:0.677882\tvalid2-error:0.066667\tvalid2-auc:0.966667', 'best_score': '0.966667'} print('fscore:', booster.get_fscore()) # fscore: {'Petal Length': 8, 'Petal Width': 7} print('eval_rst:',eval_rst) # eval_rst: {'valid1': {'logloss': [0.685684, 0.678149, 0.671075, 0.663787, 0.656948, 0.649895], 'error': [0.042857, 0.042857, 0.042857, 0.042857, 0.042857, 0.042857], 'auc': [0.980816, 0.99551, 0.99551, 0.99551, 0.99551, 0.99551]}, 'valid2': {'logloss': [0.685749, 0.677882, 0.670747, 0.663147, 0.656263, 0.648916], 'error': [0.066667, 0.066667, 0.066667, 0.066667, 0.066667, 0.066667], 'auc': [0.933333, 0.966667, 0.966667, 0.966667, 0.966667, 0.966667]}} def cv_test(self): params = { 'booster': 'gbtree', 'eta': 0.01, 'max_depth': 5, 'tree_method': 'exact', 'objective': 'binary:logistic', 'eval_metric': ['logloss', 'error', 'auc'] } eval_history = xgt.cv(params, self._train_matrix,num_boost_round=20, nfold=3,stratified=True,metrics=['error', 'auc'], early_stopping_rounds=5,verbose_eval=True,shuffle=True) ## 训练输出 # [0] train-auc:0.974306+0.00309697 train-error:0.0428743+0.0177703 test-auc:0.887626+0.0695933 test-error:0.112374+0.0695933 #.... print('eval_history:', eval_history) # eval_history: test-auc-mean test-auc-std test-error-mean test-error-std \ # 0 0.887626 0.069593 0.112374 0.069593 # 1 0.925821 0.020752 0.112374 0.069593 # 2 0.925821 0.020752 0.098485 0.050631 # train-auc-mean train-auc-std train-error-mean train-error-std # 0 0.974306 0.003097 0.042874 0.01777 # 1 0.987893 0.012337 0.042874 0.01777 # 2 0.986735 0.011871 0.042874 0.01777
7.2.3 Scikit-Learn API
xgboost
给出了针对scikit-learn
接口的API
xgboost.XGBRegressor
: 它实现了scikit-learn
的回归模型API
xxxxxxxxxx
class xgboost.XGBRegressor(max_depth=3, learning_rate=0.1, n_estimators=100, silent=True, objective='reg:linear', booster='gbtree', n_jobs=1, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, base_score=0.5, random_state=0, seed=None, missing=None, **kwargs)参数:
max_depth
: 一个整数,表示子树的最大深度learning_rate
: 一个浮点数,表示学习率n_estimators
:一个整数,表示预期需要学习的子树的数量silent
: 一个布尔值。如果为False
,则打印中间信息objective
: 一个字符串或者可调用对象,指定了目标函数。其函数签名为:objective(y_true,y_pred) -> gra,hess
。 其中:y_true
: 一个形状为[n_sample]
的序列,表示真实的标签值y_pred
: 一个形状为[n_sample]
的序列,表示预测的标签值grad
: 一个形状为[n_sample]
的序列,表示每个样本处的梯度hess
: 一个形状为[n_sample]
的序列,表示每个样本处的二阶偏导数
booster
: 一个字符串。指定了用哪一种基模型。可以为:'gbtree','gblinear','dart'
n_jobs
: 一个整数,指定了并行度,即开启多少个线程来训练。如果为-1
,则使用所有的CPU
gamma
: 一个浮点数,也称作最小划分损失min_split_loss
。 它刻画的是:对于一个叶子节点,当对它采取划分之后,损失函数的降低值的阈值。- 如果大于该阈值,则该叶子节点值得继续划分
- 如果小于该阈值,则该叶子节点不值得继续划分
min_child_weight
: 一个整数,子节点的权重阈值。它刻画的是:对于一个叶子节点,当对它采取划分之后,它的所有子节点的权重之和的阈值。- 如果它的所有子节点的权重之和大于该阈值,则该叶子节点值得继续划分
- 如果它的所有子节点的权重之和小于该阈值,则该叶子节点不值得继续划分
所谓的权重:
- 对于线性模型(
booster=gblinear
),权重就是:叶子节点包含的样本数量。 因此该参数就是每个节点包含的最少样本数量。 - 对于树模型(
booster=gbtree,dart
),权重就是:叶子节点包含样本的所有二阶偏导数之和。
max_delta_step
: 一个整数,每棵树的权重估计时的最大delta step
。取值范围为 $ MathJax-Element-42 $ ,0 表示没有限制,默认值为 0 。subsample
:一个浮点数,对训练样本的采样比例。取值范围为(0,1]
,默认值为 1 。如果为
0.5
, 表示随机使用一半的训练样本来训练子树。它有助于缓解过拟合。colsample_bytree
: 一个浮点数,构建子树时,对特征的采样比例。取值范围为(0,1]
, 默认值为 1。如果为
0.5
, 表示随机使用一半的特征来训练子树。它有助于缓解过拟合。colsample_bylevel
: 一个浮点数,寻找划分点时,对特征的采样比例。取值范围为(0,1]
, 默认值为 1。如果为
0.5
, 表示随机使用一半的特征来寻找最佳划分点。它有助于缓解过拟合。reg_alpha
: 一个浮点数,是L1
正则化系数。它是xgb
的alpha
参数reg_lambda
: 一个浮点数,是L2
正则化系数。它是xgb
的lambda
参数scale_pos_weight
: 一个浮点数,用于调整正负样本的权重,常用于类别不平衡的分类问题。默认为 1。一个典型的参数值为:
负样本数量/正样本数量
base_score
:一个浮点数, 给所有样本的一个初始的预测得分。它引入了全局的bias
random_state
: 一个整数,表示随机数种子。missing
: 一个浮点数,它的值代表发生了数据缺失。默认为np.nan
kwargs
: 一个字典,给出了关键字参数。它用于设置Booster
对象
xgboost.XGBClassifier
:它实现了scikit-learn
的分类模型API
xxxxxxxxxx
class xgboost.XGBClassifier(max_depth=3, learning_rate=0.1, n_estimators=100, silent=True, objective='binary:logistic', booster='gbtree', n_jobs=1, nthread=None, gamma=0, min_child_weight=1, max_delta_step=0, subsample=1, colsample_bytree=1, colsample_bylevel=1, reg_alpha=0, reg_lambda=1, scale_pos_weight=1, base_score=0.5, random_state=0, seed=None, missing=None, **kwargs)参数参考
xgboost.XGBRegressor
xgboost.XGBClassifier
和xgboost.XGBRegressor
的方法:.fit()
: 训练模型xxxxxxxxxx
fit(X, y, sample_weight=None, eval_set=None, eval_metric=None, early_stopping_rounds=None,verbose=True, xgb_model=None)参数:
X
: 一个array-like
,表示训练集y
: 一个序列,表示标记sample_weight
: 一个序列,给出了每个样本的权重eval_set
: 一个列表,元素为(X,y)
,给出了验证集及其标签。它们用于早停。如果有多个验证集,则使用最后一个
eval_metric
: 一个字符串或者可调用对象,用于evaluation metric
- 如果为字符串,则是内置的度量函数的名字
- 如果为可调用对象,则它的签名为
(y_pred,y_true)==>(str,value)
early_stopping_rounds
: 指定早停的次数。参考xgboost.train()
verbose
: 一个布尔值。如果为True
,则打印验证集的评估结果。xgb_model
:一个Booster
实例,或者一个存储了xgboost
模型的文件的文件名。它给出了待训练的模型。这种做法允许连续训练。
.predict()
:执行预测xxxxxxxxxx
predict(data, output_margin=False, ntree_limit=0)参数:
data
: 一个DMatrix
对象,表示测试集output_margin
: 一个布尔值。表示是否输出原始的、未经过转换的margin value
ntree_limit
: 一个整数。表示使用多少棵子树来预测。默认值为0,表示使用所有的子树。如果训练的时候发生了早停,则你可以使用
booster.best_ntree_limit
。
返回值:一个
ndarray
,表示预测结果- 对于回归问题,返回的就是原始的预测结果
- 对于分类问题,返回的就是预测类别(阈值为 0.5 )
.predict_proba(data, output_margin=False, ntree_limit=0)
: 执行预测,预测的是各类别的概率参数:参考
.predict()
返回值:一个
ndarray
,表示预测结果它只用于分类问题,返回的是预测各类别的概率
.evals_result()
: 返回一个字典,给出了各个验证集在各个验证参数上的历史值它不同于
cv()
函数的返回值。cv()
函数返回evaluation history
是早停时刻的。而这里返回的是所有的历史值
示例:
xxxxxxxxxx
class SKLTest: def __init__(self): df = pd.read_csv('./data/iris.csv') _feature_names = ['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width'] x = df[_feature_names] y = df['Class'].map(lambda x: _label_map[x]) self.train_X, self.test_X, self.train_Y, self.test_Y = \ train_test_split(x, y, test_size=0.3, stratify=y, shuffle=True, random_state=1) def train_test(self): clf=xgt.XGBClassifier(max_depth=3,learning_rate=0.1,n_estimators=100) clf.fit(self.train_X,self.train_Y,eval_metric='auc', eval_set=[( self.test_X,self.test_Y),], early_stopping_rounds=3) # 训练输出: # Will train until validation_0-auc hasn't improved in 3 rounds. # [0] validation_0-auc:0.933333 # ... # Stopping. Best iteration: # [2] validation_0-auc:0.997778 print('evals_result:',clf.evals_result()) # evals_result: {'validation_0': {'auc': [0.933333, 0.966667, 0.997778, 0.997778, 0.997778]}} print('predict:',clf.predict(self.test_X)) # predict: [1 1 0 0 0 1 1 1 0 0 0 1 1 0 1 1 0 1 0 0 0 0 0 1 1 0 0 1 1 0]
7.3 绘图API
xgboost.plot_importance()
:绘制特征重要性xxxxxxxxxx
xgboost.plot_importance(booster, ax=None, height=0.2, xlim=None, ylim=None, title='Feature importance', xlabel='F score', ylabel='Features', importance_type='weight', max_num_features=None, grid=True, show_values=True, **kwargs)参数:
booster
: 一个Booster
对象, 一个XGBModel
对象,或者由Booster.get_fscore()
返回的字典ax
: 一个matplotlib Axes
对象。特征重要性将绘制在它上面。如果为
None
,则新建一个Axes
grid
: 一个布尔值。如果为True
,则开启axes grid
importance_type
: 一个字符串,指定了特征重要性的类别。参考Booster.get_fscore()
max_num_features
: 一个整数,指定展示的特征的最大数量。如果为None
,则展示所有的特征height
: 一个浮点数,指定bar
的高度。它传递给ax.barh()
xlim
: 一个元组,传递给axes.xlim()
ylim
: 一个元组,传递给axes.ylim()
title
: 一个字符串,设置Axes
的标题。默认为"Feature importance"
。 如果为None
,则没有标题xlabel
: 一个字符串,设置Axes
的X
轴标题。默认为"F score"
。 如果为None
,则X
轴没有标题ylabel
:一个字符串,设置Axes
的Y
轴标题。默认为"Features"
。 如果为None
,则Y
轴没有标题show_values
: 一个布尔值。如果为True
,则在绘图上展示具体的值。kwargs
: 关键字参数,用于传递给ax.barh()
返回
ax
(一个matplotlib Axes
对象)xgboost.plot_tree()
: 绘制指定的子树。xxxxxxxxxx
xgboost.plot_tree(booster, fmap='', num_trees=0, rankdir='UT', ax=None, **kwargs)参数:
booster
: 一个Booster
对象, 一个XGBModel
对象fmap
: 一个字符串,给出了feature map
文件的文件名num_trees
: 一个整数,制定了要绘制的子数的编号。默认为 0rankdir
: 一个字符串,它传递给graphviz
的graph_attr
ax
: 一个matplotlib Axes
对象。特征重要性将绘制在它上面。如果为
None
,则新建一个Axes
kwargs
: 关键字参数,用于传递给graphviz
的graph_attr
返回
ax
(一个matplotlib Axes
对象)xgboost.tp_graphviz()
: 转换指定的子树成一个graphviz
实例。在
IPython
中,可以自动绘制graphviz
实例;否则你需要手动调用graphviz
对象的.render()
方法来绘制。xxxxxxxxxx
xgboost.to_graphviz(booster, fmap='', num_trees=0, rankdir='UT', yes_color='#0000FF', no_color='#FF0000', **kwargs)参数:
yes_color
: 一个字符串,给出了满足node condition
的边的颜色no_color
: 一个字符串,给出了不满足node condition
的边的颜色- 其它参数参考
xgboost.plot_tree()
返回
ax
(一个matplotlib Axes
对象)示例:
xxxxxxxxxx
class PlotTest: def __init__(self): df = pd.read_csv('./data/iris.csv') _feature_names = ['Sepal Length', 'Sepal Width', 'Petal Length', 'Petal Width'] x = df[_feature_names] y = df['Class'].map(lambda x: _label_map[x]) train_X, test_X, train_Y, test_Y = train_test_split(x, y, test_size=0.3, stratify=y, shuffle=True, random_state=1) self._train_matrix = xgt.DMatrix(data=train_X, label=train_Y, feature_names=_feature_names, feature_types=['float', 'float', 'float', 'float']) self._validate_matrix = xgt.DMatrix(data=test_X, label=test_Y, feature_names=_feature_names, feature_types=['float', 'float', 'float', 'float']) def plot_test(self): params = { 'booster': 'gbtree', 'eta': 0.01, 'max_depth': 5, 'tree_method': 'exact', 'objective': 'binary:logistic', 'eval_metric': ['logloss', 'error', 'auc'] } eval_rst = {} booster = xgt.train(params, self._train_matrix, num_boost_round=20, evals=([(self._train_matrix, 'valid1'), (self._validate_matrix, 'valid2')]), early_stopping_rounds=5, evals_result=eval_rst, verbose_eval=True) xgt.plot_importance(booster) plt.show()
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论