【R的机器学习】决策树性能提升

来源:互联网 发布:linux vi新建文件 编辑:程序博客网 时间:2024/05/16 08:48

上一章用iris数据集进行了决策树分析,理论上来说,Kappa值是0.8991,已经非常高了,我们下面研究下方法,看看有没有什么优化空间。

首先看C5.0的函数参数

C5.0(x, y, trials = 1, rules= FALSE,      weights = NULL,      control = C5.0Control(),      costs = NULL, ...)
C5.0(y~x)

这个就是最常见的y对x建模,除了这个看下其他参数的含义:

trials:就是迭代次数,类似于又放回的抽样次数,R中的解释是:

trials  an integer specifying the number of boosting iterations. A value of one indicates that a single model is used.

是boosting iterations的次数,关于boosting算法,http://www.36dsj.com/archives/33135 这篇文章有所解释;下面主要是基于这篇文章进行我的理解:

C5.0默认的trials是1,也就是针对决策树进行增益的迭代;还记得决策树的原理么?

说白了,通俗理解就是每一层中,针对于一个最大的阈值(信息增益)进行分类,然后这样同样的原理进行到每一层,直到无法再进行分类为止。那么这个原始的决策树有个显而易见的问题,也就是有些值分的不是那么干净,但是我分一次,分完就是完了,没有回头路,也就是trials=1的情况。

而boosting iterations,如果理解没错的话,是基于boosting gradient算法,这个算法的特点是,针对于那些分类不正确的值,下次分类(是还有一次机会)进行重分类,在这个分类的时候,把这个值的权重稍微调大一点,这样就有机会调整整个模型。

举个例子,一个简单的决策树,比如:

|>5岁,智商>100,<5岁,智商<100;

但是总有一些神童不到5岁智商已经超过100了,但是简单决策树分完就是完了,在这个模型中我们有100个人:正确分类是90/100=90%

|>5岁,智商>100,60/50 |<5岁,智商<100,40/50;

但是我们看到确实结果有很多神童,那怎么办呢?

也就是针对这10个人,下次给他赋予更大的权重,比如,把这10个人看成20个人,再次分类,可能会优化整个决策树。

再看另一个重要的rules参数,rules有点像把整个决策树是否作为一个黑箱;因为如果rules=T的话,相当于把原本模型的参数x,用一套新的函数解释后输入,Wikipedia是这么说的:

https://en.wikipedia.org/wiki/Rule-based_modeling
Rule-based modeling is a modeling approach that uses a set of rules that indirectly specifies a mathematical model. The rule-set can either be translated into a model such as Markov chains or differential equations, or be treated using tools that directly work on the rule-set in place of a translated model, as the latter is typically much bigger.

如果是黑箱的话,我们是无法画出决策树模型的图的。

最后一个需要在决策树中注意的是一个winnow的参数,这个参数是针对那些无效类别进行去除,类似于解决过度拟合的问题,举个例子,还是刚才那个智商和年龄的关系,如果我们有两个变量影响智力,年龄>5岁,和体重;假设迭代的时候,体重会有一个正向的影响,但是这个值不是稳定值,也就是不是对大部分样本都适用,winnow会减掉这个特征,保证模型的不过度拟合。

那么这个参数在哪呢?

在C5.0包中,有个参数control:

control
a list of control parameters; see C5.0Control

那我们see下C5.0Control这个函数:

C5.0Control(subset = TRUE,             bands = 0,             winnow = FALSE,             noGlobalPruning = FALSE,             CF = 0.25,             minCases = 2,             fuzzyThreshold = FALSE,             sample = 0,             seed = sample.int(4096, size = 1) - 1L,              earlyStopping = TRUE,            label = "outcome")

里面的参数很多,里面就有个熟悉的winnow,还有其他的比如置信区间(CF),最小分支(mincases),随机种子(seed)等,我们主要用的就是winnow这个参数

既然了解了决策树的很多规则,下面可以尝试进行多次迭代的决策树,先不考虑winnow:

m2<-C5.0(Species~.,data=iris_train,trials=10,rules=T)p2<-predict(m2,iris_test,type='class')table(p2,iris_test$Species)

看到结果是:

p2           setosa versicolor virginica  setosa         15          0         0  versicolor      0         16         0  virginica       0          1        13

当trials=10,黑箱的时候,模型的准确率惊人的高,仅有一个判断失误。

如果进行winnow,反而不太准确:

ctrl <- C5.0Control(winnow=T)m2<-C5.0(Species~.,data=iris_train,trials=10,rules=T,control=ctrl)p2<-predict(m2,iris_test,type='class')table(p2,iris_test$Species)
p2           setosa versicolor virginica  setosa         15          0         0  versicolor      0         16         1  virginica       0          1        12

但是都要比之前的准确。

然而关于rules,winnow和trials三个参数,我们也只是实验,看准确率,那么有没有一个方法可以直接让我们对比出很多组合的三个来验证模型呢?

当然就是大名鼎鼎的caret包了

caret包中可以针对不同模型不同参数进行模拟,是个非常丰富的模型对比器:

library(caret)m3<-train(Species~.,data=iris_train,method='C5.0')m3

看到几个模型的对比:

C5.0 105 samples  4 predictor  3 classes: 'setosa', 'versicolor', 'virginica' No pre-processingResampling: Bootstrapped (25 reps) Summary of sample sizes: 105, 105, 105, 105, 105, 105, ... Resampling results across tuning parameters:  model  winnow  trials  Accuracy   Kappa      rules  FALSE    1      0.9452695  0.9163202  rules  FALSE   10      0.9415346  0.9105588  rules  FALSE   20      0.9432727  0.9133360  rules   TRUE    1      0.9405518  0.9092646  rules   TRUE   10      0.9375532  0.9047339  rules   TRUE   20      0.9356019  0.9017949  tree   FALSE    1      0.9452695  0.9163202  tree   FALSE   10      0.9404235  0.9088445  tree   FALSE   20      0.9410505  0.9099611  tree    TRUE    1      0.9405518  0.9092646  tree    TRUE   10      0.9375532  0.9047339  tree    TRUE   20      0.9356019  0.9017949Accuracy was used to select the optimal model using  the largest value.The final values used for the model were trials = 1, model = rules and winnow = FALSE.

看最后一段话,推荐的是:

trials = 1, model = rules and winnow = FALSE.

这个模型;这个模型的kappa值是0.92,准确度是95%,比我们上一章的0.8991的Kappa值,93%提高了一些,下一章我们用其他模型和决策树对比下,看有没有更好的优化空间

阅读全文
0 0
原创粉丝点击