Xgboost算法——Kaggle案例

该博客详细介绍了在Kaggle的Santander Customer Satisfaction比赛中,使用R中的mlr包调用Xgboost算法解决不平衡二分类问题的过程。作者首先介绍了背景和建模思路,接着通过读取数据、数据探索、特征筛选(信息增益)和调参(过抽样、欠抽样、参数选择)来优化模型。在特征筛选中,作者采用了过抽样方法处理数据不平衡,然后通过网格搜索确定了最优的过抽样比例、学习速率、树的最大深度、gamma、min_child_weight和colsample_bytree等参数。最终,通过集成多个模型的预测结果,得到较好的ROC值。
摘要由CSDN通过智能技术生成


作者简介Introduction

苏高生,西南财经大学统计学硕士毕业,现就职于中国电信,主要负责企业存量客户大数据分析、数据建模。研究方向:机器学习,最喜欢的编程语言:R语言,没有之一。

E-mail:sugs01@outlook.com

零、案例背景介绍与建模思路说明

1.背景介绍

本案例使用的数据为kaggle中“Santander Customer Satisfaction”比赛的数据。此案例为不平衡二分类问题,目标为最大化auc值(ROC曲线下方面积)。竞赛题目链接为:https://www.kaggle.com/c/santander-customer-satisfaction 。目前此比赛已经结束。

2.建模思路

此文档采用R中的mlr包(综合型机器学习包)调用xgboost算法进行分类。
1) 读取数据;

2) 数据探索:设置并行运算,弥补缺失值,观察数据类别是否平衡,删除常数列,取训练数据集与测试数据集都包含的字段

3) 特征选择:

I、 对数据类别不平衡进行处理(处理方法可以采用过抽样/欠抽样/集成等),本案例采用过抽样方法,mlr包对应的函数为oversample,初步确定适宜的过抽样比例;

II、 使用mlr包的generateFilterValuesData函数取95%的信息增益值;

4) 调参:逐步调试过抽样比例rate、eta、max_depth、min_child_weight、gamma、colsample_bytree等参数,并多次调试,直到满意为止;

5) 集成预测结果:在每个参数的适宜范围内随机抽取参数值构建xgboost模型,并将多个模型进行集成,输出预测结果;本案例所用程序输出结果的ROC值为.816584

一、读取数据

options(java.parameters = "-Xmx8g") ## 特征选择时使用,但是需要在加载包之前设置

library(readr)

xgb_tr1 <- read_csv("C:/Users/Administrator/kaggle/scs/train.csv")

xgb_te1 <- read_csv("C:/Users/Administrator/kaggle/scs/test.csv")

二、数据探索

1.设置并行运算

library(dplyr)

library(mlr)

library(parallelMap)

parallelStartSocket(4)

2.数据各列初步探索
summarizeColumns(xgb_tr1)
3.处理缺失值:impute missing values by mean and mode

imp_tr1 <- impute(

  as.data.frame(xgb_tr1),

  classes = list(    integer = imputeMean(),

    numeric = imputeMean()

  )

)

imp_te1 <- impute(  as.data.frame(xgb_te1),

  classes = list(

    integer = imputeMean(),

    numeric = imputeMean()

  )

)

4.观察训练数据类别的比例–数据类别不平衡
table(xgb_tr1$TARGET)
5.剔除数据集中的常数列

xgb_tr2 <- removeConstantFeatures(imp_tr1$data)

xgb_te2 <- removeConstantFeatures(imp_te1$data)

6.保留训练数据集与测试数据及相同的列
tr2_name <- data.frame(tr2_name = colnames(xgb_tr2))
te2_name <- data.frame(te2_name = colnames(xgb_te2))

tr2_name_inner <- tr2_name %>%

  inner_join(te2_name, by = c('tr2_name' = 'te2_name'))

TARGET = data.frame(TARGET = xgb_tr2$TARGET)
xgb_tr2 <- xgb_tr2[, c(tr2_name_inner$tr2_name[2:dim(tr2_name_inner)[1]])]
xgb_te2 <- xgb_te2[, c(tr2_name_inner$tr2_name[2:dim(tr2_name_inner)[1]])]

xgb_tr2 <- cbind(xgb_tr2, TARGET)

三、特征筛选–信息增益

1.构建基础任务

xgb_tr2$TARGET <- factor(xgb_tr2$TARGET)

xgb.task <- makeClassifTask(data = xgb_tr2, target = 'TARGET')

set.seed(0)

2.过抽样栅格搜索—搜索过抽样比率

##### 1)搜索栅格

grid_search <- expand.grid(

    over_rate = seq(1, 30, 2))

##### 2)auc值集合

perf_overrate_1 <- numeric(length = dim(grid_search)[1])

##### 3)训练

for(i in 1:dim(grid_search)[1]){

    ## 过抽样任务

    xgb.task.over <- oversample(xgb.task, rate = i)

    ## 学习参数

    xgb.ps <- makeParamSet(

        makeDiscreteParam('eta', values = .1)

    )

    ## 学习次数

    xgb.ctrl <-  makeTuneMultiCritControlGrid()

    ## 模型描述--重复抽样设置

    xgb.rdesc <- makeResampleDesc('CV', stratify = TRUE)

    xgb.rdesc <- makeResampleDesc('CV', stratify = TRUE)

    ## 构建学习器

    xgb.learner = makeLearner(

        'classif.xgboost',

        predict.type = 'prob'

    )

    ## 学习

    res <- tuneParamsMultiCrit(

        learner = xgb.learner,

        task = xgb.task.over,

        resampling = xgb.rdesc,

        par.set = xgb.ps,

        measures = list(kappa, tpr, tnr, auc),

 ### 可以根据评估标准自行选择

        control = xgb.ctrl,

        show.info = TRUE

    )

    ## auc值

    perf_overrate_1[i] <-as.data.frame(trafoOptPath(res$opt.path))$auc.test.mean

}

##### 4)结果表,第XX个模型的auc最大

cat("Model ", which.max(perf_overrate_1), " is largest auc: ", max(perf_overrate_1), sep = "")

##### 5)auc最大的模型参数如下:

print(grid_search[which.max(perf_overrate_1), ])

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值