首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中的数据集分类

R中的数据集分类
EN

Stack Overflow用户
提问于 2016-04-15 17:14:11
回答 2查看 393关注 0票数 0

我对数据集进行分类时遇到了问题。

dataset是一个矩阵,其中行是观察,列是特性。每个特征值介于0- 1之间。数据集用于培训目的,而且由于我将要使用的方法对小变化很敏感,所以数据集必须格式化为不敏感。

我的想法是,不提供原始数据,而是根据特征值的数值将特征值放入桶中,并提供bin的中间值作为培训数据。

例如。回收箱为(1-2,2-3,3-4,4-5,5-6,6-7,7-8,8-9,9-10)

代码语言:javascript
复制
dataset #original dataset
>         [,1] [,2] [,3] [,4] [,5]
[1,]    8.1    5.3   10    4.4    4.6
[2,]    5.2   10    3.2    9.3    3.5
[3,]    7.3    1.6    9    8.9    8.4
[4,]    6.4    2.8    8    6.5    9.3
[5,]   10    4.3    2.2    1.1    5.3

transformed_dataset #binned dataset


>         [,1] [,2] [,3] [,4] [,5]
[1,]    8.5    5.5   9.5   4.5    4.5
[2,]    5.5   9.5   3.5    9.5   3.5
[3,]    7.5    1.5   8.5    8.5    8.5
[4,]    6.5    2.5   8.5    6.5    9.5
[5,]    9.5    4.5  2.5    1.5    5.5

我不确定该如何将数据这样存储,并将其作为来自naiveBayeslibrary("lattice")的输入。我知道signif能够将值舍入给定的数位数,从而“弯曲它”,但我实际上无法确定回收箱的数目。

二进制化似乎是改进分类的一种方法。但是如何提供它作为一种投入,我还不确定。

关于data.frame的更新数据

我想我忘了提到它,但是数据存储在一个data.frame中,我访问数据的方式是通过$data。data.frame都为$labels可以访问的每个观察提供标签。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-04-15 17:41:14

嗯。这里的数据类型可能会有一些问题,因为matrix类不能很好地处理各种因素--而绑定间隔最好是通过各种因素来描述的。

为了执行绑定,您可以从基本R安装中使用cut函数,例如:

代码语言:javascript
复制
> data <- c(1,2,4,1,5,3,3,5,2,2,5,5,5,7,8,9,5,3,2,6,8,9,3,1)
> breaks <- c(0, 3, 6, 9)
> cut(data, breaks=breaks)
 [1] (0,3] (0,3] (3,6] (0,3] (3,6] (0,3] (0,3] (3,6] (0,3] (0,3] (3,6] (3,6]
 [13] (3,6] (6,9] (6,9] (6,9] (3,6] (0,3] (0,3] (3,6] (6,9] (6,9] (0,3] (0,3]
 Levels: (0,3] (3,6] (6,9]

或者,使用左间隔:

代码语言:javascript
复制
> cut(data, breaks=breaks, right=FALSE)
 [1] [0,3) [0,3) [3,6) [0,3) [3,6) [3,6) [3,6) [3,6) [0,3) [0,3) [3,6) [3,6)
[13] [3,6) [6,9) [6,9) <NA>  [3,6) [3,6) [0,3) [6,9) [6,9) <NA>  [3,6) [0,3)
Levels: [0,3) [3,6) [6,9)

请注意,您提供的中断应该涵盖整个数据集,否则您将得到一些NA

票数 0
EN

Stack Overflow用户

发布于 2016-04-15 18:12:29

一个简单的解决方案可以是这样的:

代码语言:javascript
复制
d <- matrix(c(8.1, 5.3, 10, 4.4, 4.6,
              5.2, 10, 3.2, 9.3, 3.5,
              7.3, 1.6, 9, 8.9, 8.4,
              6.4, 2.8, 8, 6.5, 9.3,
              10, 4.3, 2.2, 1.1, 5.3), nrow=5, ncol=5, byrow=TRUE)

d <- as.data.frame(apply(d, 2, function(column) {
  as.factor(round(column+0.5)-0.5)
}))

导致成果:

代码语言:javascript
复制
> d
   V1  V2  V3  V4  V5
1 8.5 5.5 9.5 4.5 4.5
2 5.5 9.5 3.5 9.5 3.5
3 7.5 1.5 9.5 8.5 8.5
4 6.5 2.5 7.5 6.5 9.5
5 9.5 4.5 2.5 1.5 5.5

转换后,数据集的列是因素,这意味着naiveBayes将不将它们视为数值,而将其视为分类变量。

代码语言:javascript
复制
> class(d[,1])
[1] "factor"
> levels(d[,1])
[1] "5.5" "6.5" "7.5" "8.5" "9.5"

注意,如果有任何等于0的值,那么添加和删除0.5的技巧就会失败--它将将其赋值为"0“而不是"0.5”。您可以解决它,将这一行添加到函数中:

代码语言:javascript
复制
column[which(column == 0)] <- 0.5

希望能帮上忙。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36653152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档