R语言之决策树和随机森林

Python017

R语言之决策树和随机森林,第1张

R语言之决策树和随机森林

总结决策树之前先总结一下特征的生成和选择,因为决策树就是一种内嵌型的特征选择过程,它的特征选择和算法是融合在一起的,不需要额外的特征选择。

一、特征生成:

特征生成是指在收集数据之时原始数据就具有的数据特征,这些数据特征由收集的数据决定(其实也就是在产品定型时设定的需要收集的数据特征),当然,在数据预处理时,也可以在此基础上构造一些新的数据特征,这些特征越多越好,表示你考虑问题比较周全,具体那些变量有用或没用,这要交给下一步特征选择来决定。

二、特征选择

特征选择是指在原有数据特征的基础上,去除重要性比较低的特征变量,过滤出有用的特征变量。这里比较困难的是搞清楚什么样的特征比较重要?这需要根据具体的问题具体分析,有些变量的选择可以很直观的看出来,但这种直觉也不一定正确。对于常用特征选择方法主要有:过滤型、包装型、内嵌型。

过滤型:是指你可以根据某个统计量的大小排序来选择特征变量,如相关系数、p值、R值等

包装型:是指在一个特征集合中选取最优的特征子集。具体需要考虑:用什么样的算法来选取?选取的最优的标准是什么?

常用的算法是分步回归包括向前搜索、向后删除、双向搜索

向前搜索:每次选取一个能使模型预测或分类效果最好的特征变量进来,进来后不退出,直到模型改善效果不再明显;

向后删除:是指每次从特征全集中每次删除一个特征变量能使模型预测或分类效果最好,退出后不进来,直到模型改善效果不再明显;

双向搜索:是指每次每次删除一个特征变量或加入一个特征变量能使模型预测或分类效果最好,退出的不进来,进来的不退出,直到模型改善效果不再明显;

这里再提一下特征变量选择的几个标准:p值、R值、AIC(越小效果越好)、BIC(越小效果越好)、熵(越小效果越好)

内嵌型:这里应该主要就是像决策树这样的情况,算法内部完成特征变量的选取。

三、决策树

决策的几个要点:1、如何决策?(也就是如何树如何分叉)------熵和信息增益---这里面包含的就是特征的选择?哪个特征变量包含的信息量大,就排在前面,至于最后树的深度就决定特征变量的个数。

当然不同的算法使用的衡量的标准不同,还有:信息增益比、基尼不纯系数

2、如何剪枝?-----一般是事后剪枝

3、连续性变量如何离散化?-----阈值的选择

熵:是指信息的混合程度(混乱程度),熵【0-1】越大表示该集合中混合的信息越多,也就表明这次的分叉效果不好还是有很多不同类的信息混在一起

信息增益:熵值的减少量,越大越好

决策树模型特点:模型易于解释;存储空间较小,以树的形式存储,决策树是一个弱分类器,不能完全分类,需要把多个弱分类器通过多数投票法组合在一起。

四、R包实现决策树

library(rpart)

library(rpart.plot)

## rpart.control对树进行一些设置

## xval是10折交叉验证

## minsplit是最小分支节点数,这里指大于等于20,那么该节点会继续分划下去,否则停止

## minbucket:叶子节点最小样本数

## maxdepth:树的深度

## cp全称为complexity parameter,指某个点的复杂度,对每一步拆分,模型的拟合优度必须提高的程度

ct <- rpart.control(xval=10, minsplit=20, cp=0.1)

## kyphosis是rpart这个包自带的数据集

## na.action:缺失数据的处理办法,默认为删除因变量缺失的观测而保留自变量缺失的观测。

## method:树的末端数据类型选择相应的变量分割方法:

## 连续性method=“anova”,离散型method=“class”,计数型method=“poisson”,生存分析型method=“exp”

## parms用来设置三个参数:先验概率、损失矩阵、分类纯度的度量方法(gini和information)

## cost是损失矩阵,在剪枝的时候,叶子节点的加权误差与父节点的误差进行比较,考虑损失矩阵的时候,从将“减少-误差”调整为“减少-损失”

data("Kyphosis")

fit <- rpart(Kyphosis~Age + Number + Start,data=kyphosis, method="class",control=ct,parms = list(prior = c(0.65,0.35), split = "information"))

## 作图有2种方法

## 第一种:

par(mfrow=c(1,3))plot(fit)text(fit,use.n=T,all=T,cex=0.9)

## 第二种,这种会更漂亮一些:

rpart.plot(fit, branch=1, branch.type=2, type=1, extra=102,

shadow.col="gray", box.col="green",

border.col="blue", split.col="red",

split.cex=1.2, main="Kyphosis决策树")

## rpart包提供了复杂度损失修剪的修剪方法,printcp会告诉分裂到每一层,cp是多少,平均相对误差是多少

## 交叉验证的估计误差(“xerror”列),以及标准误差(“xstd”列),平均相对误差=xerror±xstd

printcp(fit)

## 通过上面的分析来确定cp的值

##调用CP(complexity parameter)与xerror的相关图,一种方法是寻找最小xerror点所对应

#的CP值,并由此CP值决定树的大小,另一种方法是利用1SE方法,寻找xerror+SE的最小点对应的CP值。

plotcp(fit)

##利用以下方法进行修剪:

## prune(fit, cp= fit$cptable[which.min(fit$cptable[,"xerror"]),"CP"])

fit2 <- prune(fit, cp=0.01)

#利用模型预测

ndata=data.frame(...)

predict(fit,newdata=ndata)

#案例

str(iris)

set.seed(1234)#设置随机数种子--使每次运行时产生的一组随机数相同,便于结果的重现

#抽样:从iris数据集中随机抽70%定义为训练数据集,30%为测试数据集(常用)

#这里是对行抽样,ind是一个只含1和2的向量

ind <- sample(2, nrow(iris), replace=TRUE, prob=c(0.7, 0.3))

trainData <- iris[ind==1,]

testData <- iris[ind==2,]

f<-Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

#训练数据

fit<-rpart(f,trainData)

#预测

re<-predict(fit,testData)

#******************或者用其他包********************

library(party)

#建立决策树模型预测花的种类

myFormula <- Species ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width

iris_ctree <- ctree(myFormula, data=trainData)

# 查看预测的结果

z<-table(predict(iris_ctree), trainData$Species)

#可以根据以上列联表求出预测的正确率---评估模型

#计算准确度

q<-sum(diag(z))/sum(z)

五、机器集成与随机森林法则

前面说过,决策树的一个特点是:弱分类器,分类不完全,需要利用集成投票的方式来增加精确度和稳健性。

机器集成算法:对于数据集训练多个模型,对于分类问题,可以采用投票的方法,选择票数最多的类别作为最终的类别,而对于回归问题,可以采用取均值的方法,取得的均值作为最终的结果。主要的集成算法有bagging和adaboost算法。

随机森林:随机森林就是利用机器集成多个决策树,主要有两个参数,一个是决策树的个数,一个是每棵树的特征变量个数。

随机森林特点:精确度高、稳健性好,但可解释性差。(可以知道各个变量的重要性)

R包实现机器集成算法:

#adabag包均有函数实现bagging和adaboost的分类建模

#利用全部数据建模

library(adabag)

a<-boosting(Species~.,data=iris)

z0<-table(iris[,5],predict(a,iris)$class)

#计算误差率

E0<-(sum(z0)-sum(diag(z0)))/sum(z0)

barplot(a$importance)

b<-errorevol(a,iris)#计算全体的误差演变

plot(b$error,type="l",main="AdaBoost error vs number of trees") #对误差演变进行画图

a<-bagging(Species~.,data=iris)

z0<-table(iris[,5],predict(a,iris)$class)

#计算误差率

E0<-(sum(z0)-sum(diag(z0)))/sum(z0)

barplot(a$importance)

b<-errorevol(a,iris)#计算全体的误差演变

plot(b$error,type="l",main="AdaBoost error vs number of trees") #对误差演变进行画图

#5折交叉验证

set.seed(1044) #设定随机种子

samp=c(sample(1:50,25),sample(51:100,25),sample(101:150,25)) #进行随机抽样

a=boosting(Species~.,data=iris[samp,]) #利用训练集建立adaboost分类模

z0<-table(iris[samp,5],predict(a,iris[samp,])$class)#训练集结果

z1<-table(iris[-samp,5],predict(a,iris[-samp,])$class)#测试集结果

E0<-(sum(z0)-sum(diag(z0)))/sum(z0)

E1<-(sum(z0)-sum(diag(z0)))/sum(z1)

a=bagging(Species~.,data=iris[samp,]) #利用训练集建立adaboost分类模

z0<-table(iris[samp,5],predict(a,iris[samp,])$class)#训练集结果

z1<-table(iris[-samp,5],predict(a,iris[-samp,])$class)#测试集结果

E0<-(sum(z0)-sum(diag(z0)))/sum(z0)

E1<-(sum(z0)-sum(diag(z0)))/sum(z1)

R包实现随机森林:

#随机森林法则

library(randomForest)

library(foreign)

data("iris")

#抽样数据

ind<-sample(2,nrow(iris),replace = TRUE,prob=c(0.7,0.3))

traning<-iris[ind==1,]

testing<-iris[ind==2,]

#训练数据

rf <- randomForest(Species ~ ., data=traning, ntree=100, proximity=TRUE)

#预测

table(predict(rf),traning$Species)

table(predict(rf,testing),testing$Species)

#查看预测的效果

print(rf)

plot(rf)

#查看重要性

importance(rf)

varImpPlot(rf)

计算机程序(英语:Computer

program),也称为软件(英语:software),简称程序(英语:Program)是指一组指示计算机或其他具有信息处理能力装置每一步动作的指令,通常用某种程序设计语言编写,运行于某种目标体系结构上。打个比方,一个程序就像一个用汉语(程序设计语言)写下的红烧肉菜谱(程序),用于指导懂汉语和烹饪手法的人(体系结构)来做这个菜。

工业编程语言:

A+

|

Ada

|

汇编语言|

B

|

Brainfuck

|

C

|

C++

|

C++/CLI|

Cg

|

COBOL

|

Eiffel

|

Erlang

|

FORTRAN

|

IronPython

|

Java

|

JRuby

|

Jython

|

LISP

|

Oberon

|

Objective-C|

Ocaml

|

Pascal

|

Perl

|

Powerbuilder

|

Python

|

QBASIC

|

R

|

REXX

|

Ruby

|

Self

|

Smalltalk

|

SQL

|

Tcl/Tk

|

Visual

Basic

|

PHP

|

C#

|

F#

|

J#

|

Visual

Basic

.NET

脚本编程语言:

ActionScript

|

JavaScript

|

JScript

|

Nuva

|

PostScript

|

VBScript

|

lua

学术编程语言:

APL/J

|

Haskell

|

Logo

|

ML

|

pascal|Prolog

|

Scheme

|

SAC

其他编程语言:

ALGOL

|

BASIC|

Clipper

|

Forth

|

Modula-2/Modula-3

|

MUMPS

|

PL/I

|

Simula

●程序设计的定义

程序设计=数据结构+算法

程序设计(Programming)是指设计、编制、调试程序的方法和过程。它是目标明确的智力活动。由于程序是软件的本体,软件的质量主要通过程序的质量来体现,在软件研究中,程序设计的工作非常重要,内容涉及到有关的基本概念、工具、方法以及方法学等。

按照结构性质,有结构化程序设计与非结构化程序设计之分。前者是指具有结构性的程序设计方法与过程。它具有由基本结构构成复杂结构的层次性,后者反之。按照用户的要求,有过程式程序设计与非过程式程序设计之分。前者是指使用过程式程序设计语言的程序设计,后者指非过程式程序设计语言的程序设计。按照程序设计的成分性质,有顺序程序设计、并发程序设计、并行程序设计、分布式程序设计之分。按照程序设计风格,有逻辑式程序设计、函数式程序设计、对象式程序设计之分。

程序设计的基本概念有程序、数据、子程序、子例程、协同例程、模块以及顺序性、并发性、并行性、和分布性等。程序是程序设计中最为基本的概念,子程序和协同例程都是为了便于进行程序设计而建立的程序设计基本单位,顺序性、并发性、并行性和分布性反映程序的内在特性。

程序设计规范是进行程序设计的具体规定。程序设计是软件开发工作的重要部分,而软件开发是工程性的工作,所以要有规范。语言影响程序设计的功效以及软件的可靠性、易读性和易维护性。专用程序为软件人员提供合适的环境,便于进行程序设计工作。

●程序设计语言(Programming Language)

是用于编写计算机程序的语言。语言的基础是一组记号和一组规则。根据规则由记号构成的记号串的总体就是语言。在程序设计语言中,这些记号串就是程序。程序设计语言包含三个方面,即语法、语义和语用。语法表示程序的结构或形式,亦即表示构成程序的各个记号之间的组合规则,但不涉及这些记号的特定含义,也不涉及使用者。语义表示程序的含义,亦即表示按照各种方法所表示的各个记号的特定含义,但也不涉及使用着,语用表示程序与使用的关系。

程序设计语言的基本成分有:①数据成分,用于描述程序所涉及的数据;②运算成分,用以描述程序中所包含的运算;③控制成分,用以描述程序中所包含的控制;④传输成分,用以表达程序中数据的传输。

程序设计语言程序设计 程序设计语言 计算机 IT按照语言级别可以分为低级语言和高级语言。低级语言有机器语言和汇编语言。低级语言与特定的机器有关、功效高,但使用复杂、繁琐、费时、易出差错。机器语言是表示成数码形式的机器基本指令集,或者是操作码经过符号化的基本指令集。汇编语言是机器语言中地址部分符号化的结果,或进一步包括宏构造。高级语言的表示方法要比低级语言更接近于待解问题的表示方法,其特点是在一定程度上与具体机器无关,易学、易用、易维护。

程序设计语言按照用户的要求有过程式语言和非过程式语言之分。过程式语言的主要特征是,用户可以指明一列可顺序执行的运算,以表示相应的计算过程,如FORTRAN、COBOL、PASCAL等。

按照应用范围,有通用语言与专用语言之分。如FORTRAN、COLBAL、PASCAL、C语言等都是通用语言。目标单一的语言称为专用语言,如APT等。

按照使用方式,有交互式语言和非交互式语言之分。具有反映人机交互作用的语言成分的语言成为交互式语言,如BASIC等。不反映人机交互作用的语言称为非交互式语言,如FORTRAN、COBOL、ALGOL69、PASCAL、C语言等都是非交互式语言。

按照成分性质,有顺序语言、并发语言和分布语言之分。只含顺序成分的语言称为顺序语言,如FORTRAN、C语言等。含有并发成分的语言称为并发语言,如PASCAL、Modula和Ada等。

程序设计语言是软件的重要方面,其发展趋势是模块化、简明化、形式化、并行化和可视化。

●常见的的程序设计语言

1、ActionScript

APL、

A+

J语言

Ada

汇编语言

AWK

Basic

Fortran

VBScript

Brainfuck

C语言

C++

C#

Clipper

COBOL

dBase

PASCAL

Delphi

Forth

FoxPro

F#

Fava

IDL

Java

JavaScript

J#

LISP

Lua

LOGO

Modula

Nuva

Perl

PHP

PL/I

Prolog

Python

R语言

Ruby

Scheme

Smalltalk

IceMaker

SQL

Tcl/Tk

Visual Basic

Visual FoxPro

XML