苏高生,西南财经大学统计学硕士毕业,现就职于中国电信,主要负责企业存量客户大数据分析、数据建模。研究方向:机器学习,最喜欢的编程语言: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), ])