我遇到了对数据集进行分类的问题。
数据集是一个矩阵,其中行是观察值,列是特征。每个特征值介于0-1之间。数据集用于训练目的,并且由于我将要使用的方法对小变化敏感,因此数据集必须格式化为不敏感。
我的想法是,不是提供原始数据,而是根据数值将特征值分类到分档中,并提供中间值作为培训的训练数据。
实施例。 箱子是(1-2,2-3,3-4,4-5,5-6,6-7,7-8,8-9,9-10)
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
我不确定如何将这样的数据分类,并将其作为来自naiveBayes
的{{1}}的输入。我知道library("lattice")
能够将值四舍五入到给定的数字位数,从而“#34; bining it"”但我实际上无法确定二进制数。
Binning似乎是一种改进分类的方法。但是如何提供它作为输入,我不确定。
有关data.frame的更新
我想我忘了提及它,但数据存储在signif
中,我访问数据的方式是$ data。 data.frame都为每个观察提供标签,可以通过$ labels访问。
答案 0 :(得分:0)
嗯。这里的数据类型可能有些问题,因为matrix
类不适用于因子 - 并且分箱间隔最好用因子来描述。
为了进行分箱,您可以使用基本R安装中的cut
功能,例如:
> 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]
或者,使用左侧间隔:
> 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
。
答案 1 :(得分:0)
一个简单的解决方案可能是这样的:
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)
}))
导致结果:
> 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
不会将它们视为数字,而是将其视为分类变量。
> 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”。您可以解决此问题,将此行添加到函数中:
column[which(column == 0)] <- 0.5
希望它有所帮助。