XGboost实例--数据处理

可以分为三大部分:
• 特征工程
• 评估准则
• XGBoost参数调优

一、 特征工程
数据分析
• 对数据进行探索性的分析的工具包:pandas、matplotlib/seaborn
• 读取训练数据,取少量样本进行观测,并查看数据规模和数据类型
– 标签、特征意义、特征类型等
• 分析每列特征的分布
– 直方图
– 包括标签列(对分类问题,可看出类别样本是否均衡)
– 检测奇异点(outliers)
• 分析每两列特征之间的相关性
– 特征与特征之间信息是否冗余
– 特征与标签是否线性相关
• 特征工程
1、直方图
• 直方图:每个取值在数据集中出现的次数,可视为概率函
数(PDF)的估计(seaborn可视化工具比较简单)
– import seaborn 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)—-使用热图的方式来观察

4、数据类型
• 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:sklearn.metrics
metrics模块还提供为其他目的而实现的预测误差评估函数

XGBoost支持的目标函数

• Objective: 定义学习任务及相应的学习目标,可选的目标函数如下:
– “reg:linear” –线性回归。
– “reg:logistic” –逻辑回归。
– “binary:logistic” –二分类的逻辑回归问题,输出为概率。
– “binary:logitraw” –二分类的逻辑回归问题,输出的结果为w T x。
– “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为训练集,可以通过dtrain.get_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 正负样本的平衡
base_score 每个样本的初始估计,全局偏差
random_state 随机种子
seed 随机种子
missing 当数据缺失时的填补值。缺省为np.nan

参数类别:
•通用参数:这部分参数通常我们不需要调整,默认值就好
• 学习目标参数:与任务有关,定下来后通常也不需要调整
• booster参数:弱学习器相关参数,需要仔细调整,会影响
模型性能
通用参数
• booster:弱学习器类型
– 可选gbtree(树模型)或gbliner(线性模型)
– 默认为gbtree(树模型为非线性模型,能处理更复杂的任务)
• silent:是否开启静默模式
– 1:静默模式开启,不输出任何信息
– 默认值为0:输出一些中间信息,以助于我们了解模型的状态
• nthread:线程数
– 默认值为-1,表示使用系统所有CPU核

学习目标参数
• objective: 损失函数
– 支持分类/回归/排序
• eval_metric:评价函数
• seed:随机数的种子
– 默认为0
– 设置seed可复现随机数据的结果,也可以用于调整参数

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. 降低学习率,确定理想参数

猜你喜欢

转载自blog.csdn.net/qq_36666756/article/details/78375408
今日推荐