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

来源:互联网 发布:淘宝双11打折 编辑:程序博客网 时间:2024/06/05 10:22

在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.dataDecision 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.WidthTime: 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的分类比较,如下:

              testpredict      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-57Weighted   0.9212 0.04432 20.79 5.743e-96

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

原创粉丝点击