C5.0算法是基于C4.5开发的新版本,它能适用于很多类型的问题,同神经网络、支持向量机等复杂算法相比,它几乎可以表现地一样优秀,并且更容易理解和部署。这里我们将用UCI机器学习网站http://archive.ics.uci.edu/ml/index.php上信贷信息数据集介绍该算法,并讨论该算法下的模型性能提升。(数据可点击打开链接下载)
该数据集包含了1000个信贷案例,一共有17个变量,其中default表示贷款申请者是否违约,从下图可以看出违约的人数占到了30%。
接下来我们将判定什么样的人最可能违约。
一、基础算法运作
首先,随机抽取训练集和测试集
>set.seed(111)
>train_sample<-sample(1000,900)
>credit_train<-credit[train_sample,]
>credit_test<-credit[-train_sample,]
查看测试集和训练集是否可以代表整体
训练集和测试机上default值的分布与整体趋近,故我们认为可以代表整体。
接着进行决策树运算
>library(C50)
>credit_model<-C5.0(credit_train[-17],credit_train$default) ##训练数据框要删除分类因子向量
得到的决策树包含57个决策,可用summary(credit_model)来查看。
接下来,用测试集来评估模型credit_model的性能
>credit_pred<-predict(credit_model,credit_test)
>table(credit_test$default,credit_pred)
可知,模型的准确预测率为74%,而错误率为26%;实际是非违约的,被预测为违约的有12个;实际是违约的,被预测为非违约的有14个(14%),这种情形会给银行带来的很大的损失。
二、性能提升
(1)引入代价矩阵
用上面的分析我们知道,当模型把违约的用户错误的划分为非违约用户所带来的损失要远大于把非违约用户划为违约用户。而C5.0算法允许我们将一个惩罚因子分配到不同类型的错误上。
因此,我们可以通过设定代价矩阵来指定每种错误相对于任何其它错误的严重程度。
>matrix_deminsions<-list(c("no","yes"),c("no","yes")) ##确定矩阵的维度
>names(matrix_deminsions)<-c("predicted","actual") ##命名矩阵的维度
>error_cost<-matrix(c(0,1,4,0),nrow=2,dimnames=matrix_deminsions) ##得到代价矩阵如下所示
引入代价矩阵的决策树算法
>credit_cost<-C5.0(credit_train[-17],credit_train$default,costs=error_cost)
>credit_cost_pred<-predict(credit_cost,credit_test)
尽管在这样情形下的预测准确率只有54%,但是将违约的用户识别为非违约用户的比例由之前的14%下降到了6%,而非违约用户识别为违约用户的比例则上升到40%,可以说这个模型是一个偏向于保守的模型。
(2)引入自适应增强算法
自适应增强算法是通过将很多能力较弱的学习算法组合在一起,使得这样的组合算法比任何单独的算法都强很多。在C5.0算法中,可以通过参数 trials,引入boosting算法,表示在模型中使用的独立决策树的数量。
>credit_boost10<-C5.0(credit_train[-17],credit_train$default,trials=10) ##以10个独立决策树组合为例
>credit_boost_pred10<-predict(credit_boost10,credit_test)
然而,好像并没有什么效果~~