R语言中基于C5.0的算法分析数据

上一篇博客说了R语言中利用朴素贝叶斯算法来预测垃圾短信,这次咱接着再聊一个算法,C5.0。我个人感觉C5.0要好用一点的。主要是C5.0对数据的属性没有硬性要求,不像贝叶斯中,数据的属性非no及yes,这在众多的工作场景中是无法得到保证的。就比如分析关于银行贷款的个人信用问题。其中就有不少属性可以去很多值的(就像存款,是一个多段值)。

代码如下:

credit<-read.csv("credit.csv",stringsAsFactors = FALSE)
str(credit)
prop.table(table(credit$default))
credit$default<-factor(credit$default)
set.seed(666)
credit<-credit[order(runif(1000)),]
credit_train<-credit[1:900,]
credit_test<-credit[901:1000,]
install.packages("C50")
library(C50)
credit_model<-C5.0(x = credit_train[-17],y = credit_train$default)
credit_model
credit_pred<-predict(object = credit_model,newdata = credit_test)
library(gmodels)
CrossTable(credit_test$default,credit_pred,dnn = c("Actual","Predict"))

分析:

1.为什么要

credit<-credit[order(runif(1000)),]

我们可以使用prop.table(table(credit$default))知道(default:yes表示拖欠还款,no表示正常还款),yes和no的分布不是1:1的,这就在数据分为训练数据和测试数据时不能有效的均匀分布结果了,可能的极端情况是训练数据的default全是yes,然而测试数据的default全是No。因此,我们要在一开始就要将整个数据重新排序依次。

2.其他的就没啥说的了,使用C5.0的优点就是方便、简介,没有多余的数据处理

3.结果如下:《R语言中基于C5.0的算法分析数据》

************************************************************************************

以为这样结束了?NO!!!

分析一下结果,我们会惊异的发现,正确率如此之低,只有(62+16)/100=78%. 这在实际应用中是不可能被使用的。但是我们考虑一下应用场景,使用让银行更具用户的各项数据来分析给用户贷款之后是否会还款,这样的话,我们是否可以“调整错误的权重”?就是在actual为yes是,预测为no的情况尽可能少的发生,同时允许让actual为no是,预测为yes多一些?

当时是可行的(至少对于银行而言). 所以我们可以定义一个权重矩阵

error_cost <- matrix(c(0, 1, 4, 0), nrow = 2)

然后

credit_model<-C5.0(x = credit_train[-17],y = credit_train$default,costs=error_cost)

即可。

结果如下:

《R语言中基于C5.0的算法分析数据》

和我们需求一样,但是,但是,但是,这准确度…….也太那啥了。

所以,我们需要再次优化,更具C5.0的特性:

C5.0()函数可以很轻松地将boosting算法添加到C5.0决策树中。我们只需要添加一个额外的参数trials,表示在模型增强团队中使用的独立决策树的数量

所以 在创建credit_model的时候指定trials的属性就可以实现了。比如

credit_model<-C5.0(x = credit_train[-17],y = credit_train$default,costs = error_cost,trials = 6)

然后结果如下:

《R语言中基于C5.0的算法分析数据》

可以看出,结果极大地优化了,感觉是不是很棒呢?

附上处理数据:

数据来源:http://archive.ics.uci.edu/ml

链接: https://pan.baidu.com/s/1bpo6Ucv 密码: mhb3


点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注