r3.4.1的caret包中没有traincontrol函数,怎么回事

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了r3.4.1的caret包中没有traincontrol函数,怎么回事相关的知识,希望对你有一定的参考价值。

R语言实际上是函数的集合,用户可以使用base,stats等包中的基本函数,也可以自己编写函数完成一定的功能。但是初学者往往认为编写R函数十分困难,或者难以理解。这里对如何编写R函数进行简要的介绍。

函数是对一些程序语句的封装。换句话说,编写函数,可以减少人们对重复代码书写,从而让R脚本程序更为简洁,高效。同时也增加了可读性。一个函数往往完成一项特定的功能。例如,求标准差sd,求平均值,求生物多样性指数等。R数据分析,就是依靠调用各种函数来完成的。但是编写函数也不是轻而易举就能完成的,需要首先经过大量的编程训练。特别是对R中数据的类型,逻辑判别、下标、循环等内容有一定了解之后,才好开始编写函数。 对于初学者来说,最好的方法就是研究现有的R函数。因为R程序包都是开源的,所有代码可见。研究现有的R函数能够使编程水平迅速提高。

R函数无需首先声明变量的类型,大部分情况下不需要进行初始化。一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分。


    函数名称,即要编写的函数名称,这一名称就作为将来调用R函数的依据。

    2. 函数声明,包括 <- function, 即声明该对象的类型为函数。

    3. 函数参数,这里是输入的数据,函数参数是一个虚拟出来的一个对象。函数参数所等于的数据,就是在函数体内部将要处理的值,或者对应的数据类型。 函数体内部的程序语句进行数据处理,就是对参数的值进行处理 ,这种处理只在调用函数的时候才会发生。函数的参数可以有多种类型。R help的界面对每个函数,及其参数的意义及所需的数据类型都进行了说明。

    4. 函数体

    常常包括三部分.

    (1). 异常处理

    输入的数据不能满足函数计算的要求,或者类型不符, 这时候一定要设计相应的机制告诉用户,输入的数据在什么地方有错误。 错误又分为两种。

    第一种, 如果输入的数据错误不是很严重,可以经过转换,变为符合处理要求的数据时, 此时只需要给用户一个提醒,告知数据类型不符,但是函数本身已经 进行了相应的转换。

    第二种,数据完全不符合要求,这种情况下,就 要终止函数的运行,而告知因为什么,函数不能运行。这样,用户在 使用函数的情况先才不至于茫然。

    (2). 运算过程

    包括具体的运算步骤。 运算过程和该函数要完成的功能有关。

    R运算过程中,应该尽量减少循环的使用,特别是嵌套循环。R提供了 apply,replicate等一系列函数,来代替循环,应该尽量应用这些函数, 提高效率。 如果在R中实在太慢,那么核心部分只能依靠C或者Fortran 等语言编写,然后再用R调用这些编译好的模块,达到更高的效率。

    运算过程中,需要大量用到if等条件作为判别的标准。if和while都是需要数据TRUE/FALSE这样的逻辑类型变量,这就意味着,if内部,往往是对条件的判别,例如 is.na, is.matrix, is.numeric等等,或者对大小的比较,如,if(x > 0), if(x == 1), if(length(x)== 3)等等。if后面,如果是1行,则花括号可以省略,否则就必须要将所有的语句都放在花括号中。这和循环是一致的。

例子:

## if与条件判断

fun.test <- function(a, b, method = "add")

if(method == "add") ## 如果if或者for/while;

res <- a + b ## 等后面的语句只有一行,则无需使用花括号。

if(method == "subtract")

res <- a - b

return(res) ## 返回值

### 检验结果

fun.test(a = 10, b = 8, method = "add")

fun.test(a = 10, b = 8, method = "substract")

参考技术A R语言实际上是函数的集合,用户可以使用base,stats等包中的基本函数,也可以自己编写函数完成一定的功能。但是初学者往往认为编写R函数十分困难,或者难以理解。这里对如何编写R函数进行简要的介绍。
函数是对一些程序语句的封装。换句话说,编写函数,可以减少人们对重复代码书写,从而让R脚本程序更为简洁,高效。同时也增加了可读性。一个函数往往完成一项特定的功能。例如,求标准差sd,求平均值,求生物多样性指数等。R数据分析,就是依靠调用各种函数来完成的。但是编写函数也不是轻而易举就能完成的,需要首先经过大量的编程训练。特别是对R中数据的类型,逻辑判别、下标、循环等内容有一定了解之后,才好开始编写函数。
对于初学者来说,最好的方法就是研究现有的R函数。因为R程序包都是开源的,所有代码可见。研究现有的R函数能够使编程水平迅速提高。
R函数无需首先声明变量的类型,大部分情况下不需要进行初始化。一个完整的R函数,需要包括函数名称,函数声明,函数参数以及函数体几部分。
函数名称,即要编写的函数名称,这一名称就作为将来调用R函数的依据。
2.
函数声明,包括
<-
function,
即声明该对象的类型为函数。
3.
函数参数,这里是输入的数据,函数参数是一个虚拟出来的一个对象。函数参数所等于的数据,就是在函数体内部将要处理的值,或者对应的数据类型。
函数体内部的程序语句进行数据处理,就是对参数的值进行处理
,这种处理只在调用函数的时候才会发生。函数的参数可以有多种类型。R
help的界面对每个函数,及其参数的意义及所需的数据类型都进行了说明。
4.
函数体
常常包括三部分.
(1).
异常处理
输入的数据不能满足函数计算的要求,或者类型不符,
这时候一定要设计相应的机制告诉用户,输入的数据在什么地方有错误。
错误又分为两种。
第一种,
如果输入的数据错误不是很严重,可以经过转换,变为符合处理要求的数据时,
此时只需要给用户一个提醒,告知数据类型不符,但是函数本身已经
进行了相应的转换。
第二种,数据完全不符合要求,这种情况下,就
要终止函数的运行,而告知因为什么,函数不能运行。这样,用户在
使用函数的情况先才不至于茫然。
(2).
运算过程
包括具体的运算步骤。
运算过程和该函数要完成的功能有关。
R运算过程中,应该尽量减少循环的使用,特别是嵌套循环。R提供了
apply,replicate等一系列函数,来代替循环,应该尽量应用这些函数,
提高效率。
如果在R中实在太慢,那么核心部分只能依靠C或者Fortran
等语言编写,然后再用R调用这些编译好的模块,达到更高的效率。
运算过程中,需要大量用到if等条件作为判别的标准。if和while都是需要数据TRUE/FALSE这样的逻辑类型变量,这就意味着,if内部,往往是对条件的判别,例如
is.na,
is.matrix,
is.numeric等等,或者对大小的比较,如,if(x
>
0),
if(x
==
1),
if(length(x)==
3)等等。if后面,如果是1行,则花括号可以省略,否则就必须要将所有的语句都放在花括号中。这和循环是一致的。
例子:
##
if与条件判断
fun.test
<-
function(a,
b,
method
=
"add")
if(method
==
"add")

##
如果if或者for/while;
res
<-
a
+
b
##
等后面的语句只有一行,则无需使用花括号。

if(method
==
"subtract")
res
<-
a
-
b

return(res)
##
返回值

###
检验结果
fun.test(a
=
10,
b
=
8,
method
=
"add")
fun.test(a
=
10,
b
=
8,
method
=
"substract")

在 R 代码中使用“caret”包中的 preProcess 的目的是啥?

【中文标题】在 R 代码中使用“caret”包中的 preProcess 的目的是啥?【英文标题】:Which are the purposes of using preProcess from "caret" package in R code?在 R 代码中使用“caret”包中的 preProcess 的目的是什么? 【发布时间】:2020-07-09 03:06:21 【问题描述】:

“大家好。当我看到他们使用 K Nearest Network 对组进行分类时。我不知道他们为什么只使用 preProcess 来标准化数据。这是代码”

preProc <-  preProcess(UB2[3:12])
UBn <- predict(preProc, UB2)
set.seed(12)
UBKm <- kmeans(UBn[3:12], centers = 5, iter.max = 1000)

【问题讨论】:

【参考方案1】:

您使用 preProcess 来缩放和居中变量,基本上是为了让它们在相同的范围内。

在列具有不同范围的情况下,如果直接应用kmeans,它将主要形成集群,以最小化具有较高值的​​列的方差。

例如我们模拟三个可以在不同尺度的变量上分离的集群:

library(caret)
library(MASS)
library(rgl)
set.seed(111)

Sigma <- matrix(c(10,1,1,1,1,1,1,1),3,3)
X = rbind(mvrnorm(n=200,c(50,1,1), Sigma),
mvrnorm(n=200,c(20,5,1), Sigma),
mvrnorm(n=200,c(20,2.5,2.5), Sigma))
X = data.frame(X,cluster=factor(rep(1:3,each=200)))
plot3d(X[,1:3],col=factor(rep(1:3,each=200)))

并不是说 X1 在 0-60 的范围内,而 X2,X3 在 -1 到 10 左右..

如果我们在没有缩放的情况下做 kmeans:

clus = kmeans(X[,1:3],3)
COLS = heat.colors(3)
plot3d(X[,1:3],col=COLS[clus$cluster])

它主要尝试使用 X1 进行拆分,忽略 X2,X3 导致原始集群 1 中的拆分。

所以我们扩展和集群:

clus = kmeans(predict(preProcess(X[,1:3]),X[,1:3]),3)
COLS = heat.colors(3)
plot3d(X[,1:3],col=COLS[clus$cluster])

【讨论】:

非常详细的研究,让我手忙脚乱,谢谢

以上是关于r3.4.1的caret包中没有traincontrol函数,怎么回事的主要内容,如果未能解决你的问题,请参考以下文章

无法在 caret 包中为 extraTrees 模型指定概率函数

在 R 代码中使用“caret”包中的 preProcess 的目的是啥?

在 Caret 包中使用朴素贝叶斯分类器时的警告

“xgboost”官方包与 R 中“caret”包中的 xgboost 的不同结果

R语言:利用caret包中的dummyVars函数进行虚拟变量处理

R语言使用caret包中的createFolds函数对机器学习数据集进行交叉验证抽样返回的样本列表长度为k个