【R的机器学习】机器学习概述和决策树

在CSDN开通博客将近四个月,深深的感觉到了自己四个月的进化,从基本的代码操作,到数据整合,到统计画图,再到网络提取和机器学习,有一种浅浅的成就感。

推荐两本书,第一本书偏向于通俗讲解,第二本书偏向于实例,分别是《机器学习与R语言》和《R语言与数据挖掘最佳实践和经典案例》,第一本书通俗易懂,适合没有基础的同学,比如我,第二本适合有了基础去进行案例分析的,可以先看第一本,然后在研究第二本。

机器学习这个概念很大,也很火,我眼中的机器学习其实很简单,说白了就是一种预测的手段;简单来说,基于很多散点进行一条直线的拟合,这也算是机器学习,因为有了线性关系,我们就可以做预测;当然模型有很多,也很复杂,但是基本原理大致如此。

决策树是我认为最好理解,而且很常用的机器学习模型,虽然他的准确率不高,但是它的变种随机森林是个很强大的模型,这里顺便说一下,有一种学习器是黑箱的,也就是说,我们无法得知有一个确切的公式来判定;举个例子,我们看身高和体重的关系,得出一个线性回归模型:

体重=身高*50

比如这个模型是从10万个人训练出来的,那么我们拿这个模型,理论上可以得出公式,然后应用其他所有已知身高的人求出他的体重。

然而针对一些算法,比如神经网络、随机森林来说,这个模型的公式过于复杂,需要一个很庞大的杂糅的公式,即使知道这个公式也无法判定每一个因素的具体影响,而且最关键的一点是,基于这个模型,变量间的关系是无法解释的,举个例子,在上面那个身高体重的公式中,我们可以直观的看到身高和体重成正比,但是现实过程中,如果有一个如下的模型:

y=ln[(x!+exp(x)+1/x)+x]

这个模型虽然不是特别复杂,但是对于x和y的关系无法解释,谁能说清楚为什么有这么多公式,而且针对很多高级函数来说,公式仅是数学上的意义,无法应用到现实,所以一般把这些模型称之为黑箱模型。

而决策树并不是一个黑箱模型,举个例子:

当我们看一个美女,我们看到她抽烟喝酒去夜店,基于我们的学习经验(新闻报纸网络)可能预测到她可能是一类爱玩的人;当我们又知道她天天炫富晒表,我们可能预测她是一个拜金的人;最后我们看到她其实是一个贫苦家庭中的单亲孩子,自己创业有成还要抚养父母,我们可能预测她是一个有能力有孝心的人;那么到此为止,如果我们最后的目的是判定你和这个女的在一起是否有被绿的风险,这些因素都考虑进去就要权衡下了,可能判断,她喝酒泡吧的频率,炫富的金额和自己创业收入的比较,孝顺父母的程度等,最后输出一个她是否可以绿了你,假设她一年去high一次,炫的东西远小于自己的收入,天天晚上陪妈妈吃饭,可能我们就判定她是一个靠谱的人,这就是一个简单的人做决策的过程,如果是机器学习,就是一个有监督的决策树。

网络上的决策树有很多,来一个图简单说明下
这里写图片描述
来源见水印

上述就是个非常简单的决策树,说到决策树,不得不提iris数据集,这个是几乎所有人都会看到的数据集,一般来说,简单的模型都会应用70%训练集,30%测试集,测试集来测试效果,先来看一段最简单的代码:

  1. 最简单决策树
library(C50)
str(iris)
random_order<-order(runif(nrow(iris)))
iris_train<-iris[random_order[1:105],]
iris_test<-iris[random_order[106:150],]
m<-C5.0(Species~.,data=iris_train,trials=1)
summary(m)

首先载入C50决策树包,然后随机把数据排序,并分成训练集和测试集,然后应用C50的建模看模型的summary。

Call:
C5.0.formula(formula = Species ~ ., data =
 iris_train, trials = 1)


C5.0 [Release 2.07 GPL Edition]     Wed Jun 28 11:01:16 2017
-------------------------------

Class specified by attribute `outcome'

Read 105 cases (5 attributes) from undefined.data

Decision tree:
Petal.Length <= 1.9: setosa (35)
Petal.Length > 1.9:
:...Petal.Width <= 1.6: versicolor (34/2)
    Petal.Width > 1.6: virginica (36/1)


Evaluation on training data (105 cases):

        Decision Tree   
      ----------------  
      Size      Errors  

         3    3( 2.9%)   <<


       (a)   (b)   (c)    <-classified as
      ----  ----  ----
        35                (a): class setosa
              32     1    (b): class versicolor
               2    35    (c): class virginica


    Attribute usage:

    100.00% Petal.Length
     66.67% Petal.Width


Time: 0.0 secs

主要看这段

Decision tree:
Petal.Length <= 1.9: setosa (35)
Petal.Length > 1.9:
:...Petal.Width <= 1.6: versicolor (34/2)
    Petal.Width > 1.6: virginica (36/1)

简单来说就是Petal.Length<=1.9 都被认定为setosa类,如果Petal.Length>1.9的基础上, Petal.Width <= 1.6,则是versicolor类,Petal.Width > 1.6是virginica类。

如果画图来看是这样

plot(m)

这里写图片描述

可以清晰的看到Petal.Length<=1.9 35个都是setosa,其他两个略有没有分干净的,但是概率都很小,从summary中可以看到:

Evaluation on training data (105 cases):

        Decision Tree   
      ----------------  
      Size      Errors  

         3    3( 2.9%)   <<


       (a)   (b)   (c)    <-classified as
      ----  ----  ----
        35                (a): class setosa
              32     1    (b): class versicolor
               2    35    (c): class virginica

看起来我们的模型很好,如果拿这个去预测test数据集的话,用到predict函数:

p<-predict(m,iris_test,type='class')
table(predict=p,test=iris_test$Species)

predict是基于模型,看下iris_test数据集的结果,这个结果就是每个预测变量是什么,然后table是按照这个变量和真正的test的分类比较,如下:

              test
predict      setosa versicolor virginica
  setosa         15          0         0
  versicolor      0         16         2
  virginica       0          1        11

纵坐标是预测值,可以看到这个基本上还算合理,如果更精细点用crosstable(gmodels包)看:

library(gmodels)
CrossTable(p,iris_test$Species,prop.chisq = F)
   Cell Contents
|-------------------------|
|                       N |
|           N / Row Total |
|           N / Col Total |
|         N / Table Total |
|-------------------------|


Total Observations in Table:  45 


             | iris_test$Species 
           p |     setosa | versicolor |  virginica |  Row Total | 
-------------|------------|------------|------------|------------|
      setosa |         15 |          0 |          0 |         15 | 
             |      1.000 |      0.000 |      0.000 |      0.333 | 
             |      1.000 |      0.000 |      0.000 |            | 
             |      0.333 |      0.000 |      0.000 |            | 
-------------|------------|------------|------------|------------|
  versicolor |          0 |         16 |          2 |         18 | 
             |      0.000 |      0.889 |      0.111 |      0.400 | 
             |      0.000 |      0.941 |      0.154 |            | 
             |      0.000 |      0.356 |      0.044 |            | 
-------------|------------|------------|------------|------------|
   virginica |          0 |          1 |         11 |         12 | 
             |      0.000 |      0.083 |      0.917 |      0.267 | 
             |      0.000 |      0.059 |      0.846 |            | 
             |      0.000 |      0.022 |      0.244 |            | 
-------------|------------|------------|------------|------------|
Column Total |         15 |         17 |         13 |         45 | 
             |      0.333 |      0.378 |      0.289 |            | 
-------------|------------|------------|------------|------------|

看到,真正准确的是对角线,一共45个观测指标,有42个准确;
在数字的第二行,可以看到setosa预测准确率是100%;预测的versicolor有18个,实际有16个,多预测了2个,预测的 virginica有12个,实际上有11个;

有个关于模型的评估指标:准确度和KAPPA值

准确度就是预测正确/所有,本例中就是42/45=93%

还有一个KAPPA统计量,KAPPA统计量就是如果我不学习,傻瓜式的随机判断的准确性有多少,其实学习了相当于在这个基础上提升,那么提升了多少;

也就是随机判断出来的概率,看个例子:

比如一共10个小球,8个红的,2个蓝的,模型预测结果:
预测红,结果红:7个
预测红,结果蓝: 1个
预测蓝,结果蓝:1个
预测蓝,结果红:1个

模型的准确度为7+1/10=80%

但是如果随机取,预测值和实际值相等的概率为:随机取到红球,并且红球中正好预测了红球,也就是80%*80%=64%,同理,篮球是20%*20%=4%

也就是说有68%的概率,随机取到模型这个情况

模型准确率和随机准确率的差,就是模型的优越性:80%-68%=12%

如果没有预测准确,就是1-64%-4%=32%

二者的比例定义为KAPPA值

R语言中vcd包可以计算KAPPA值

library(vcd)
Kappa(table(predict=p,test=iris_test$Species))
            value     ASE     z  Pr(>|z|)
Unweighted 0.8991 0.05619 16.00 1.278e-57
Weighted   0.9212 0.04432 20.79 5.743e-96

一般加权的kappa值对应非标准的划分数据,举个例子,比如我定义好,中,差,那么这三分类不是等价的,因为好-中的差距比好-差差距小,但是本例中是三个生物学分类,看unweighted就行,看到是0.8991,这个值已经非常高了,不过下一章看看是否有优化的空间

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值