XGboost实例--数据处理
可以分为三⼤部分:
· 特征⼯程
· 评估准则
· XGBoost参数调优
⼀、 特征⼯程
数据分析
· 对数据进⾏探索性的分析的⼯具包:pandas、matplotlib/aborn
· 读取训练数据,取少量样本进⾏观测,并查看数据规模和数据类型
– 标签、特征意义、特征类型等
· 分析每列特征的分布
– 直⽅图
– 包括标签列(对分类问题,可看出类别样本是否均衡)
– 检测奇异点(outliers)
· 分析每两列特征之间的相关性
– 特征与特征之间信息是否冗余
– 特征与标签是否线性相关
· 特征⼯程
1、直⽅图
· 直⽅图:每个取值在数据集中出现的次数,可视为概率函
数(PDF)的估计(aborn可视化⼯具⽐较简单)
– import aborn as sns
– %matplotlib inline( 在juypter中才能加上这句)
– sns.distplot(train.price.values, bins=50, kde=True)
· 核密度估计
– Kernel Density Estimation, KDE
– 对直⽅图的加窗平滑
在分类任务中,我们关⼼不同类别的特征分布
– 核密度估计
– order = [‘low’, ‘medium’, ‘high’]
– sns.violinplot(x=’interest_level’, y=’price’, data=train, order = order)
2、奇异点
· 奇异点:或称离群点,指远离⼤多数样本的样本点。通常
认为这些点是噪声,对模型有坏影响
· 可以通过直⽅图或散点图发现奇异点
– 直⽅图的尾巴
– 散点图上孤⽴的点
· 可以通过只保留某些分位数内的点去掉奇异点
– 如0.5%-99.5%,或>99%
– ulimit = np.percentile(train.price.values, 99)
– train[‘price’].ix[train[‘price’]>ulimit] = ulimit
3、相关性
· 我们希望特征与标签强相关
伴我同行电影– 分类直⽅图可以从某种程度上看出特征与标签的相关性:不同类
别的直⽅图差异⼤
· 特征与特征之间强相关的话意味着信息冗余
– 可以两个特征可以只保留⼀个特征
– 或采⽤主成分分析(PCA)等降维
无聊的反义词
特征之间的相关性的代码实现:
—sns.heatmap(correlationMatrix,annot=True)—-使⽤热图的⽅式来观察
· XGBoost 模型内部将所有的问题都建模成⼀个回归预测问
题,输⼊特征只能是数值型。
· 如果给定的数据是不同的类型,必须先将数据变成数值型我的生日派对
类别型特征
· LabelEncoder: 对不连续的数字或者⽂本进⾏编号
– 可⽤在对字符串型的标签编码(测试结果需进⾏反变换)
– 编号默认有序数关系
– 存储量⼩形容战争的词语
· 如不希望有序数关系: OneHotEncoder:将类别型整数输⼊从1维 K
维的稀疏编码
– :对XGBoost,OneHotEncoder不是必须,因为XGBoost对特征进⾏排序从
⽽进⾏分裂建树;如果⽤OneHotEncoder得到稀疏编码,XGBoost建树过程中
对稀疏特征处理速度块
– 输⼊必须是数值型数据(对字符串输⼊,先调⽤LabelEncoder变成数字,再⽤
OneHotEncoder )
– 存储要求⾼
类别型特征
· 低基数(low-cardinality )类别型特征:OneHotEncoder
– 1维 K维, K为该特征不同的取值数⽬
– 所以通常在K <10的情况下采⽤
· ⾼基数(high-cardinality)类别型特征:通常有成百上千个不同
的取值,可先降维
– 如邮政编码、街道名称…
– 聚类(Clustering): 1 维 变为 K维,K为聚类的类别数
– 主成分分析(principle component analysis, PCA):但对⼤矩阵操作费
资源
– 均值编码:在贝叶斯的架构下,利⽤标签变量,有监督地确定最适合
特定特征的编码⽅式
5、特征⼯程⼩结
⼀些通⽤的规则:
– 字符串型特征:Label编码
– 时间特征:年⽉⽇、时间段(早中晚)…
– 数值型特征:加减乘除,多项式,log, exp
– 低基数类别特征:one-hot编码
– ⾼基数类别特征:先降维,再one-hot编码;均值编码
-利⽤领域知识设计特征
– 如曾经流⾏的图像⽬标检测特征HOG…
-利⽤深度学习从数据中学习特征表⽰
– 采⽤end-to-end⽅式⼀起学习特征和分类/回归/排序
– 学习好特征可以送⼊XGBoost学习器
标签interest_level
将类别型的标签interest_level编码为数字
y_map = {‘low’: 2, ‘medium’: 1, ‘high’: 0}
train[‘interest_level’] = train[‘interest_level’].apply(lambda x: y_map[x])
聚类降维编码(#⽤训练数据训练,对训练数据和测试数据都做变换) 到中⼼的距离(论坛上讨论到曼哈顿中⼼的距离更好)kmeans_cluster = KMeans(n_clusters=20)
类别型特征
⽤sklearn中的LableEncoder 来处理
对于回归问题:可以⽤L1、L2损失函数可以作为评价指标
对于分类任务的评价指标:
· 以下的损失函数可以作为评价指标
·:logistic/负log似然损失
· 0-1损失
· ROC/AUC
· PR曲线
· F1分数
·sklearn中⽤交叉验证(cross_val_score和GridSearchCV)评价模型
性能时,⽤scoring参数定义评价指标。评价指标是越⾼越好,因此⽤⼀些损失函数当评价指标时,需要再加负号,如
neg_log_loss,neg_mean_squared_error
·Scikit-Learn:ics
metrics模块还提供为其他⽬的⽽实现的预测误差评估函数
XGBoost⽀持的⽬标函数
· Objective: 定义学习任务及相应的学习⽬标,可选的⽬标函数如下:
– “reg:linear” –线性回归。
– “reg:logistic” –逻辑回归。
– “binary:logistic” –⼆分类的逻辑回归问题,输出为概率。
– “binary:logitraw” –⼆分类的逻辑回归问题,输出的结果为w T x。
9月25日– “count:poisson” –计数问题的poisson回归,输出结果为poisson分布。
– “multi:softmax” –让XGBoost采⽤softmax⽬标函数处理多分类问题
– “multi:softprob” –和softmax⼀样,但是输出的是ndata* nclass的向量,可以将该向量reshape成ndata⾏nclass列的矩阵。没⾏数据表⽰样本所属于每个类别的概率。
reshape成ndata⾏nclass列的矩阵。没⾏数据表⽰样本所属于每个类别的概率。
XGBoost⾃定义⽬标函数: XGBoost在调⽤obj函数时会传⼊两个参数:preds和dtrain
– preds为当前模型完成训练时,所有训练数据的预测值
– dtrain为训练集,可以通过_label()获取训练样本的label
– 同时XGBoost规定⽬标函数需返回当前preds基于训练label的⼀阶和⼆阶梯度。
参数说明:
max_depth 树的最⼤深度。树越深通常模型越复杂,更容易过拟合
learning_rate 学习率或收缩因⼦。学习率和迭代次数/弱分类器数⽬n_estimators相关。 缺省:0.1
n_estimators 弱分类器数⽬. 缺省:100
slient 参数值为1时,静默模式开启,不输出任何信息
objective 待优化的⽬标函数,常⽤值有: binary:logistic ⼆分类的逻辑回归,返回预测的概率
multi:softmax 使⽤softmax的多分类器,返回预测的类别(不是概率)。 multi:softprob 和
multi:softmax参数⼀样,但是返回的是每个数据属于各个类别的概率。⽀持⽤户⾃定义⽬标函数
nthread ⽤来进⾏多线程控制。 如果你希望使⽤CPU全部的核,那就不⽤缺省值-1,算法会⾃动检测它。 booster 选择每次迭代的模型,有两种选择: gbtree:基于树的模型,为缺省值。 gbliner:线性模型 gamma 节点分裂所需的最⼩损失函数下降值
min_child_weight 叶⼦结点需要的最⼩样本权重(hessian)和
max_delta_step 允许的树的最⼤权重
subsample 构造每棵树的所⽤样本⽐例(样本采样⽐例),同GBM
colsample_bytree 构造每棵树的所⽤特征⽐例
colsample_bylevel 树在每层每个分裂的所⽤特征⽐例
reg_alpha L1/L0正则的惩罚系数
reg_lambda L2正则的惩罚系数
scale_pos_weight 正负样本的平衡
ba_score 每个样本的初始估计,全局偏差
random_state 随机种⼦
ed 随机种⼦
疏忽的反义词
missing 当数据缺失时的填补值。缺省为np.nan
参数类别:
·通⽤参数:这部分参数通常我们不需要调整,默认值就好
· 学习⽬标参数:与任务有关,定下来后通常也不需要调整
· booster参数:弱学习器相关参数,需要仔细调整,会影响
模型性能
通⽤参数
· booster:弱学习器类型
– 可选gbtree(树模型)或gbliner(线性模型)
– 默认为gbtree(树模型为⾮线性模型,能处理更复杂的任务)
· silent:是否开启静默模式
– 1:静默模式开启,不输出任何信息
– 默认值为0:输出⼀些中间信息,以助于我们了解模型的状态
· nthread:线程数
– 默认值为-1,表⽰使⽤系统所有CPU核
学习⽬标参数
· objective: 损失函数
路怎么写
– ⽀持分类/回归/排序
· eval_metric:评价函数
· ed:随机数的种⼦
– 默认为0
– 设置ed可复现随机数据的结果,也可以⽤于调整参数
booster参数
· 弱学习器的参数,尽管有两种booster可供选择,这⾥只介绍
gbtree
· 1. learning_rate : 收缩步长 vs. n_estimators:树的数⽬
– 较⼩的学习率通常意味着更多弱分学习器
– 通常建议学习率较⼩( �� < 0.1),弱学习器数⽬n_estimators⼤
– 可以设置较⼩的学习率,然后⽤交叉验证确定n_estimators
· 2. ⾏(subsample)列(colsample_bytree 、
colsample_bylevel)下采样⽐例
– 默认值均为1,即不进⾏下采样,使⽤所有数据
– 随机下采样通常⽐⽤全部数据的确定性过程效果更好,速度更快
– 建议值:0.3 - 0.8
· 3. 树的最⼤深度: max_depth
– max_depth越⼤,模型越复杂,会学到更具体更局部的样本
– 需要使⽤交叉验证进⾏调优,默认值为6,建议3-10
· 4. min_child_weight :孩⼦节点中最⼩的样本权重和
– 如果⼀个叶⼦节点的样本权重和⼩于min_child_weight则分裂过程
结束
Xgboost实战建议:(摘录)
参数调优的⼀般⽅法
·
1. 选择较⾼的学习率(learning rate),并选择对应于此学习率
的理想的树数量
– 学习率以⼯具包默认值为0.1。
王定斌– XGBoost直接引⽤函数“cv”可以在每⼀次迭代中使⽤交叉验证,并返回理想
的树数量(因为交叉验证很慢,所以可以import两种XGBoost:直接引⽤
xgboost(⽤“cv”函数调整树的数⽬)和XGBClassifier —xgboost的sklearn包 (⽤GridSearchCV调整其他参数 )。
· 2. 对于给定的学习率和树数量,进⾏树参数调优( max_depth,
min_child_weight, gamma, subsample, colsample_bytree, colsample_bylevel ) · 3. xgboost的正则化参数(lambda, alpha)的调优
· 4. 降低学习率,确定理想参数