1、对象类属性的不同
首先,mode和typeof可以归为一个类别,class是另外一个类别。mode和typeof描述的是数据在内存中的存储类型;class描述的是对象的类属性,因为历史的原因更新过好多次,前身是S语言,所以R语言中数据对象的存储类型变化过好多次。
2、精确度的不同
mode和storage.mode得到的是一种比较古老的类型,来自于S语言,其中storage.mode比mode要更精确mode(3L)#numericstorage.mode(3L)#integertypeof是一种最新的查看类型的函数,针对于R语言而非S语言,而且更为精确,更为细致。
对于指定类属性的数据对象,class和oldClass的结果是一样的a=data.frame(1:10)oldClass(a)#"data.frame"class(a)#"data.frame"但是如果没有指定数据对象的类属性,那么oldClass返回NULL,而class会根据数据对象的存储类型(type)与维度属性来自动给出一个类属性。
3、表示方式的不同
mode:表示对象在内存中的存储类型,基本数据类型'atomic'mode:numeric(Integer/double),complex,character和logical,递归的对象(recursiveobject):'list'或'function'。
class:是一种抽象类型,或者理解为一种数据结构(数据框,因子,列表),他主要是用来给泛型函数(参考java中泛型的概念)识别参数用。所以当给函数传参数的时候如果发生错误,就查看class属性。
R语言中的几种数据结构一 R中对象的5种基本类型
字符(character)
整数 (integer)
复数(complex)
逻辑(logical:True/False)
数值(numeric:real numbers)
查看对象类型的命令:class(x)
二 R语言中有如下几种数据结构:
向量 vector() 组内元素必须类型一致,否则将会被强制转换。
(1) 创建向量的三种方式:
<span style="font-size:18px">x <- vector("numeric", length = 10)
x <- 1:4
x <- c("a",12,TRUE)</span>
(2) 强制转换的几个函数:
as.numeric(x) / as.character(x) / as.logical(x)
矩阵 matrix()一列一列的填充元素
按行合并:rbind()按列合并:cbind()
数组 array() 可以有多个维度
列表 list() 可以包含不同类型的元素
因子 factor()
(1) 分类数据/有序 vs. 无序
(2) 整数向量+标签(label)(优于整数向量)
Male/Female vs. 1/2
常用于lm(),glm()
(3) levels设置基线水平
table() 查看因子信息unclass() 去除因子属性日期
x <- Sys.Date() 得到系统当前日期
julian(x) x距离1970-01-01的天数
时间 POSIXct / POSIXlt
POSIXct:整数,常用于存入数据框 as.POSIXct()
POSIXlt:列表,还包含星期、年月日等信息。as.POSIXlt()
strptime(x, format = "...") 将一般格式转化为时间格式
基于R语言的分类算法之决策树ID3 《= 最大信息熵增益,只能处理离散型数据
C4.5 《= 信息增益率,可处理连续性和离散型数据,相比ID3,减少了因变量过多导致的过拟合
C5.0 《= 信息增益率,运算性能比C4.5更强大
CART 《= 基尼指数最小原则,连续性和离散型数据均可
信息熵体现的是数据的杂乱程度,信息越杂乱,信息熵越大,反之越小。 例如:拥有四种连续型变量的特征变量的信息熵一定比拥有三种的要大。
特征变量的N种可能性,每种可能性的概率相同,N越大,信息熵越大。
每种可能性的概率不同,越偏态,信息熵越小。
所有特征变量中,信息增益率的,就是根节点(root leaf),根节点一般是选择N越大的特征变量,因为N越大,信息熵越大。
信息增益率是在信息熵的基础上作惩罚计算,避免特征变量可能性多导致的高信息增益。
代码相关
library(C50)
C5.0(x,y, trials = 1, rules=FALSE,weights=NULL,control=C5.0Control(),costs=NULL)
x为特征变量,y为应变量
trials 为迭代次数(这个值根据不同数据而不同,并非越大越好,一般介于5-15之间,可以用遍历来寻找最高准确率的模型,对模型准确率的提升效果中等)
cost 为损失矩阵,R中应该传入一个矩阵(据说是对准确率矩阵约束猜测错误的项,但是并没特别明显的规律,可以使用遍历来寻找最好的cost,准确率提升效果小)
costs <- matrix(c(1,2,1,2),
ncol = 2, byrow = TRUE,
dimnames = list(c("yes","no"), c("yes","no")))
control 设置C5.0模型的其他参数,比如置信水平和节点最小样本等(水很深,参数很多,可以自行查阅R的帮助文档,我只设置了一个CF,准确率提升效果小)
control = C5.0Control(CF = 0.25)
library(C50)
#对iris随机划分训练集和测试集
set.seed(1234)
index <- sample(1:nrow(iris), size = 0.75*nrow(iris))
train <- iris[index,]
test <- iris[-index,]
#查看训练集和测试集分布是否合理
prop.table(table(train$Species))
prop.table(table(test$Species))
#不设置任何参数
fit1 <- C5.0(x = train[,1:4], y = train[,5])
pred1 <- predict(fit1, newdata = test[,-5])
freq1 <- table(pred1, test[,5])
accuracy <- sum(diag(freq1))/sum(freq1)
pred1setosa versicolor virginica
setosa 16 0 0
versicolor 0 13 1
virginica 0 0 8
准确率为0.9736842,只有一个错误。。。显然150个iris太少了,优化都省了。