关闭

R语言使用gradient boosting方法对数据分类

标签: r语言GBMgradientboost算法程序
314人阅读 评论(0) 收藏 举报
分类:

说明

gradient boosting将弱分类器组合在一起,然后在于损失函数的负梯度最大相关时得到新的基础分类器,用户既可以将它们应用于回归分析也可以用在分类领域,该方法对不同数据集的适应能力都很好。本节介绍如何使用gbm函数分类telecom churn 数据集的过程。

操作

导入gbm包:

library(survival)
library(gbm)

gbm的响应范围为0/1,需要将yes/no转化为0/1响应

trainset$churn = ifelse(trainset$churn == "yes",1,0)

使用gbm函数训练数据集

churn.gbm = gbm(formula = churn ~ .,distribution = "bernoulli",data = trainset,n.trees = 1000,interaction.depth = 7,shrinkage = 0.01,cv.folds = 3)

调用summary输出模型的详细信息:

summary(churn.gbm)
                                                        var    rel.inf
total_day_minutes                         total_day_minutes 27.9177818
total_eve_minutes                         total_eve_minutes 16.0649908
number_customer_service_calls number_customer_service_calls 13.2269151
total_intl_minutes                       total_intl_minutes  9.2869782
total_intl_calls                           total_intl_calls  8.1021229
international_plan                       international_plan  8.0779655
number_vmail_messages                 number_vmail_messages  4.5021147
total_night_minutes                     total_night_minutes  4.2927803
voice_mail_plan                             voice_mail_plan  2.3940342
total_night_calls                         total_night_calls  2.0170933
total_day_calls                             total_day_calls  1.6338043
total_eve_calls                             total_eve_calls  1.3810027
total_eve_charge                           total_eve_charge  0.7935278
total_night_charge                       total_night_charge  0.3088882
total_day_charge                           total_day_charge  0.0000000
total_intl_charge                         total_intl_charge  0.0000000

训练模型相对影响曲线图
训练模型相对影响曲线图
通过交叉验证确定最佳迭代次数:

churn.iter = gbm.perf(churn.gbm,method = "cv")

性能曲线图
计算Bernoulli损失函数的对数的奇点值:

churn.predict = predict(churn.gbm,testset,n.trees = churn.iter)
str(churn.predict)
num [1:1018] -3.29 -3.15 -3.07 -3.5 -3.48 ...

绘制ROC曲线,得到最大准确率的最佳临界值:

library(stats)
library(pROC)
churn.roc = roc(testset$churn,churn.predict)
plot(churn.roc)

训练模型的ROC曲线
训练模型的ROC曲线
调用coords函数调用最佳临界值,使用该临界值得到相应的预测类别:

coords(churn.roc,"best")
  threshold specificity sensitivity 
 -0.9254545   0.8723404   0.9737742 
churn.predict.class = ifelse(churn.predict > coords(churn.roc,"best")["threshold"],"yes","no")

最终从预测结果生成分类表:

table(testset$churn,churn.predict.class)
     churn.predict.class
       no yes
  yes  18 123
  no  854  23

原理

gradient boosting算法的思想如下:首先,计算每个划分的数据集残差的方差,并据此确定每个阶段的最优划分,被选重的模型将前一阶段处理得到的剩余方差作为学习目标重新建模,缩小剩余方差值(错误)。剩余方差的缩减采用梯度下降的技术,即沿着导数下降方向进行变化,使得剩余方差最小化。
本例使用了gbm包的gradient boosting 算法对telecom churan进行分类处理,预测目标是churn的属性,为二进制结果,因此函数的distribution参数被设置成bernoulli分布,同时,n.tree设置为1000,参数interaction.depth用于定义训练过程中的决策树的最大深度,样例中的最大深度为7,shrinking为步长步长减小参数,表示学习的速度,本例步长值为0.01,cv.folds中交叉验证为3。
调用summary函数用图表方式展示各变量的相对影响,从结果可以知道,下降与每个变量的误差平方和有关,其中total_day_minutes是对损失函数下降影响最大的属性。
接下来,我们用gbm.perf函数以获得最大迭代次数,本例采用交叉验证技术,因而method方法参数被设置为cv。函数进一步设置了两条曲线,其中黑色的曲线表示训练错误,绿色的代表验证错误,错误评估采用训练时定义好的伯努力分布,图中蓝色虚线代表最优迭代次数。
然后,我们使用了predict函数获得了由伯努力损失函数返回的对数的奇点值。为了得到最好的预测结果,我们可以将参数设置n.trees的值设置成最佳迭代次数,不过由于返回值依然是一个对数奇点值,我们仍然需要确定最佳切点以获得类标号,因此, 我们使用ROC函数生成ROC曲线,得到最大准确的切点。
最后我们调用coords函数来寻找最佳切点的阀值,ifelse根据对数奇点值确定类标号,之后调用table函数生成分类表来判别模型的准确度。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:48955次
    • 积分:1362
    • 等级:
    • 排名:千里之外
    • 原创:89篇
    • 转载:0篇
    • 译文:0篇
    • 评论:3条
    文章存档
    最新评论